P3P Client and Server SDKs
Install and use Pine Labs P3P Client and Server SDKs for TypeScript and Python.
SDKs handle the protocol mechanics — challenges, tokens, retries, capture, and receipts — so your code stays focused on the business logic. Every HTTP interaction remains observable for debugging, but you never construct headers or manage token lifecycles manually.
Install SDK
Bash
# Client
npm i p3p-client-sdk
# Server
npm i p3p-server-sdk
Get TypeScript SDK from npm:
| Variant | Main import | What it does |
|---|---|---|
| Client | PineLabsOnlineClient from p3p-client-sdk | Creates one-time payment tokens, handles 402, retries with P3P-Credential: Payment, and reads receipts. |
| Server | PineLabsOnlineP3P or decidePayment from p3p-server-sdk | Creates mandates, prices routes, returns challenges, verifies credentials, captures payment, and returns Payment-Receipt. |
Client Paid Request Example
Ts
import {
P3PCustomerAuthMode,
P3PEnvironment,
PaymentMethod,
PineLabsOnlineClient
} from "p3p-client-sdk";
const client = PineLabsOnlineClient.create({
selectedPaymentMethod: PaymentMethod.RESERVE_PAY,
clientId: process.env.PINELABS_CLIENT_ID!,
clientSecret: process.env.PINELABS_CLIENT_SECRET!,
env: P3PEnvironment.SANDBOX,
});
const response = await client.get(
"https://server.example.com/api/weather",
{},
{
customerReference: "customer-ref-123",
mobileNumber: "9876543210"
}
);
Server Route Protection Example
Ts
import {
Amount,
ChargeOptions,
P3PEnvironment,
PaymentGateway,
PaymentMethod,
decidePayment
} from "p3p-server-sdk";
const decision = await decidePayment({
credentialHeader: request.headers.get("P3P-Credential") ?? undefined,
config: {
clientId: process.env.PINELABS_CLIENT_ID!,
clientSecret: process.env.PINELABS_CLIENT_SECRET!,
paymentGateway: PaymentGateway.PineLabsOnline,
availablePaymentMethods: [PaymentMethod.RESERVE_PAY],
env: P3PEnvironment.SANDBOX,
realm: P3PEnvironment.SANDBOX
},
chargeOptions: new ChargeOptions(new Amount(10000, "INR"), "/api/weather")
});
SDK Methods Reference
| Helper | Use |
|---|---|
client.get/post/put/delete/patch/request | Call server endpoints with automatic 402 handling |
client.methods.createToken / client.methods.create_token | Create a one-time payment token |
PineLabsOnlineP3P.create(config).createMandate(...) / PineLabsOnlineP3P.create(config).create_mandate(...) | Create UPI ReservePay payment capacity for a customer |
decidePayment / decide_payment | Framework-agnostic route helper for challenge, verification, capture, and receipts |
PineLabsOnlineP3P.create(config) | Create a server SDK instance for lower-level control |
Headers
| Header | Direction | Meaning |
|---|---|---|
WWW-Authenticate | Server to client | Carries the unpaid request challenge with amount, resource, and expiry. |
P3P-Credential | Client to server | Carries the payment credential on retry. |
Payment-Receipt | Server to client | Carries receipt details after capture succeeds. |
Protocol Objects
| Object | Purpose |
|---|---|
| Mandate | Customer-approved payment capacity for the current UPI ReservePay rail. |
| Challenge | Server-signed payment requirement returned in WWW-Authenticate. |
| Token | Short-lived Pine Labs payment token created by the client SDK. |
| Credential | Client retry header: P3P-Credential: Payment <payload>. |
| Capture | Server-side debit request to Pine Labs P3P. |
| Receipt | Server response header: Payment-Receipt: Payment <payload>. |
