GPT Pay Open API

GPT recharge Open API v1 integration guide

Platform-funded API and local redemption keys

These endpoints use the same API Key, credit wallet, and on-demand issuance flow. No customer card credentials are required, and no legacy card pool is used.

MethodPathPurpose
GET/api/v1/platform-recharge/quote?planCode=codex_point&country=PH&mode=self&creditQuantity=1000Total priceCredits, priceVersion, availability, and maximum account quantity
POST/api/v1/platform-recharge/ordersCreate with Idempotency-Key
GET/api/v1/platform-recharge/orders/{id}Read your order or batch; successful product orders include delivery credentials

Create a self recharge with planCode, country, mode:self, a Session object in session, and quote values in expectedUnitPriceCredits and expectedPriceVersion. Points also require creditQuantity. Points sale prices and initial card funding scale by units of 250; the fee reserve is once per order. Accepted orders retain original pricing/funding snapshots. Actual expense comes from confirmed USD card transactions and fees, not funding principal.

For Free-stock products use mode:product, quantity from 1 to 10, and no Session. Products support only five ordinary subscriptions; upgrades and points are rejected. Read each returned order ID for completed delivery credentials. Omitted platform country defaults to PH.

Existing local /api/redeem/check, /api/redeem/orders, and status flows support all nine plans for self-recharge keys and ordinary subscriptions only for product keys. Administrators fix points quantity and country on each batch; redeemers cannot override them. Local keys use on-demand cards and Direct recharge, not provider card_key products.

Quick start

  • Base URL: https://gptpay.tokenseek.app/api/v1
  • Format: JSON over HTTPS, UTF-8
  • API version: v1
  • API Key management: /settings/apikeys after signing in

API Keys never expire by default. You may instead choose 30, 90, 180, 365 days, or a custom expiration date. The full key is shown only once, so save it immediately and configure it as a server-side environment variable.

Plans, countries and compatibility

The shared catalog has nine exact provider codes: ordinary subscriptions go, plus, pro5, pro20, pro50; Plus upgrades pro5_up, pro20_up, pro50_up; and codex_point. There are no pro100, pro200, or pro500 price aliases. Upgrades require current Plus; Codex points require an existing subscription and reject Free accounts. Known ineligible Session plans are rejected before reserving credits, issuing a card, or consuming a key. Missing plan metadata is not treated as Free; the provider makes the final eligibility decision.

Points require numeric integer creditQuantity, from 250 to 250000 in multiples of 250. credit_quantity is accepted as an alias; both fields must agree when present. Other plans ignore quantity. Points orders expose the requested quantity, not a guessed account points balance. Own-card service fees remain per order; subscription cancellation is not_applicable for points. Replays must retain the original points quantity.

pro50_up targets the chatgptpromax subscription. Own-card country codes are Philippines PH, Egypt EG, Chile CL, United States US, and Japan JP. For a new order, omitted country defaults to CL only for pro50; all other plans, including pro50_up, default to PH. An explicit country takes precedence. Whitespace is trimmed and letters are uppercased; values outside the supported five countries, such as USD and EU, are rejected. Every enabled plan supports all five countries with the same service fees. Available plans are listed in the current account quote.

Existing programs may keep their endpoints, request fields and default response contract. By default, account plans contains all enabled plans except Go; default order responses do not add country fields.

Use ?view=extended on the same endpoints to opt into expanded responses:

EndpointExtended response
GET /api/v1/user?view=extendedIncludes enabled Go quotes and each plan's availableCountries, defaultCountry, and priceVersion; data.defaultCountry remains PH as a general fallback
POST /api/v1/gpt-recharge/orders?view=extendedAdds country to the order object
POST /api/v1/gpt-recharge/orders/status?view=extendedAdds country to found orders; not_found entries are unchanged

The view affects only response fields, not execution, pricing or idempotency. Use planCode and country on the existing create endpoint for Go and country selection. Prefer the selected plan's defaultCountry over the top-level fallback. Historical orders without a recorded country still return country:null in the extended view. Clients must recognize the plan codes they purchase or query.

