Issue, deduct, refund and sell credits: checkout, subscriptions, saved cards, escrow and wallets.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your cred.diy API key
Optional URL of your app, recorded as signup attribution
Optional; the API key already identifies the project
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Apply a referral code for a referred user, issuing the configured credits to the referee and the referrer. credit_type_id picks the credit type's program (default: the project's default program). defer_referrer_credits pays only the referee now; the referral stays pending until complete_referral pays the referrer. A user can be referred once per program (without credit_type_id: in the default program); a credit_type_id retry with the same code replays (replayed: true): errors 400 ALREADY_REFERRED, SELF_REFERRAL, INVALID_REFERRAL_CODE, or program inactive. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
External user ID of the referred user
The referrer's code
Cred API key (optional if set via the x-api-key header)
Cred project ID (optional; the API key already identifies the project)
Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD
Credit type whose program pays
Hold the referrer's credits until complete_referral
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http cred https://eutdgemlrpvnxfkkpvlu.supabase.co/functions/v1/cred-mcp \ --header 'x-api-key: YOUR_X_API_KEY'
Headers
x-api-key (required): Your cred.diy API keyx-app-origin (optional, not in the config above): Optional URL of your app, recorded as signup attributionx-project-id (optional, not in the config above): Optional; the API key already identifies the projectApply a referral code for a referred user, issuing the configured credits to the referee and the referrer. credit_type_id picks the credit type's program (default: the project's default program). defer_referrer_credits pays only the referee now; the referral stays pending until complete_referral pays the referrer. A user can be referred once per program (without credit_type_id: in the default program); a credit_type_id retry with the same code replays (replayed: true): errors 400 ALREADY_REFERRED, SELF_REFERRAL, INVALID_REFERRAL_CODE, or program inactive. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID of the referred user |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| referral_code* | string | The referrer's code |
| credit_type_id | string | Credit type whose program pays |
| defer_referrer_credits | boolean | Hold the referrer's credits until complete_referral |
{
"type": "object",
"required": [
"user_id",
"referral_code"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID of the referred user"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"referral_code": {
"type": "string",
"description": "The referrer's code"
},
"credit_type_id": {
"type": "string",
"description": "Credit type whose program pays"
},
"defer_referrer_credits": {
"type": "boolean",
"description": "Hold the referrer's credits until complete_referral"
}
}
}Create or update up to 1000 users in one call (one CRD for the batch). Returns counts of created/updated and per-row errors; a bad row does not fail the batch. A row's own signup_url/signup_host overrides the request-level signup_url. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| users* | array | User rows |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| signup_url | string | Default signup URL for rows without their own |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"required": [
"users"
],
"properties": {
"users": {
"type": "array",
"items": {
"type": "object",
"required": [
"external_id"
],
"properties": {
"name": {
"type": "string"
},
"email": {
"type": "string"
},
"metadata": {
"type": "object",
"description": "stripe_account_id is Cred-only: a value you send is silently dropped"
},
"signup_url": {
"type": "string"
},
"external_id": {
"type": "string"
},
"signup_host": {
"type": "string"
},
"wallet_address": {
"type": "string"
},
"signup_credit_type_id": {
"type": "string"
}
}
},
"maxItems": 1000,
"description": "User rows"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"signup_url": {
"type": "string",
"description": "Default signup URL for rows without their own"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}MOVES MONEY: buy a project's credits by paying in stablecoin over x402. Call once without x402_payment to receive the payment requirements (returned as an error result containing the x402 PaymentRequired object), sign them with your wallet, then call again passing the base64 payment payload as x402_payment. Requires no API key — the payment is the credential — and costs no CRD.
| Argument | Type | Description |
|---|---|---|
| credits* | number | How many credits to buy (within the project's min/max) |
| buyer_id | string | Identifier to credit (defaults to your paying wallet address) |
| buyer_name | string | Display name for the buyer record |
| project_id* | string | Project selling the credits |
| buyer_email | string | Email to attach to the buyer record |
| x402_payment | string | Base64-encoded x402 PaymentPayload signed by your wallet |
| credit_type_id | string | Credit type to buy (defaults to the project's x402 credit type) |
{
"type": "object",
"required": [
"project_id",
"credits"
],
"properties": {
"credits": {
"type": "number",
"description": "How many credits to buy (within the project's min/max)",
"exclusiveMinimum": 0
},
"buyer_id": {
"type": "string",
"description": "Identifier to credit (defaults to your paying wallet address)"
},
"buyer_name": {
"type": "string",
"description": "Display name for the buyer record"
},
"project_id": {
"type": "string",
"description": "Project selling the credits"
},
"buyer_email": {
"type": "string",
"description": "Email to attach to the buyer record"
},
"x402_payment": {
"type": "string",
"description": "Base64-encoded x402 PaymentPayload signed by your wallet"
},
"credit_type_id": {
"type": "string",
"description": "Credit type to buy (defaults to the project's x402 credit type)"
}
}
}Cancel a subscription. By default it cancels at period end (credits already issued stay; no further renewals). at_period_end: false cancels immediately with no refund. With user_id/email instead of subscription_id, every live subscription of that customer is canceled. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | Customer email (alternative to subscription_id) | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | External user ID (alternative to subscription_id) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| at_period_end | boolean | Default true; false cancels now |
| subscription_id | string | Cred subscription ID or Stripe sub_… ID |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Customer email (alternative to subscription_id)"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID (alternative to subscription_id)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"at_period_end": {
"type": "boolean",
"description": "Default true; false cancels now"
},
"subscription_id": {
"type": "string",
"description": "Cred subscription ID or Stripe sub_… ID"
}
}
}Settle a hold (status captured). amount captures part (default: all); the uncaptured remainder returns to the holder. With to_user_id/to_user_email the captured credits go to that user (created if new) — marketplace/P2P settlement; otherwise they stay deducted (settled to the platform). 409 HOLD_NOT_ACTIVE if already settled, 400 CAPTURE_EXCEEDS_HELD. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| amount | number | Credits to capture (default: the full hold) |
| reason | string | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| hold_id* | string | Hold ID |
| metadata | object | |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| to_user_id | string | External ID of the recipient |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
MOVES MONEY: charge a user's saved card off-session for one pack of a one-time pricing tier and credit it. idempotency_key is required; a retry with the same key never charges twice and returns the first outcome (replayed: true). Outcomes: 200 status succeeded (credits, new_balance); 202 status processing (not yet settled — retry later with the SAME key to check, never a new key); 402 status failed with code/decline_code (requires_action: true means the buyer must pay through checkout instead). Other errors: 404 no_saved_payment_method, 409 saved_payment_method_unusable, 400 tier_not_one_time, 502 charge_not_started (retry with the same key). Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID of the card holder |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Credit type to grant. Required when the tier allows several types (400 CREDIT_TYPE_REQUIRED otherwise) |
| idempotency_key* |
Pay the referrer of a referral applied with defer_referrer_credits. user_id is the REFERRED user. Safe to repeat: the payout is keyed per referral; an already completed referral answers already_completed true. 404 NO_REFERRAL. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID of the referred user |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Credit type whose program the referral belongs to |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID of the referred user"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type whose program the referral belongs to"
}
}
}Create a Stripe Checkout link for an end user to buy credits; returns checkout_url and session_id. Nothing is charged until the buyer pays on that page; credits are issued when payment completes. Price either a pricing tier (pricing_tier_id, optionally × quantity) or a custom amount (credit_type_id + amount credits, priced at the credit type's exchange_rate). billing: "recurring" creates a subscription (tier required; billing_type recurring or both), credited on every paid invoice; otherwise it is a one-time purchase even on a recurring tier. save_payment_method: true (one-time only) keeps the card for charge_saved_card and auto top-up. success_url and cancel_url must be https on a Cred host or a domain listed under Dashboard → Payments → Allowed redirect domains; on any other domain the link is still created and silently redirects to Cred's default pages. Requires an sk_live_ API key. Not CRD-metered.
| Argument | Type | Description |
|---|---|---|
| amount | number | Custom-amount checkout: number of credits to sell |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| billing | string | Default one_time |
| user_id* | string | External user ID of the buyer (created if new) |
| quantity | integer | Tier packs (or seats for a subscription); default 1 |
| user_name | string | Buyer display name |
Reserve credits: deducts amount from an existing user and parks it in a hold (status held), returning hold_id. Finish with capture_escrow_hold or release_escrow_hold; a hold past expires_at can be released back at any time. Pass idempotency_key on anything an agent might retry: a replay returns the original hold (idempotent_replay: true, with its current status) and holds nothing more; the same key on a different request is 409 IDEMPOTENCY_KEY_REUSED. Without a key every call places another hold. Errors: 400 INSUFFICIENT_CREDITS, 404 USER_NOT_FOUND. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| amount* | number | Credits to hold |
| reason | string | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | External user ID of the holder |
| metadata | object | |
| expires_at | string | ISO timestamp after which the hold can be released back to the holder |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
Create a pricing tier. credits must be a positive integer; price (USD) must be 0 or at least 0.50, and at most $1.00 per credit. credit_type_ids lists the credit types a tier can be bought for; [] means every active credit type. Omit credit_type_ids for all types; malformed or foreign ids are rejected. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| name* | string | Tier name |
| price* | number | Price in dollars |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| credits* | integer | Credits granted per purchase |
| currency | string | Currency code (default USD) |
| is_popular | boolean | Highlight as popular |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| description | string | Tier description |
Create a short-lived Stripe customer portal URL for a subscriber to update their card (flow payment_method_update, default) or see invoices and card (overview). Mint it when the customer asks; don't store it. With user_id/email, uses their most recent subscription. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| flow | string | |
| string | Customer email (alternative to subscription_id) | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | External user ID (alternative to subscription_id) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| return_url | string | URL to return to from the portal; must be https on a Cred host or a domain listed under Dashboard → Payments → Allowed redirect domains, else 400 REDIRECT_NOT_ALLOWED |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| subscription_id |
Create an end user, or return/update the existing one (email-first lookup, then external_id, so no duplicates). Returns created: true for a new user. Signup attribution is first-touch and optional: signup_url (else the connection's x-app-origin header) is recorded on a new user, or on an existing user that has none. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| name | string | Display name |
| string | User email | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| metadata | object | Arbitrary metadata; stripe_account_id is Cred-only: a value you send is silently dropped |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| signup_url | string | App/page URL the user signed up from, e.g. https://app1.example.com/signup |
| external_id* | string | Your user ID |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
Deduct (spend) credits from an existing user, identified by user_email (checked first) or user_id. Fails with 400 INSUFFICIENT_CREDITS (nothing deducted) or 404 USER_NOT_FOUND. Pass idempotency_key on anything an agent might retry: a replay returns the original transaction with idempotent_replay: true and charges nothing more. Without a key, every call deducts again. auto_topup_triggered: true means the balance fell below the user's auto top-up threshold and a saved-card purchase started. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| amount* | number | Credits to deduct (positive) |
| reason | string | Reason, shown in the ledger |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | External user ID |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| user_email | string | User email (checked first) |
| reference_id | string | Your reference, e.g. a job ID (also lets refund_credits find it) |
| x402_payment |
Delete a user's auto top-up rule for credit_type_id, or ALL their rules when credit_type_id is omitted. Returns the number deleted. To pause instead, save_auto_topup with enabled: false. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID of the card holder |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Credit type UUID (omit to delete every rule for the user) |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID of the card holder"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type UUID (omit to delete every rule for the user)"
}
}
}Permanently delete a pricing tier by id (404 if not in this project). While auto top-up rules buy the tier it refuses with 409 TIER_IN_USE and the rule count; pass force: true (after the user confirms) to delete those rules and the tier together. Deactivating a tier (update_pricing_tier is_active: false) keeps history but makes its auto top-up charges fail. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| id* | string | Pricing tier ID |
| force | boolean | Also delete the auto top-up rules that buy this tier |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Pricing tier ID"
},
"force": {
"type": "boolean",
"description": "Also delete the auto top-up rules that buy this tier"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Remove a user's saved card (detached in Stripe). charge_saved_card and auto top-up stop working for them until a new card is saved. Returns deleted: false if there was none. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID of the card holder |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID of the card holder"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Delete an end user, identified by user_email (checked first) or external_id. Irreversible: balances, ledger and auto top-up rules go with them. A user with swap history is kept as a financial record — 409 USER_HAS_HISTORY (swap_transactions count). 404 USER_NOT_FOUND. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| user_email | string | Email of the user to delete |
| external_id | string | External ID of the user to delete |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"user_email": {
"type": "string",
"description": "Email of the user to delete"
},
"external_id": {
"type": "string",
"description": "External ID of the user to delete"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Swap a user's credits along a swap pair: deducts source_amount of the source type and credits the converted amount (after fee) in the target type. Errors: 400 INSUFFICIENT_CREDITS, 404 USER_NOT_FOUND, 400 outside min/max. On a bidirectional pair, direction "reverse" spends the target type for the source type at 1/rate (else 400 SWAP_NOT_BIDIRECTIONAL). Pass an idempotency_key so a retry replays the original swap (idempotent_replay: true); the same key on a different request is 409 IDEMPOTENCY_KEY_REUSED. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | External user ID |
| direction | string | Default forward |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| user_email | string | User email (alternative) |
| swap_pair_id* | string | Swap pair ID |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
Get a user's referral code, generating one if they have none (creates the user if needed). Safe to repeat. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Get a user's auto top-up rule for credit_type_id (auto_topup, or null), or all their rules (auto_topups) when credit_type_id is omitted, plus their saved card. Rules show threshold, enabled, max_per_day, charges_last_24h, last_status/last_error and disabled_reason (set when cred turned a failing rule off). Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID of the card holder |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Credit type UUID |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID of the card holder"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type UUID"
}
}
}Get a user's credit balance(s). Identify the user by email (checked first) or user_id (your external user ID). An unknown user returns an empty balances array, not an error. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | User email (checked first) | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | External user ID (fallback) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Only this credit type |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "User email (checked first)"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID (fallback)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Only this credit type"
}
}
}Get a referral program's settings (is_active, referrer/referee credits, credit type). A project can run one program per credit type: pass credit_type_id for that credit type's program (settings null when it has none); omit it for the project's default program. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Credit type whose program to read |
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type whose program to read"
}
}
}Get the card saved for a user (brand, last4, expiry), or payment_method: null if none. Cards are saved by a one-time create_checkout_session with save_payment_method: true. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID of the card holder |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID of the card holder"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Signup attribution breakdown per signup_host (which of your apps users came from): users, purchases and revenue per host over the last `days` (default 30; 0 = all time). Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| days | number | Look-back window in days (default 30, 0 = all time) |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"properties": {
"days": {
"type": "number",
"minimum": 0,
"description": "Look-back window in days (default 30, 0 = all time)"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}List ledger transactions, newest first (types include issue, deduct, refund). Filter by user (email or user_id) and credit_type_id; paginate with limit/offset. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | Filter by user email | |
| limit | number | Results per page (max 100, default 50) |
| offset | number | Pagination offset (default 0) |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | Filter by external user ID |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Filter by credit type |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Filter by user email"
},
"limit": {
"type": "number",
"description": "Results per page (max 100, default 50)"
},
"offset": {
"type": "number",
"description": "Pagination offset (default 0)"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "Filter by external user ID"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Filter by credit type"
}
}
}Read the EVM address on file for an end user, and whether the holder proved it by signature (verified, verified_at). Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | User email (checked first) | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| external_id | string | External user ID |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "User email (checked first)"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"external_id": {
"type": "string",
"description": "External user ID"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Look up one end user by email or external_id (404 USER_NOT_FOUND if absent), or list users newest first with total, filterable by signup_host / signup_credit_type_id. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | Look up by email | |
| limit | number | Results per page (max 1000, default 100) |
| offset | number | Pagination offset (default 0) |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| external_id | string | Look up by external ID |
| signup_host | string | List only users who signed up from this host, e.g. app1.example.com |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| signup_credit_type_id |
Issue (add) credits to a user; creates the user if they don't exist (email-first lookup). Pass idempotency_key on anything an agent might retry: a replay returns the original transaction with idempotent_replay: true and issues nothing more (no second webhook or mint). Without a key, every call issues again. For on-chain credit types with mint_on_issue, the response includes on_chain mint status. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| amount* | number | Credits to issue (positive) |
| reason | string | Reason, shown in the ledger |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id* | string | External user ID |
| user_name | string | Display name for a new user |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| signup_url | string | App/page URL a new user signed up from (first-touch attribution) |
| user_email | string |
List the project's active credit types: id, name, symbol, description, exchange_rate (USD per credit), is_redeemable, and on-chain fields (is_on_chain, blockchain, contract_address, chain_id, token_decimals, mint_on_issue, deployment_type). Use the id as credit_type_id in other tools. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}List on-chain token deposits observed for the project, newest first (read-only; the chain ingest writes them). status: credited (credits granted), unattributed (sent from an address no user had; held, not credited, and attaching the address with set_user_wallet only matches later deposits), observed (awaiting processing) or rejected. A user filter for an unknown user is 404 USER_NOT_FOUND. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | Filter by user email | |
| limit | number | Results per page (max 200, default 50) |
| offset | number | Pagination offset |
| status | string | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | Filter by external user ID |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
List escrow holds, newest first, with total. Filter by status, holder or reference_id. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | Holder email | |
| limit | number | Max 100, default 50 |
| offset | number | |
| status | string | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | Holder external ID |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| reference_id | string | |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
List active pricing tiers (credit packs), cheapest first; price is a dollar string. credit_type_ids lists the credit types a tier can be bought for; [] means every active credit type. The credit_type_id filter returns every tier purchasable for that type: tiers scoped to it plus tiers with [] (400 if it is not a UUID). Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Credit type UUID: tiers scoped to it plus all-type tiers |
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type UUID: tiers scoped to it plus all-type tiers"
}
}
}List the project's referrals, filterable by status, referrer or credit type (program). Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| limit | number | Results per page (max 100, default 50) |
| offset | number | Pagination offset |
| status | string | Filter by status |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Only this credit type's program |
| referrer_email | string | Filter by referrer email |
| referrer_user_id | string | Filter by referrer external ID |
List recurring credit subscriptions (newest 100): status, credits_per_period, quantity, price, interval, current_period_end, cancel_at_period_end. status: "active" matches active, trialing and past_due. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | Filter by customer email | |
| status | string | active (live states) or an exact Stripe status, e.g. canceled |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | Filter by external user ID |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Filter by customer email"
},
"status": {
"type": "string",
"description": "active (live states) or an exact Stripe status, e.g. canceled"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "Filter by external user ID"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}List credit swap pairs (exchange_rate, fee_percent, min/max_swap_amount, is_bidirectional). Optionally filter by source or target credit type. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| include_inactive | boolean | Include inactive pairs |
| source_credit_type_id | string | Filter by source credit type |
| target_credit_type_id | string | Filter by target credit type |
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"include_inactive": {
"type": "boolean",
"description": "Include inactive pairs"
},
"source_credit_type_id": {
"type": "string",
"description": "Filter by source credit type"
},
"target_credit_type_id": {
"type": "string",
"description": "Filter by target credit type"
}
}
}List this project's x402 stablecoin payments, newest first: kind, status, payer, amount_usd, transaction_hash, credits_granted, error. Authenticated (API key). Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max 200, default 50 |
| status | string | Filter by status, settled, pending or failed |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max 200, default 50"
},
"status": {
"type": "string",
"description": "Filter by status, settled, pending or failed"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Create (or reuse) a Stripe Express connected account for an end user and return an onboarding URL for them to complete. The resulting stripe_account_id (acct_…) is stored on the user; pass it as destination to redeem_credits. return_url and refresh_url must be https on a Cred host or a domain listed under Dashboard → Payments → Allowed redirect domains, else 400 REDIRECT_NOT_ALLOWED. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| country | string | ISO country code for the account (default US) |
| user_id | string | External user ID |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| return_url* | string | Where Stripe sends the user after onboarding |
| user_email | string | User email (alternative) |
| refresh_url* | string | Where Stripe sends the user if the link expired |
| x402_payment |
MOVES MONEY: cash out a user's credits as a Stripe transfer to a connected account. Deducts `amount` credits and pays amount × the credit type's exchange_rate (USD per credit; the rate cannot be overridden). The credit type must be redeemable (else 400 NOT_REDEEMABLE). destination must be this user's own account from onboard_payout_account (else 400 INVALID_DESTINATION). Pass idempotency_key: a retry with the same key returns the first result (idempotent_replay: true) and never deducts or pays twice; without one, reference_id is the key, and with neither every call redeems again. 502 PAYOUT_PENDING means Stripe's answer was lost: retry with the SAME key (idempotency_key in the error) to finish it — if nobody retries, the reconciliation sweep settles it after ~15 minutes (paid, or credits returned only if Stripe definitely refused); a claim it cannot settle safely is flagged for manual review. Errors: 400 INSUFFICIENT_CREDITS, 400 PAYOUT_TOO_SMALL, 404 USER_NOT_FOUND, 402 STRIPE_TRANSFER_FAILED (credits restored), 409 IDEMPOTENCY_KEY_REUSED. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| amount* | number | Credits to redeem |
| reason | string | Reason, shown on the transfer and ledger |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | External user ID |
| currency | string | Payout currency (default usd) |
Refund or reverse credits. MOVES MONEY for purchases: with purchase_id or stripe_payment_intent_id it refunds the Stripe charge (prorated when partial; refund_payment: false skips the money) and claws the purchased credits back. With transaction_id (or reference_id = latest matching transaction) it reverses that ledger entry: an issue is clawed back, a deduct is returned to the user. Pass exactly one source. amount refunds part (default: all). idempotency_key is required here: retry with the same key to get the first result (idempotent_replay: true). Errors: 404 PURCHASE_NOT_FOUND / TRANSACTION_NOT_FOUND, 409 ALREADY_REFUNDED, 400 REFUND_EXCEEDS_ORIGINAL, 400 INSUFFICIENT_CREDITS (user already spent them), 400 NOT_REFUNDABLE (redeem/escrow entries), 402 STRIPE_REFUND_FAILED (no credits changed). Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| amount | number | Credits to refund (default: the full original amount) |
| reason | string | Reason, shown in the ledger |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| metadata | object | Extra metadata stored on the refund transaction |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| purchase_id | string | Cred purchase ID (refunds the payment + credits) |
Release a held hold in full back to its holder (status released). 404 HOLD_NOT_FOUND, 409 HOLD_NOT_ACTIVE if it was already released, captured or expired — so a retry after success is rejected, not repeated. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| reason | string | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| hold_id* | string | Hold ID |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"required": [
"hold_id"
],
"properties": {
"reason": {
"type": "string"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"hold_id": {
"type": "string",
"description": "Hold ID"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Step 1 of proving an end user controls an address: get a single-use message for them to sign. The message names the operator's project and must be shown to the user unmodified. Expires in ten minutes. Then call verify_wallet_signature with the nonce and the signature their wallet produces. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| address* | string | The EVM address the user is claiming |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| user_email | string | User email (checked first) |
| external_id | string | External user ID |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "The EVM address the user is claiming"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"user_email": {
"type": "string",
"description": "User email (checked first)"
},
"external_id": {
"type": "string",
"description": "External user ID"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}Create or replace the auto top-up rule for (user, credit type): whenever a deduct leaves the balance below threshold, cred buys one pack of pricing_tier_id on the user's saved card (at most max_per_day charges per 24h). If enabled and the balance is already below threshold, a charge starts right away. Saving also clears a rule cred disabled after failures. Requires a saved card to charge (a warning is returned if none); the tier must not be recurring-only. 404 USER_NOT_FOUND if the user does not exist. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| enabled | boolean | Default true |
| user_id* | string | External user ID of the card holder |
| threshold* | number | Top up when the balance falls below this |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| max_per_day | integer | Charge cap per rolling 24h (default 5) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
Create or update a referral program: credits awarded to the referrer and to the referred user. With credit_type_id this writes THAT credit type's program (creating it if needed); without it, the project's default program. Only fields you pass change. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| is_active | boolean | Enable/disable the program |
| is_default | boolean | true makes this program the default — the one requests without credit_type_id use (only true is accepted) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Credit type whose program to write (and award) |
| referee_credits | number | Credits for the referred user |
| referrer_credits |
Attach an EVM address to an end user so on-chain credits mint to them. No signature required — the address is recorded as asserted by the operator, not proved (changing it clears any earlier verification). Only later deposits match it: a deposit already recorded as unattributed stays uncredited. Pass wallet_address as null to detach; balances are unaffected. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| user_email | string | User email (checked first) |
| external_id | string | External user ID |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| wallet_address* | string | null | 0x-prefixed 40-hex-character EVM address, or null to detach |
{
"type": "object",
"required": [
"wallet_address"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"user_email": {
"type": "string",
"description": "User email (checked first)"
},
"external_id": {
"type": "string",
"description": "External user ID"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"wallet_address": {
"type": [
"string",
"null"
],
"description": "0x-prefixed 40-hex-character EVM address, or null to detach"
}
}
}Update a pricing tier by id; only fields you pass change (same price rules as create). Pass credit_type_ids to re-scope it ([] = all credit types), is_active: false to stop selling it without deleting. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| id* | string | Pricing tier ID |
| name | string | |
| price | number | Price in dollars |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| credits | integer | |
| currency | string | |
| is_active | boolean | Whether the tier can be purchased |
| is_popular | boolean | |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| description |
Change a live subscription's quantity (seats/packs, 1–10000). CHANGES FUTURE BILLING: from the next renewal the customer pays unit price × quantity and receives unit credits × quantity; no proration now. With user_id/email the customer must have exactly one live subscription (else 409 — pass subscription_id). Same quantity is a no-op. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| string | Customer email (alternative to subscription_id) | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| user_id | string | External user ID (alternative to subscription_id) |
| quantity* | integer | New quantity |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| subscription_id | string | Cred subscription ID or Stripe sub_… ID |
Update an existing end user (identify by user_email, checked first, or external_id). Only fields you pass change (none at all is 400 NO_FIELDS_TO_UPDATE); metadata replaces the whole object, except referral_code (kept unless you send it) and stripe_account_id (Cred-only: the stored value stays and a value you send is silently dropped). signup_* fields overwrite attribution (use to correct it). 404 USER_NOT_FOUND. To change a wallet use set_user_wallet. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| name | string | New name |
| string | New email | |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| metadata | object | New metadata (replaces existing) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| signup_url | string | Corrected signup URL (also re-derives signup_host) |
| user_email | string | Current email of the user to update |
| external_id | string | External ID of the user to update |
Step 2: submit the personal_sign signature over the challenge message. On success the address is stored and marked verified. A challenge is single-use and a rejected signature consumes it too — a retry needs a fresh challenge. Costs 1 CRD (platform credit) per call, charged even when the call is then rejected (a 429 RATE_LIMITED costs nothing). Error results include request_id; quote it to support.
| Argument | Type | Description |
|---|---|---|
| nonce* | string | The nonce from request_wallet_challenge |
| address | string | Optional guard — rejected if not the address the nonce was issued for |
| api_key | string | Cred API key (optional if set via the x-api-key header) |
| chain_id | number | Chain the proof was signed on, recorded as provenance |
| signature* | string | personal_sign output over the challenge message |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
Discover how to pay Cred with x402 (HTTP 402 stablecoin payments): the accepted scheme, network, asset and prices. Pass project_id to also get that project's credit price list. Requires no credentials and costs no CRD.
| Argument | Type | Description |
|---|---|---|
| project_id | string | Project whose credits you want priced (optional) |
{
"type": "object",
"properties": {
"project_id": {
"type": "string",
"description": "Project whose credits you want priced (optional)"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 6, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.
| to_user_email | string | Email of the recipient |
{
"type": "object",
"required": [
"hold_id"
],
"properties": {
"amount": {
"type": "number",
"description": "Credits to capture (default: the full hold)",
"exclusiveMinimum": 0
},
"reason": {
"type": "string"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"hold_id": {
"type": "string",
"description": "Hold ID"
},
"metadata": {
"type": "object"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"to_user_id": {
"type": "string",
"description": "External ID of the recipient"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"to_user_email": {
"type": "string",
"description": "Email of the recipient"
}
}
}| string |
| Unique key for this charge (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation. |
| pricing_tier_id* | string | One-time (or both) pricing tier to buy |
{
"type": "object",
"required": [
"user_id",
"pricing_tier_id",
"idempotency_key"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID of the card holder"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type to grant. Required when the tier allows several types (400 CREDIT_TYPE_REQUIRED otherwise)"
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Unique key for this charge (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation."
},
"pricing_tier_id": {
"type": "string",
"description": "One-time (or both) pricing tier to buy"
}
}
}| cancel_url |
| string |
| Redirect if the buyer cancels, on an allowed domain (else Cred's default page, no error) |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| signup_url | string | App/page URL the buyer came from (attribution) |
| user_email | string | Buyer email (prefills Checkout, matched first) |
| success_url | string | Redirect after payment, on an allowed domain (else Cred's default page, no error) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id | string | Credit type to grant. Required with amount, and with a tier that allows several types (400 CREDIT_TYPE_REQUIRED otherwise). |
| pricing_tier_id | string | Tier to sell |
| save_payment_method | boolean | Save the card for off-session charges (one-time checkouts only) |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"amount": {
"type": "number",
"description": "Custom-amount checkout: number of credits to sell",
"exclusiveMinimum": 0
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"billing": {
"enum": [
"one_time",
"recurring"
],
"type": "string",
"description": "Default one_time"
},
"user_id": {
"type": "string",
"description": "External user ID of the buyer (created if new)"
},
"quantity": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Tier packs (or seats for a subscription); default 1"
},
"user_name": {
"type": "string",
"description": "Buyer display name"
},
"cancel_url": {
"type": "string",
"description": "Redirect if the buyer cancels, on an allowed domain (else Cred's default page, no error)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"signup_url": {
"type": "string",
"description": "App/page URL the buyer came from (attribution)"
},
"user_email": {
"type": "string",
"description": "Buyer email (prefills Checkout, matched first)"
},
"success_url": {
"type": "string",
"description": "Redirect after payment, on an allowed domain (else Cred's default page, no error)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type to grant. Required with amount, and with a tier that allows several types (400 CREDIT_TYPE_REQUIRED otherwise)."
},
"pricing_tier_id": {
"type": "string",
"description": "Tier to sell"
},
"save_payment_method": {
"type": "boolean",
"description": "Save the card for off-session charges (one-time checkouts only)"
}
}
}| user_email |
| string |
| Holder email (checked first) |
| reference_id | string | Your reference, e.g. an order ID (filterable in list_escrow_holds) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id* | string | Credit type to hold |
| idempotency_key | string | Unique key for this hold (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation. |
{
"type": "object",
"required": [
"credit_type_id",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "Credits to hold",
"exclusiveMinimum": 0
},
"reason": {
"type": "string"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID of the holder"
},
"metadata": {
"type": "object"
},
"expires_at": {
"type": "string",
"description": "ISO timestamp after which the hold can be released back to the holder"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"user_email": {
"type": "string",
"description": "Holder email (checked first)"
},
"reference_id": {
"type": "string",
"description": "Your reference, e.g. an order ID (filterable in list_escrow_holds)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type to hold"
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Unique key for this hold (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation."
}
}
}| billing_type |
| string |
| Which checkouts may sell the tier. A subscription is created only when checkout is sent billing: "recurring"; recurring-only tiers cannot be used for saved-card charges or auto top-up. Default one_time. |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_ids | array | Credit type UUIDs; omit or [] = all |
{
"type": "object",
"required": [
"name",
"credits",
"price"
],
"properties": {
"name": {
"type": "string",
"description": "Tier name"
},
"price": {
"type": "number",
"minimum": 0,
"description": "Price in dollars"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"credits": {
"type": "integer",
"minimum": 1,
"description": "Credits granted per purchase"
},
"currency": {
"type": "string",
"description": "Currency code (default USD)"
},
"is_popular": {
"type": "boolean",
"description": "Highlight as popular"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"description": {
"type": "string",
"description": "Tier description"
},
"billing_type": {
"enum": [
"one_time",
"recurring",
"both"
],
"type": "string",
"description": "Which checkouts may sell the tier. A subscription is created only when checkout is sent billing: \"recurring\"; recurring-only tiers cannot be used for saved-card charges or auto top-up. Default one_time."
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Credit type UUIDs; omit or [] = all"
}
}
}| string |
| Cred subscription ID or Stripe sub_… ID |
{
"type": "object",
"properties": {
"flow": {
"enum": [
"payment_method_update",
"overview"
],
"type": "string"
},
"email": {
"type": "string",
"description": "Customer email (alternative to subscription_id)"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID (alternative to subscription_id)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"return_url": {
"type": "string",
"description": "URL to return to from the portal; must be https on a Cred host or a domain listed under Dashboard → Payments → Allowed redirect domains, else 400 REDIRECT_NOT_ALLOWED"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"subscription_id": {
"type": "string",
"description": "Cred subscription ID or Stripe sub_… ID"
}
}
}| wallet_address | string | 0x EVM address to record as asserted (not verified) |
| signup_credit_type_id | string | Credit type the user signed up for (cross-app attribution) |
{
"type": "object",
"required": [
"external_id"
],
"properties": {
"name": {
"type": "string",
"description": "Display name"
},
"email": {
"type": "string",
"description": "User email"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"metadata": {
"type": "object",
"description": "Arbitrary metadata; stripe_account_id is Cred-only: a value you send is silently dropped"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"signup_url": {
"type": "string",
"description": "App/page URL the user signed up from, e.g. https://app1.example.com/signup"
},
"external_id": {
"type": "string",
"description": "Your user ID"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"wallet_address": {
"type": "string",
"description": "0x EVM address to record as asserted (not verified)"
},
"signup_credit_type_id": {
"type": "string",
"description": "Credit type the user signed up for (cross-app attribution)"
}
}
}| string |
| Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id* | string | Credit type to deduct from |
| idempotency_key | string | Unique key for this deduction (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation. |
{
"type": "object",
"required": [
"credit_type_id",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "Credits to deduct (positive)",
"exclusiveMinimum": 0
},
"reason": {
"type": "string",
"description": "Reason, shown in the ledger"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"user_email": {
"type": "string",
"description": "User email (checked first)"
},
"reference_id": {
"type": "string",
"description": "Your reference, e.g. a job ID (also lets refund_credits find it)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type to deduct from"
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Unique key for this deduction (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation."
}
}
}| source_amount* |
| number |
| Credits to spend (in the target type when direction is reverse) |
| idempotency_key | string | Unique key for this swap (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation. |
{
"type": "object",
"required": [
"swap_pair_id",
"source_amount"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID"
},
"direction": {
"enum": [
"forward",
"reverse"
],
"type": "string",
"description": "Default forward"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"user_email": {
"type": "string",
"description": "User email (alternative)"
},
"swap_pair_id": {
"type": "string",
"description": "Swap pair ID"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"source_amount": {
"type": "number",
"description": "Credits to spend (in the target type when direction is reverse)",
"exclusiveMinimum": 0
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Unique key for this swap (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation."
}
}
}| string |
| List only users attributed to this credit type |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Look up by email"
},
"limit": {
"type": "number",
"description": "Results per page (max 1000, default 100)"
},
"offset": {
"type": "number",
"description": "Pagination offset (default 0)"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"external_id": {
"type": "string",
"description": "Look up by external ID"
},
"signup_host": {
"type": "string",
"description": "List only users who signed up from this host, e.g. app1.example.com"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"signup_credit_type_id": {
"type": "string",
"description": "List only users attributed to this credit type"
}
}
}| User email (matched first, stored on a new user) |
| reference_id | string | Your reference for tracking (not a dedupe key — use idempotency_key) |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id* | string | Credit type to issue |
| wallet_address | string | EVM address to mint this issuance to, overriding the one on file (on-chain types only) |
| idempotency_key | string | Unique key for this issuance (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation. |
| signup_credit_type_id | string | Credit type the user signed up for (attribution) |
{
"type": "object",
"required": [
"user_id",
"credit_type_id",
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "Credits to issue (positive)",
"exclusiveMinimum": 0
},
"reason": {
"type": "string",
"description": "Reason, shown in the ledger"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID"
},
"user_name": {
"type": "string",
"description": "Display name for a new user"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"signup_url": {
"type": "string",
"description": "App/page URL a new user signed up from (first-touch attribution)"
},
"user_email": {
"type": "string",
"description": "User email (matched first, stored on a new user)"
},
"reference_id": {
"type": "string",
"description": "Your reference for tracking (not a dedupe key — use idempotency_key)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type to issue"
},
"wallet_address": {
"type": "string",
"description": "EVM address to mint this issuance to, overriding the one on file (on-chain types only)"
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Unique key for this issuance (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation."
},
"signup_credit_type_id": {
"type": "string",
"description": "Credit type the user signed up for (attribution)"
}
}
}| credit_type_id | string | Filter by credit type |
| transaction_hash | string | Find one deposit by transaction hash |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Filter by user email"
},
"limit": {
"type": "number",
"description": "Results per page (max 200, default 50)"
},
"offset": {
"type": "number",
"description": "Pagination offset"
},
"status": {
"enum": [
"observed",
"credited",
"unattributed",
"rejected"
],
"type": "string"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "Filter by external user ID"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Filter by credit type"
},
"transaction_hash": {
"type": "string",
"description": "Find one deposit by transaction hash"
}
}
}{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Holder email"
},
"limit": {
"type": "number",
"description": "Max 100, default 50"
},
"offset": {
"type": "number"
},
"status": {
"enum": [
"held",
"released",
"captured",
"expired"
],
"type": "string"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "Holder external ID"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"reference_id": {
"type": "string"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Results per page (max 100, default 50)"
},
"offset": {
"type": "number",
"description": "Pagination offset"
},
"status": {
"type": "string",
"description": "Filter by status"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Only this credit type's program"
},
"referrer_email": {
"type": "string",
"description": "Filter by referrer email"
},
"referrer_user_id": {
"type": "string",
"description": "Filter by referrer external ID"
}
}
}| string |
| Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
{
"type": "object",
"required": [
"return_url",
"refresh_url"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"country": {
"type": "string",
"description": "ISO country code for the account (default US)"
},
"user_id": {
"type": "string",
"description": "External user ID"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"return_url": {
"type": "string",
"description": "Where Stripe sends the user after onboarding"
},
"user_email": {
"type": "string",
"description": "User email (alternative)"
},
"refresh_url": {
"type": "string",
"description": "Where Stripe sends the user if the link expired"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}| metadata |
| object |
| String key/values added to the Stripe transfer metadata |
| project_id | string | Cred project ID (optional; the API key already identifies the project) |
| user_email | string | User email (alternative) |
| destination* | string | Stripe connected account ID (acct_…) that receives the payout |
| reference_id | string | Your reference, stored on the transfer and ledger |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_id* | string | Redeemable credit type |
| idempotency_key | string | Unique key for this redemption (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation. |
{
"type": "object",
"required": [
"credit_type_id",
"amount",
"destination"
],
"properties": {
"amount": {
"type": "number",
"description": "Credits to redeem",
"exclusiveMinimum": 0
},
"reason": {
"type": "string",
"description": "Reason, shown on the transfer and ledger"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID"
},
"currency": {
"type": "string",
"description": "Payout currency (default usd)"
},
"metadata": {
"type": "object",
"description": "String key/values added to the Stripe transfer metadata"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"user_email": {
"type": "string",
"description": "User email (alternative)"
},
"destination": {
"type": "string",
"description": "Stripe connected account ID (acct_…) that receives the payout"
},
"reference_id": {
"type": "string",
"description": "Your reference, stored on the transfer and ledger"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Redeemable credit type"
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Unique key for this redemption (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation."
}
}
}| reference_id | string | Reverse the latest non-refund transaction with this reference_id |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| refund_payment | boolean | Purchases only: false reverses credits without refunding money (default true) |
| transaction_id | string | Ledger transaction ID to reverse |
| idempotency_key* | string | Unique key for this refund (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation. |
| stripe_payment_intent_id | string | Stripe pi_… of the purchase (alternative to purchase_id) |
{
"type": "object",
"required": [
"idempotency_key"
],
"properties": {
"amount": {
"type": "number",
"description": "Credits to refund (default: the full original amount)",
"exclusiveMinimum": 0
},
"reason": {
"type": "string",
"description": "Reason, shown in the ledger"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"metadata": {
"type": "object",
"description": "Extra metadata stored on the refund transaction"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"purchase_id": {
"type": "string",
"description": "Cred purchase ID (refunds the payment + credits)"
},
"reference_id": {
"type": "string",
"description": "Reverse the latest non-refund transaction with this reference_id"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"refund_payment": {
"type": "boolean",
"description": "Purchases only: false reverses credits without refunding money (default true)"
},
"transaction_id": {
"type": "string",
"description": "Ledger transaction ID to reverse"
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Unique key for this refund (max 255 chars). Retrying with the same key and same arguments returns the first result instead of repeating it; reusing it for different arguments fails with 409 IDEMPOTENCY_KEY_REUSED. Generate a fresh key (e.g. a UUID) per intended operation and reuse it only to retry that operation."
},
"stripe_payment_intent_id": {
"type": "string",
"description": "Stripe pi_… of the purchase (alternative to purchase_id)"
}
}
}| credit_type_id | string | Credit type to watch. Required when the tier allows several types (400 CREDIT_TYPE_REQUIRED otherwise) |
| pricing_tier_id* | string | One-time (or both) pricing tier to buy |
{
"type": "object",
"required": [
"user_id",
"pricing_tier_id",
"threshold"
],
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"enabled": {
"type": "boolean",
"description": "Default true"
},
"user_id": {
"type": "string",
"description": "External user ID of the card holder"
},
"threshold": {
"type": "number",
"description": "Top up when the balance falls below this",
"exclusiveMinimum": 0
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"max_per_day": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Charge cap per rolling 24h (default 5)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type to watch. Required when the tier allows several types (400 CREDIT_TYPE_REQUIRED otherwise)"
},
"pricing_tier_id": {
"type": "string",
"description": "One-time (or both) pricing tier to buy"
}
}
}| number |
| Credits for the referrer |
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"is_active": {
"type": "boolean",
"description": "Enable/disable the program"
},
"is_default": {
"type": "boolean",
"description": "true makes this program the default — the one requests without credit_type_id use (only true is accepted)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_id": {
"type": "string",
"description": "Credit type whose program to write (and award)"
},
"referee_credits": {
"type": "number",
"minimum": 0,
"description": "Credits for the referred user"
},
"referrer_credits": {
"type": "number",
"minimum": 0,
"description": "Credits for the referrer"
}
}
}| string |
| billing_type | string | Which checkouts may sell the tier. A subscription is created only when checkout is sent billing: "recurring"; recurring-only tiers cannot be used for saved-card charges or auto top-up. |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| credit_type_ids | array | Credit type UUIDs; [] = all |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Pricing tier ID"
},
"name": {
"type": "string"
},
"price": {
"type": "number",
"minimum": 0,
"description": "Price in dollars"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"credits": {
"type": "integer",
"minimum": 1
},
"currency": {
"type": "string"
},
"is_active": {
"type": "boolean",
"description": "Whether the tier can be purchased"
},
"is_popular": {
"type": "boolean"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"description": {
"type": "string"
},
"billing_type": {
"enum": [
"one_time",
"recurring",
"both"
],
"type": "string",
"description": "Which checkouts may sell the tier. A subscription is created only when checkout is sent billing: \"recurring\"; recurring-only tiers cannot be used for saved-card charges or auto top-up."
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"credit_type_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Credit type UUIDs; [] = all"
}
}
}{
"type": "object",
"required": [
"quantity"
],
"properties": {
"email": {
"type": "string",
"description": "Customer email (alternative to subscription_id)"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"user_id": {
"type": "string",
"description": "External user ID (alternative to subscription_id)"
},
"quantity": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "New quantity"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"subscription_id": {
"type": "string",
"description": "Cred subscription ID or Stripe sub_… ID"
}
}
}| signup_host | string | Corrected signup host |
| x402_payment | string | Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD |
| signup_credit_type_id | string | Corrected signup credit type |
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "New name"
},
"email": {
"type": "string",
"description": "New email"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"metadata": {
"type": "object",
"description": "New metadata (replaces existing)"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"signup_url": {
"type": "string",
"description": "Corrected signup URL (also re-derives signup_host)"
},
"user_email": {
"type": "string",
"description": "Current email of the user to update"
},
"external_id": {
"type": "string",
"description": "External ID of the user to update"
},
"signup_host": {
"type": "string",
"description": "Corrected signup host"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
},
"signup_credit_type_id": {
"type": "string",
"description": "Corrected signup credit type"
}
}
}{
"type": "object",
"required": [
"nonce",
"signature"
],
"properties": {
"nonce": {
"type": "string",
"description": "The nonce from request_wallet_challenge"
},
"address": {
"type": "string",
"description": "Optional guard — rejected if not the address the nonce was issued for"
},
"api_key": {
"type": "string",
"description": "Cred API key (optional if set via the x-api-key header)"
},
"chain_id": {
"type": "number",
"description": "Chain the proof was signed on, recorded as provenance"
},
"signature": {
"type": "string",
"description": "personal_sign output over the challenge message"
},
"project_id": {
"type": "string",
"description": "Cred project ID (optional; the API key already identifies the project)"
},
"x402_payment": {
"type": "string",
"description": "Base64 x402 PaymentPayload, only when a previous call failed with an x402 PaymentRequired because the account is out of CRD"
}
}
}