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:

VariantMain importWhat it does
ClientPineLabsOnlineClient from p3p-client-sdkCreates one-time payment tokens, handles 402, retries with P3P-Credential: Payment, and reads receipts.
ServerPineLabsOnlineP3P or decidePayment from p3p-server-sdkCreates 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

HelperUse
client.get/post/put/delete/patch/requestCall server endpoints with automatic 402 handling
client.methods.createToken / client.methods.create_tokenCreate a one-time payment token
PineLabsOnlineP3P.create(config).createMandate(...) / PineLabsOnlineP3P.create(config).create_mandate(...)Create UPI ReservePay payment capacity for a customer
decidePayment / decide_paymentFramework-agnostic route helper for challenge, verification, capture, and receipts
PineLabsOnlineP3P.create(config)Create a server SDK instance for lower-level control

Headers

HeaderDirectionMeaning
WWW-AuthenticateServer to clientCarries the unpaid request challenge with amount, resource, and expiry.
P3P-CredentialClient to serverCarries the payment credential on retry.
Payment-ReceiptServer to clientCarries receipt details after capture succeeds.

Protocol Objects

ObjectPurpose
MandateCustomer-approved payment capacity for the current UPI ReservePay rail.
ChallengeServer-signed payment requirement returned in WWW-Authenticate.
TokenShort-lived Pine Labs payment token created by the client SDK.
CredentialClient retry header: P3P-Credential: Payment <payload>.
CaptureServer-side debit request to Pine Labs P3P.
ReceiptServer response header: Payment-Receipt: Payment <payload>.

Resources

P3P Quickstart

Build your first paid endpoint end-to-end

View Docs →

P3P Overview

Protocol architecture and concepts

View Docs →
New chat
Responses are generated using AI and may contain mistakes.
Hi! I'm Pine, your AI developer assistant. Ask me anything about Pine Labs APIs, integrations, or troubleshooting.

Tip: you can create a new chat with + E