API and self-service fees are identical for the same membership level and plan. Country selection does not change the service fee. successCredits and failureCredits are service fees, not the card's payment amount. Each order retains its fee snapshot.

Example extended quote item (illustrative fees and enabled countries):

{
  "planCode": "go",
  "successCredits": 80,
  "failureCredits": 20,
  "availableCountries": ["PH", "EG", "CL", "US", "JP"],
  "defaultCountry": "PH",
  "priceVersion": 1
}

Authentication

Send the complete API Key in every request:

X-API-Key: <your_api_key>

Never put a key in a URL, query string, request body, browser client, or log. Deleted, expired, or disabled keys stop working immediately.

Common response

Success response:

{
  "code": 0,
  "message": "success",
  "data": {},
  "requestId": "req_example"
}

Error response:

{
  "code": 40101,
  "message": "Invalid API Key",
  "data": null,
  "requestId": "req_example"
}

Check both the HTTP status and the response code. You may share the requestId with support when troubleshooting, but never share a full API Key, card, CVV, or Session.

Rate limits

EndpointPer minute10-second burst
Account600—
Create recharge order600100
Batch order status3000500

Limits are per API Key. An exceeded limit returns HTTP 429, code 42901, and Retry-After. Idempotent replays also count.

API endpoints

Get account

GET /api/v1/user
X-API-Key: <your_api_key>
curl "https://gptpay.tokenseek.app/api/v1/user" \
  -H "X-API-Key: <your_api_key>"

The response contains the current user, available and reserved Credits, level, enabled plan prices, key expiration, and the rate-limit policy:

{
  "code": 0,
  "message": "success",
  "data": {
    "user": { "id": "user_id", "email": "user@example.test" },
    "wallet": { "availableCredits": 10000, "reservedCredits": 0 },
    "level": { "code": "default", "name": "Default" },
    "plans": [
      {
        "planCode": "plus",
        "successCredits": 2000,
        "failureCredits": 100
      }
    ],
    "apiKey": {
      "expiresAt": null,
      "rateLimits": {
        "accountPerMinute": 600,
        "createPerMinute": 600,
        "createPer10Seconds": 100,
        "statusPerMinute": 3000,
        "statusPer10Seconds": 500
      }
    }
  },
  "requestId": "req_example"
}

Credits are integers. expiresAt is an ISO 8601 timestamp, or null for a permanent key.

Create a GPT recharge order

POST /api/v1/gpt-recharge/orders
X-API-Key: <your_api_key>
Idempotency-Key: client-order-001
Content-Type: application/json

Idempotency-Key is required, must be 8–128 characters, and is unique per user. Retry a network timeout with the same key and exactly the same business input.

Request body:

{
  "planCode": "plus",
  "cardNumber": "4242424242424242",
  "expMonth": 12,
  "expYear": 2028,
  "cvv": "123",
  "session": {
    "user": { "email": "user@example.test" },
    "account": { "id": "account_id" },
    "accessToken": "<access_token>"
  }
}
FieldTypeDescription
planCodestringgo, plus, pro5, pro20, pro50, pro5_up, pro20_up, pro50_up, or codex_point; must be enabled in the account quote
creditQuantitynumberRequired only for codex_point: integer 250–250000, multiple of 250; alias credit_quantity
countrystringOptional PH, EG, CL, US, or JP; new pro50 orders default to CL, all other plans to PH; must be in the plan's availableCountries
expectedPriceVersionintegerOptional quote priceVersion; a changed version rejects creation so the caller can confirm a fresh quote
cardNumberstringA 12–19 digit card number used only for this request
expMonthinteger1–12
expYearintegerA non-expired four-digit year
cvvstring3–4 digits, used only for this request
sessionobjectUser email, Account ID, and a valid unexpired Access Token

HTTP 201 means the order was created, 200 is an idempotent replay, and 202 means the order was accepted while its submission status is being confirmed.

