Skip to main content

Plural MPP Seller SDK — x402 Machine Payments Protocol server middleware (Python)

Project description

pinelabs-online-mpp-server-sdk (Python)

Python port of @pinelabs-online/mpp-server-sdk. x402 Machine Payments Protocol server-side SDK for monetising API endpoints.

Issues HTTP 402 challenges, verifies UPI SBMD credentials, captures payments, and returns receipts — works standalone or as Flask / FastAPI middleware.

Installation

pip install pinelabs-online-mpp-server-sdk[flask]     # with Flask support
pip install pinelabs-online-mpp-server-sdk[fastapi]   # with FastAPI support
# or from source
cd mpp-server-sdk-python
pip install -e '.[flask,fastapi]'

Requires Python ≥ 3.9. Core deps: httpx, PyJWT[crypto].

Quick Start

Flask

from flask import Flask, jsonify
from pinelabs-online_mpp_server import Amount, ChargeOptions, MppEnvironment, pinelabs-onlineserverConfig
from pinelabs-online_mpp_server.flask_mw import payment_required

app = Flask(__name__)
config = pinelabs-onlineserverConfig(
    clientId="…", clientSecret="…", challengeSecretKey="…",
    baseUrl=MppEnvironment.SANDBOX,
)

@app.get("/api/premium")
@payment_required(config, ChargeOptions(
    amount=Amount(value=50000, currency="INR"),
    resource="/api/premium",
))
def premium():
    return jsonify({"data": "premium content"})

FastAPI

from fastapi import FastAPI, Depends
from pinelabs-online_mpp_server import Amount, ChargeOptions, MppEnvironment, pinelabs-onlineserverConfig
from pinelabs-online_mpp_server.fastapi_mw import PaymentRequired

app = FastAPI()
config = pinelabs-onlineserverConfig(
    clientId="…", clientSecret="…", challengeSecretKey="…",
    baseUrl=MppEnvironment.SANDBOX,
)

require_payment = PaymentRequired(config, ChargeOptions(
    amount=Amount(value=50000, currency="INR"),
    resource="/api/premium",
))

@app.get("/api/premium", dependencies=[Depends(require_payment)])
async def premium():
    return {"data": "premium content"}

Generic (any framework)

from pinelabs-online_mpp_server import Amount, ChargeOptions, MppEnvironment, pinelabs-onlineserverConfig
from pinelabs-online_mpp_server.server.middleware import decide_payment

decision = decide_payment(
    authorization_header=request.headers.get("Authorization"),
    grantex_token_header=request.headers.get("X-Grantex-Token"),
    config=config,
    charge_options=ChargeOptions(
        amount=Amount(value=50000, currency="INR"),
        resource="/api/premium-data",
    ),
)

if decision.action != "proceed":
    # Build a 402/403 response from decision.problem_details + decision.headers
    ...
else:
    # Run business logic; attach decision.headers (Payment-Receipt) to your response
    ...

Configuration

pinelabs-onlineserverConfig(
    clientId="…", clientSecret="…", challengeSecretKey="…",
    realm="pinelabs-online MPP",
    baseUrl=MppEnvironment.SANDBOX,
    defaultChallengeExpirySeconds=300,
    requestTimeoutMs=30_000,
    maxRetries=3,
    initialRetryDelayMs=500,
    grantex=serverGrantexConfig(
        jwksUrl="https://grantex.dev/.well-known/jwks.json",
        requiredScopes=["mpp:payment:initiate"],
        enforceGrant=True,
    ),
)

API

pinelabs-onlineMPP.create(config)pinelabs-onlineMPPInstance

Method Description
generate_challenge(options) Create a signed 402 challenge
verify_credential(auth_header) Verify a Payment credential
capture(options) Capture a payment via pinelabs-online's API
build_receipt_header(result, challenge_id) Build Payment-Receipt header value
build_receipt_data(result, challenge_id) Build receipt data object
verify_grant_token(token) Verify a Grantex grant token (None when not configured)

Also exposed: ChallengeGenerator, CredentialVerifier, CaptureClient, GrantTokenVerifier, AuthManager, build_receipt_header, build_receipt_data, build_failure_receipt_data.

Error handling

from pinelabs-online_mpp_server import MppError, MppCaptureError, MppVerificationError

try:
    result = mpp.capture(options)
except MppCaptureError as err:
    print(err, err.capture_error and err.capture_error.http_status)
except MppError as err:
    print(err.code, err.http_status)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pinelabs_online_mpp_server_sdk-0.1.0.tar.gz (22.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pinelabs_online_mpp_server_sdk-0.1.0-py3-none-any.whl (29.5 kB view details)

Uploaded Python 3

File details

Details for the file pinelabs_online_mpp_server_sdk-0.1.0.tar.gz.

File metadata

File hashes

Hashes for pinelabs_online_mpp_server_sdk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ff301e3ec1acf9c6d3814373f0ac07d8c14f05b2d41188add48ad38b4b85c1e2
MD5 8ca19b31d465c65027c6353dc2f3acf1
BLAKE2b-256 9ab0fcbc21df93cd0c2e8ac4b35afbc0f145d846ea8d9f09bbea6acf6b08d6df

See more details on using hashes here.

File details

Details for the file pinelabs_online_mpp_server_sdk-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pinelabs_online_mpp_server_sdk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4b14ed4844f7305d709af48ca2fb1360e575269fbb48225b63a40bcb63e30d9e
MD5 118eeecc8ae1dd19728144ea35e9dc25
BLAKE2b-256 92547df6aaeb369fed473f415d2b571e49f096e8e5138761990e2140b83e7284

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page