Wave and Orange Money payments in Senegal: payment links, refunds, subscriptions, agent payouts.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <Xaalis key>, or sign in with OAuth (no header)
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.
Sandbox only: jump to the subscription's next billing event (next invoice, due date or end of grace) to test renewals without waiting.
Subscription id (sub_…)
Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation.
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.
claude mcp add --transport http mcp https://mcp.xaalis.org/mcp
Headers
Authorization (optional, not in the config above): Bearer <Xaalis key>, or sign in with OAuth (no header)Sandbox only: jump to the subscription's next billing event (next invoice, due date or end of grace) to test renewals without waiting.
| Argument | Type | Description |
|---|---|---|
| id* | string | Subscription id (sub_…) |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"idempotency_key"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Subscription id (sub_…)"
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
}
}
}Cancel now (voids the unpaid invoice if checkout hasn't started) or at the end of the current period.
| Argument | Type | Description |
|---|---|---|
| id* | string | Subscription id (sub_…) |
| at_period_end* | boolean | true = stop after the current period |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"at_period_end",
"idempotency_key"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Subscription id (sub_…)"
},
"at_period_end": {
"type": "boolean",
"description": "true = stop after the current period"
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
}
}
}Sandbox: create a spending wallet for an AI agent, with a per-payout cap and the only phone numbers it may pay. Fund it, then issue its ak_test_ key. In production a human sets up agent wallets.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| provider* | string | |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
| max_daily_amount | integer | Optional cap on the wallet's payouts per day (Dakar time), in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA. |
| max_payout_amount* | integer | Largest single payout, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA. |
| approval_max_amount | integer | With approval_above_limit: hard ceiling, at least max_payout_amount; nothing above it can be approved, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA. |
| approval_above_limit | boolean | Sandbox: a payout above the caps waits for the owner's approval instead of failing |
Create a payment and get a hosted checkout_url to send to the customer (Wave or Orange Money). The payment is NOT paid until its status is 'succeeded' — check with xaalis_get_payment or a signed webhook, never the customer's redirect.
| Argument | Type | Description |
|---|---|---|
| amount* | integer | Amount the customer pays, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA. |
| metadata | object | Your own string key/values |
| provider | string | Skip the method picker and start this provider directly |
| cancel_url | string | |
| description | string | Shown to the customer |
| success_url | string | |
| customer_name | string | |
| customer_phone | string | Senegal mobile number, e.g. +221771234567 |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
Sandbox only with a merchant key: send money from the merchant balance to a Wave or Orange Money number. In production, agents pay out only through an agent wallet key (ak_) with limits set by a human.
| Argument | Type | Description |
|---|---|---|
| amount* | integer | Amount the recipient receives, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA. |
| provider* | string | |
| recipient_name | string | |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
| recipient_phone* | string | Senegal mobile number, e.g. +221771234567 |
| client_reference | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"amount",
"provider",
"recipient_phone",
"idempotency_key"
],
"properties": {
"amount": {
"type": "integer",
"maximum": 100000000,
"description": "Amount the recipient receives, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA.",
"exclusiveMinimum": 0
},
"provider": {
"enum": [
"wave",
"orange_money"
],
"type": "string"
},
"recipient_name": {
"type": "string",
"maxLength": 100
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
},
"recipient_phone": {
"type": "string",
"pattern": "^\\+2217[0-9]{8}$",
"description": "Senegal mobile number, e.g. +221771234567"
},
"client_reference": {
"type": "string",
"maxLength": 100
}
}
}Bill a customer every day/week/month/year. Invoice 0 is issued at once: send its hosted_invoice_url (in latest_invoice) to the customer. Set billing_cycles (2–24) for an instalment plan that ends by itself.
| Argument | Type | Description |
|---|---|---|
| amount* | integer | Amount per period, whole XOF (min 100) |
| interval* | string | |
| description | string | |
| customer_name* | string | |
| billing_cycles | integer | Instalment plan: number of payments; omit for an open-ended subscription |
| customer_email | string | |
| customer_phone* | string | Senegal mobile number, e.g. +221771234567 |
| days_until_due | integer | |
| interval_count | integer | |
| idempotency_key |
Stop an agent wallet: its keys can no longer start payouts. Payouts already accepted finish normally. Safe to repeat.
| Argument | Type | Description |
|---|---|---|
| wallet_id* | string | Agent wallet id (aw_…) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"wallet_id"
],
"properties": {
"wallet_id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Agent wallet id (aw_…)"
}
}
}Sandbox: move money from the merchant balance into an agent wallet. The wallet's balance is the agent's total spend limit.
| Argument | Type | Description |
|---|---|---|
| amount* | integer | Amount to move, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA. |
| wallet_id* | string | Agent wallet id (aw_…) |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"wallet_id",
"amount",
"idempotency_key"
],
"properties": {
"amount": {
"type": "integer",
"maximum": 100000000,
"description": "Amount to move, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA.",
"exclusiveMinimum": 0
},
"wallet_id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Agent wallet id (aw_…)"
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
}
}
}Read an agent wallet's policy and balance.
| Argument | Type | Description |
|---|---|---|
| wallet_id* | string | Agent wallet id (aw_…) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"wallet_id"
],
"properties": {
"wallet_id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Agent wallet id (aw_…)"
}
}
}The merchant's available balance (withdrawable) and money reserved for payouts in flight, in XOF.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Read a subscription invoice: status, amount, due date, and hosted_invoice_url (the stable link to send the customer).
| Argument | Type | Description |
|---|---|---|
| id* | string | Invoice id (inv_…) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Invoice id (inv_…)"
}
}
}Read a payment's current status, amount, fee and checkout link. 'succeeded' is the only proof the customer paid.
| Argument | Type | Description |
|---|---|---|
| id* | string | Payment id (pay_…) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Payment id (pay_…)"
}
}
}Read a payout's status (pending, processing, succeeded, failed).
| Argument | Type | Description |
|---|---|---|
| id* | string | Payout id (po_…) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Payout id (po_…)"
}
}
}Read a subscription: status, cycles paid, latest invoice.
| Argument | Type | Description |
|---|---|---|
| id* | string | Subscription id (sub_…) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Subscription id (sub_…)"
}
}
}Sandbox: issue the ak_test_ key an agent uses to pay out from this wallet. The secret is shown ONCE — store it in a secret store or env var right away. Retrying with the same idempotency_key never shows it again.
| Argument | Type | Description |
|---|---|---|
| wallet_id* | string | Agent wallet id (aw_…) |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"wallet_id",
"idempotency_key"
],
"properties": {
"wallet_id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Agent wallet id (aw_…)"
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
}
}
}List the merchant's agent wallets and their policies.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size, default 10 |
| starting_after | string | Cursor: the last id of the previous page |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, default 10"
},
"starting_after": {
"type": "string",
"description": "Cursor: the last id of the previous page"
}
}
}List invoices, optionally for one subscription or by status.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size, default 10 |
| status | string | |
| subscription | string | |
| starting_after | string | Cursor: the last id of the previous page |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, default 10"
},
"status": {
"enum": [
"open",
"paid",
"void",
"uncollectible"
],
"type": "string"
},
"subscription": {
"type": "string"
},
"starting_after": {
"type": "string",
"description": "Cursor: the last id of the previous page"
}
}
}List payments, newest first, optionally filtered by status.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size, default 10 |
| status | string | |
| starting_after | string | Cursor: the last id of the previous page |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, default 10"
},
"status": {
"enum": [
"requires_payment_method",
"processing",
"succeeded",
"failed",
"expired",
"refunded"
],
"type": "string"
},
"starting_after": {
"type": "string",
"description": "Cursor: the last id of the previous page"
}
}
}List the merchant's payouts, newest first, with their status and recipient.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size, default 10 |
| starting_after | string | Cursor: the last id of the previous page |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, default 10"
},
"starting_after": {
"type": "string",
"description": "Cursor: the last id of the previous page"
}
}
}Read the refund of a payment, if any (a list of zero or one). Use it to check an uncertain refund instead of retrying.
| Argument | Type | Description |
|---|---|---|
| payment_id* | string | Payment id (pay_…) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"payment_id"
],
"properties": {
"payment_id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Payment id (pay_…)"
}
}
}List subscriptions, newest first, optionally by status.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size, default 10 |
| status | string | |
| starting_after | string | Cursor: the last id of the previous page |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, default 10"
},
"status": {
"enum": [
"active",
"past_due",
"canceled",
"completed"
],
"type": "string"
},
"starting_after": {
"type": "string",
"description": "Cursor: the last id of the previous page"
}
}
}Recent webhooks Xaalis sent to the merchant's endpoint, with status, attempts and the last error — use it to debug a webhook integration.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size, default 10 |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, default 10"
}
}
}Sandbox: move unreserved money from an agent wallet back to the merchant balance.
| Argument | Type | Description |
|---|---|---|
| amount* | integer | Amount to move back, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA. |
| wallet_id* | string | Agent wallet id (aw_…) |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"wallet_id",
"amount",
"idempotency_key"
],
"properties": {
"amount": {
"type": "integer",
"maximum": 100000000,
"description": "Amount to move back, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA.",
"exclusiveMinimum": 0
},
"wallet_id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Agent wallet id (aw_…)"
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
}
}
}Send the FULL amount of a succeeded Wave payment back to the customer (no partial refunds). The merchant's available balance must cover it. One refund per payment; the same idempotency_key returns the same refund.
| Argument | Type | Description |
|---|---|---|
| payment_id* | string | Payment id (pay_…) |
| idempotency_key* | string | Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"payment_id",
"idempotency_key"
],
"properties": {
"payment_id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Payment id (pay_…)"
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
}
}
}Create a Xaalis SANDBOX merchant account and get its test secret key (sk_test_…) and webhook secret, with no human step. Sandbox only: no real money, simulated wallets. Going live later needs a human (KYC and approval). Store the returned secrets in environment variables, never in code.
| Argument | Type | Description |
|---|---|---|
| email* | string | Contact email for the account |
| webhook_url | string | HTTPS endpoint that will receive signed webhooks (optional, can be set later) |
| business_name* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email",
"business_name"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 200,
"description": "Contact email for the account"
},
"webhook_url": {
"type": "string",
"format": "uri",
"description": "HTTPS endpoint that will receive signed webhooks (optional, can be set later)"
},
"business_name": {
"type": "string",
"maxLength": 100,
"minLength": 2
}
}
}Search the official Xaalis documentation (payments, webhooks, payouts, refunds, subscriptions, SDKs, errors, go-live). Use it before guessing how an endpoint behaves.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | What you want to know, e.g. 'verify webhook signature node' |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 8,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 200,
"minLength": 2,
"description": "What you want to know, e.g. 'verify webhook signature node'"
}
}
}Sandbox only: make a test payment succeed or fail as if the customer had paid (or declined) in their wallet. Triggers the same webhooks as a real payment.
| Argument | Type | Description |
|---|---|---|
| id* | string | Payment id (pay_…) |
| outcome* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id",
"outcome"
],
"properties": {
"id": {
"type": "string",
"maxLength": 100,
"minLength": 3,
"description": "Payment id (pay_…)"
},
"outcome": {
"enum": [
"succeeded",
"failed"
],
"type": "string"
}
}
}Start here. Shows which Xaalis key is connected (none, merchant test/live, agent wallet), its mode, the account or wallet it belongs to, and which tools it unlocks.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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 1, 2026.
| allowed_recipient_phones* |
| array |
| 1 to 20 distinct numbers this wallet may pay |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"provider",
"max_payout_amount",
"allowed_recipient_phones",
"idempotency_key"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 2
},
"provider": {
"enum": [
"wave",
"orange_money"
],
"type": "string"
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
},
"max_daily_amount": {
"type": "integer",
"maximum": 100000000,
"description": "Optional cap on the wallet's payouts per day (Dakar time), in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA.",
"exclusiveMinimum": 0
},
"max_payout_amount": {
"type": "integer",
"maximum": 100000000,
"description": "Largest single payout, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA.",
"exclusiveMinimum": 0
},
"approval_max_amount": {
"type": "integer",
"maximum": 100000000,
"description": "With approval_above_limit: hard ceiling, at least max_payout_amount; nothing above it can be approved, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA.",
"exclusiveMinimum": 0
},
"approval_above_limit": {
"type": "boolean",
"description": "Sandbox: a payout above the caps waits for the owner's approval instead of failing"
},
"allowed_recipient_phones": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\+2217[0-9]{8}$",
"description": "Senegal mobile number, e.g. +221771234567"
},
"maxItems": 20,
"minItems": 1,
"description": "1 to 20 distinct numbers this wallet may pay"
}
}
}| client_reference | string | Your order id |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"amount",
"idempotency_key"
],
"properties": {
"amount": {
"type": "integer",
"maximum": 100000000,
"description": "Amount the customer pays, in whole XOF (F CFA). Integer, no decimals: 5000 = 5 000 F CFA.",
"exclusiveMinimum": 0
},
"metadata": {
"type": "object",
"description": "Your own string key/values",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 500
}
},
"provider": {
"enum": [
"wave",
"orange_money"
],
"type": "string",
"description": "Skip the method picker and start this provider directly"
},
"cancel_url": {
"type": "string",
"format": "uri"
},
"description": {
"type": "string",
"maxLength": 200,
"description": "Shown to the customer"
},
"success_url": {
"type": "string",
"format": "uri"
},
"customer_name": {
"type": "string",
"maxLength": 100
},
"customer_phone": {
"type": "string",
"pattern": "^\\+2217[0-9]{8}$",
"description": "Senegal mobile number, e.g. +221771234567"
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
},
"client_reference": {
"type": "string",
"maxLength": 100,
"description": "Your order id"
}
}
}| string |
| Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation. |
| client_reference | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"customer_phone",
"customer_name",
"amount",
"interval",
"idempotency_key"
],
"properties": {
"amount": {
"type": "integer",
"maximum": 100000000,
"minimum": 100,
"description": "Amount per period, whole XOF (min 100)"
},
"interval": {
"enum": [
"day",
"week",
"month",
"year"
],
"type": "string"
},
"description": {
"type": "string",
"maxLength": 200
},
"customer_name": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"billing_cycles": {
"type": "integer",
"maximum": 24,
"minimum": 2,
"description": "Instalment plan: number of payments; omit for an open-ended subscription"
},
"customer_email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"customer_phone": {
"type": "string",
"pattern": "^\\+2217[0-9]{8}$",
"description": "Senegal mobile number, e.g. +221771234567"
},
"days_until_due": {
"type": "integer",
"maximum": 30,
"minimum": 1
},
"interval_count": {
"type": "integer",
"maximum": 12,
"minimum": 1
},
"idempotency_key": {
"type": "string",
"pattern": "^[\\x21-\\x7e]+$",
"maxLength": 255,
"minLength": 1,
"description": "Stable key for this business action (e.g. order-1042). Reuse the SAME key when retrying; a new key creates a new operation."
},
"client_reference": {
"type": "string",
"maxLength": 100
}
}
}