{
  "code": 0,
  "message": "success",
  "data": {
    "id": "order_id",
    "orderNo": "GPT-EXAMPLE",
    "status": "processing",
    "settlementStatus": "reserved",
    "cancellationStatus": "waiting",
    "planCode": "plus",
    "reservedCredits": 2000,
    "chargedCredits": 0,
    "releasedCredits": 0,
    "targetEmail": "us***@example.test",
    "cardLast4": "4242",
    "failureReason": null,
    "createdAt": "2026-08-14T00:00:00.000Z",
    "updatedAt": "2026-08-14T00:00:00.000Z"
  },
  "requestId": "req_example"
}

Reusing an Idempotency-Key with different business input returns HTTP 409. It does not create another order, reserve Credits, or submit another recharge request.

When replaying an existing order, omitted country means that order's original country, regardless of the current plan default. Legacy orders without a recorded country use their original PH behavior for replay validation and retain country:null in storage and extended responses. Explicitly changing the country is a conflict; explicitly sending the original country is equivalent to omitting it. This also applies after a network timeout: reuse the original key instead of submitting a second payment.

Batch order status

POST /api/v1/gpt-recharge/orders/status
X-API-Key: <your_api_key>
Content-Type: application/json

Send 1–50 order IDs. Duplicate IDs are removed.

curl "https://gptpay.tokenseek.app/api/v1/gpt-recharge/orders/status" \
  -X POST \
  -H "X-API-Key: <your_api_key>" \
  -H "Content-Type: application/json" \
  -d '{"orderIds":["order_1","order_2"]}'
{
  "code": 0,
  "message": "success",
  "data": {
    "orders": [
      {
        "id": "order_1",
        "orderNo": "GPT-EXAMPLE",
        "status": "success",
        "settlementStatus": "settled",
        "cancellationStatus": "success",
        "planCode": "plus",
        "reservedCredits": 2000,
        "chargedCredits": 2000,
        "releasedCredits": 0,
        "targetEmail": "us***@example.test",
        "cardLast4": "4242",
        "failureReason": null,
        "createdAt": "2026-08-14T00:00:00.000Z",
        "updatedAt": "2026-08-14T00:01:00.000Z"
      },
      { "id": "order_2", "status": "not_found" }
    ]
  },
  "requestId": "req_example"
}

Orders that do not exist or belong to another user return not_found. No ownership information is disclosed.

Status values

Order status values:

  • created, submitting, processing: processing.
  • success: recharge completed successfully.
  • failed: final failure.
  • submission_unknown: the submission result cannot yet be confirmed.
  • manual_review: manual review is required.
  • not_found: used only in batch results for missing or unowned orders.

failureReason keeps its existing response field. For failed or manual_review, it preferentially contains the provider's full sanitized failure explanation, with line breaks preserved; when unavailable, the existing safe reason is returned. A successful order always returns null. Submission uncertainty uses the platform's reconciliation message. The displayed explanation does not decide fees, retry behavior, or card switching; render it as plain text.

Provider status pending_verification remains public processing. An upgrade is successful only after the target subscription is confirmed. Continue polling while verification is pending; do not submit another payment.

Settlement settlementStatus values are reserved, settled, and manual_review.

Automatic renewal cancellation cancellationStatus values are waiting, pending, success, failed, and manual_review.

Status queries return the latest order state persisted by the platform. Orders advance asynchronously in the background and do not depend on status requests; they continue running when clients stop polling, and polling more frequently does not accelerate processing.

Poll every 5 seconds during the first minute, then every 15 seconds. Stop after the order is final and cancellation is no longer waiting or pending.

HTTP errors

HTTPCodeMeaning
40040001Invalid request, card, or Session
40140101Missing, invalid, expired, or deleted API Key
40240201Insufficient Credits
40340301Account or service unavailable
40940901Idempotency conflict
40940902Target account already has an active task
41341301Body exceeds 120 KB
42942901Rate limit exceeded
50350301Service under maintenance or temporarily unavailable

