Detailed API Index
Auth and base
Base URL: https://api.licensechain.app/v1
Header format: Authorization: Bearer <token> where token is either user JWT or app API key.
Products
GET /productslist seller-owned products with filters and paginationPOST /productscreate productGET /products/:idget one productPUT /products/:idupdate product (replace provided fields)PATCH /products/:idpartial update (same body rules as PUT)DELETE /products/:iddelete product (409 if linked licenses/subscriptions exist)
Create product payload
{
"name": "Pro Monthly",
"description": "Recurring access to premium feature set",
"price": 49.99,
"currency": "USD",
"active": true,
"successUrl": "https://merchant.example.com/pay/success",
"cancelUrl": "https://merchant.example.com/pay/cancel",
"helpUrl": "https://merchant.example.com/help",
"supportUrl": "https://merchant.example.com/support",
"termsUrl": "https://merchant.example.com/terms",
"privacyUrl": "https://merchant.example.com/privacy",
"refundUrl": "https://merchant.example.com/refund",
"productType": "subscription",
"billingType": "recurring",
"interval": "month",
"stripePriceIdRecurring": "price_1AbCdEfGhIjKlMn",
"stripeTaxEnabled": true,
"stripeIdentityRequired": false,
"cryptoPaymentsEnabled": true,
"hideEmail": false,
"autoRedirect": false
} Product response
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"userId": "user_123",
"name": "Pro Monthly",
"description": "Recurring access to premium feature set",
"price": 49.99,
"currency": "USD",
"active": true,
"successUrl": "https://merchant.example.com/pay/success",
"cancelUrl": "https://merchant.example.com/pay/cancel",
"helpUrl": "https://merchant.example.com/help",
"supportUrl": "https://merchant.example.com/support",
"termsUrl": "https://merchant.example.com/terms",
"privacyUrl": "https://merchant.example.com/privacy",
"refundUrl": "https://merchant.example.com/refund",
"productType": "subscription",
"billingType": "recurring",
"interval": "month",
"stripePriceIdRecurring": "price_1AbCdEfGhIjKlMn",
"stripeTaxEnabled": true,
"stripeIdentityRequired": false,
"cryptoPaymentsEnabled": true,
"hideEmail": false,
"autoRedirect": false,
"licenseEmails": [
"licenses-a@merchant.example.com",
"licenses-b@merchant.example.com"
],
"sendLicenseToCustomer": true,
"callbackSecret": "base64url_or_base64_secret_from_product_record",
"createdAt": "2026-05-11T07:00:00.000Z",
"updatedAt": "2026-05-11T07:00:00.000Z"
} Transactions
POST /transactionsbatched transaction details by ids/email/windowPOST /transaction/statusstatus for one transaction id
Status request
{
"transaction": "pi_3RxExample123"
} Status response
{
"status": 200,
"transactionStatus": "paid",
"transactionStatusReason": "Transaction successfully completed",
"info": "",
"transaction": {
"transactionId": "pi_3RxExample123",
"transactionStatus": "paid",
"statusReason": "Transaction successfully completed",
"licenseId": "lic_abc123",
"productId": "prod_8c9a1d74",
"amount": 49.99,
"currency": "USD",
"email": "buyer@example.com",
"timestamp": "2026-05-11T07:01:00.000Z",
"paymentProvider": "stripe"
}
} Licenses and verification
POST /licenses/verifypublic license verificationGET /licenses/jwksJWT verification keysPOST /licenses/introspectlive token introspectionPOST /licenses/revoke-tokenrevoke by jtiGET /apps/:appId/licensesandPOST /apps/:appId/licensesapp-scoped license CRUD
Verify request/response
{
"key": "LC-XXXXXX-XXXXXX-XXXXXX",
"hwuid": "optional-device-id"
} {
"valid": true,
"status": "ACTIVE",
"expiresAt": "2025-12-31T23:59:59Z",
"email": "user@example.com",
"verificationType": "custom",
"license_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImxpY2Vuc2VjaGFpbi0xIn0....signature",
"license_token_expires_at": "2024-01-01T01:00:00.000Z",
"license_jwks_uri": "https://api.licensechain.app/v1/licenses/jwks"
} Subscriptions
Seller-scoped subscription records linked to Pay/Stripe. Routes ship with the Core API repository; confirm availability on your deployment before integrating.
GET /subscriptionsโ list subscriptions (limit,offset,status,productId)POST /subscriptions/:id/cancelโ cancel an active subscription (emitssubscription.canceledvia Pay merchant webhooks when configured)
List response (example)
{
"subscriptions": [
{
"id": "sub_rec_001",
"productId": "550e8400-e29b-41d4-a716-446655440000",
"email": "buyer@example.com",
"status": "active",
"stripeSubscriptionId": "sub_1AbCdEfGhIjKlMn",
"currentPeriodEnd": "2026-06-11T07:00:00.000Z",
"createdAt": "2026-05-11T07:00:00.000Z"
}
],
"total": 1,
"limit": 20,
"offset": 0
} Cancel response (example)
{
"id": "sub_rec_001",
"status": "canceled",
"canceledAt": "2026-05-15T12:00:00.000Z"
} Orders
GET /ordersโ list paid/pending orders for the authenticated sellerGET /orders/:idโ order detail including license and transaction ids
List response (example)
{
"orders": [
{
"id": "ord_001",
"productId": "550e8400-e29b-41d4-a716-446655440000",
"email": "buyer@example.com",
"amount": 49.99,
"currency": "USD",
"status": "paid",
"paymentProvider": "stripe",
"transactionId": "pi_3RxExample123",
"createdAt": "2026-05-11T07:01:00.000Z"
}
],
"total": 1,
"limit": 20,
"offset": 0
} Detail response (example)
{
"id": "ord_001",
"productId": "550e8400-e29b-41d4-a716-446655440000",
"licenseId": "lic_abc123",
"email": "buyer@example.com",
"amount": 49.99,
"currency": "USD",
"status": "paid",
"paymentProvider": "stripe",
"transactionId": "pi_3RxExample123",
"createdAt": "2026-05-11T07:01:00.000Z",
"updatedAt": "2026-05-11T07:01:05.000Z"
} Disputes
GET /disputesโ list payment disputes (Stripe chargebacks)GET /disputes/:idโ dispute detail and evidence deadlines
List response (example)
{
"disputes": [
{
"id": "disp_001",
"orderId": "ord_001",
"status": "needs_response",
"amount": 49.99,
"currency": "USD",
"reason": "fraudulent",
"createdAt": "2026-05-12T08:00:00.000Z"
}
],
"total": 1,
"limit": 20,
"offset": 0
} Detail response (example)
{
"id": "disp_001",
"orderId": "ord_001",
"status": "needs_response",
"amount": 49.99,
"currency": "USD",
"reason": "fraudulent",
"evidenceDueBy": "2026-05-20T08:00:00.000Z",
"createdAt": "2026-05-12T08:00:00.000Z",
"updatedAt": "2026-05-12T08:05:00.000Z"
} LicenseChain Pay Mirror API
Hosted on https://pay.licensechain.app (not under /v1). Full guide:
Pay Mirror API.
POST /api/checkout/mirror/validateโ confirmlicense+emailafter redirectPOST /api/checkout/mirror/subscription/chargeโ charge Stripe subscription renewal (seller backend)
Validate response (verified)
{
"success": true,
"verified": true,
"status": "successful",
"purchase": {
"id": "lic_abc123",
"productId": "550e8400-e29b-41d4-a716-446655440000",
"createdAt": "2026-05-11T07:01:00.000Z",
"transactionId": "pi_3RxExample123"
}
} Subscription charge request
{
"subscription_id": "sub_1AbCdEfGhIjKlMn",
"amount": 49.99,
"currency": "USD",
"callback_secret": "your_product_callback_secret"
} Webhooks and analytics
Three signing models โ do not mix secrets: Webhook & callback signing models.
GET/POST /webhooks,GET/PUT/DELETE /webhooks/:id,POST /webhooks/:id/testโ Core API outbound webhooksGET /analytics/stats,/analytics/revenue,/analytics/licenses,/analytics/usersโ admin role only (403 for non-admin)POST /stripe/create-payment-intent,/stripe/confirm-payment,/stripe/webhook
Pay merchant events (payment.succeeded, subscription.canceled, etc.) use
x-lc-pay-signature โ see Callbacks & Webhooks (Pay).