Code examples

JavaScript

const response = await fetch(
  'https://gptpay.tokenseek.app/api/v1/gpt-recharge/orders',
  {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.GPT_PAY_API_KEY,
      'Idempotency-Key': crypto.randomUUID(),
    },
    body: JSON.stringify(orderInput),
  }
);
const result = await response.json();
if (!response.ok || result.code !== 0) throw new Error(result.message);

Python

import os
import requests

response = requests.post(
    "https://gptpay.tokenseek.app/api/v1/gpt-recharge/orders/status",
    headers={"X-API-Key": os.environ["GPT_PAY_API_KEY"]},
    json={"orderIds": ["order_1", "order_2"]},
    timeout=15,
)
result = response.json()
response.raise_for_status()
if result["code"] != 0:
    raise RuntimeError(result["message"])

Security and rotation

  • Store API Keys only in server-side secrets or environment variables.
  • Use a separate key per integrating system. Create and deploy a replacement before deleting the old key.
  • Never log request bodies because they contain card, CVV, and Session data.
  • Never send a full API Key, card, CVV, Session, or Token through messages or support tickets.
  • The bring-your-own-card API does not store full card numbers, CVV, Session JSON, or Access Tokens.

Go and country example

curl "https://gptpay.tokenseek.app/api/v1/gpt-recharge/orders?view=extended" \
  -X POST \
  -H "X-API-Key: <your_api_key>" \
  -H "Idempotency-Key: client-go-eg-001" \
  -H "Content-Type: application/json" \
  -d '{"planCode":"go","country":"EG","cardNumber":"4242424242424242","expMonth":12,"expYear":2032,"cvv":"123","session":{"user":{"email":"user@example.test"},"account":{"id":"account_id"},"accessToken":"<access_token>"}}'

Check plan availability first, then select a recharge country. Card and Session examples are placeholders. For a new Go order, omitted country and explicit PH are equivalent; for a new pro50 order, omitted country and explicit CL are equivalent. Reusing a key with an explicitly changed country, plan or other business input returns HTTP 409 without creating another order.

Creation acknowledges a local order; poll for the payment outcome. processing includes queueing, payment and verification waiting. Poll every 5 seconds during the first minute, then every 15 seconds. submission_unknown and manual_review need reconciliation: do not create another request with a new idempotency key. success and failed are payment terminal states. Renewal cancellation may update later; check again about one minute after success without submitting another recharge.

Card-key redemption endpoints

The redemption service is https://redeem.tokenseek.app. These JSON POST endpoints serve its same-origin redemption flow. They do not use the Open API key or response envelope. Errors use a non-success HTTP status and { "error": "message" }.

PathRequestSuccessful response
/api/redeem/check{ "code": "<card_key>" }Before redemption: inProgress:false, planCode, country, mode. Existing redemption: inProgress:true, statusToken
/api/redeem/orders{ "code": "<card_key>", "sessionJson": "<Session JSON string>" }{ "statusToken": "<status_token>" }; ready-made account keys do not need Session
/api/redeem/orders/status{ "statusToken": "<status_token>" }{ "order": { ... } } including plan, country and status
/api/redeem/orders/session{ "statusToken": "<status_token>", "sessionJson": "<new Session JSON string>" }{ "order": { ... } }; only eligible orders for the original account accept replacement Session
/api/redeem/orders/delivery{ "statusToken": "<status_token>" }Delivery data for a successful ready-made account order

Plan and country are fixed when keys are issued. A redeemer cannot change them. The create request needs no country; an explicit conflicting country returns HTTP 409. Repeating redemption restores the existing order. Checking the original key again may rotate statusToken; use the latest token and keep it out of logs and public URLs.

These are platform-issued keys. Self-recharge keys support all nine plans; product keys support only the five ordinary subscriptions. PH, EG, CL, US, and JP require the corresponding fulfillment configuration to be enabled by an administrator. The provider's separate orderType=card_key API is not exposed through these endpoints.