MultiHub API
All MultiHub methods are sent to one endpoint:Request Envelope
| Field | Type | Required | Description |
|---|---|---|---|
method | string | Yes | One of the supported MultiHub methods |
service_id | integer | Conditional | Required for payment.in and payment.out; optional elsewhere |
params.payment | object | Conditional | Required for payment methods |
method as { "const": "balance.get" } and numeric-string service_id values. Payment identifiers must be strings; numeric c_id and h_id values are rejected to avoid precision loss.
Application Rate Limits
Authenticated MultiHub applications have separate per-method protective rate-limit buckets forpayment.in, payment.out, payment.status, and balance.get. Buckets are keyed by merchant and application, not by client IP address. The payment creation buckets are configured as high safety ceilings for runaway or abusive traffic, not as normal operating limits. When a bucket is exhausted, the endpoint returns HTTP 429 with the standard MultiHub error envelope and Retry-After-* rate-limit headers.
payment.in
Creates a deposit.
Required Fields
| Field | Type | Description |
|---|---|---|
service_id | integer | Route assigned during onboarding |
params.payment.amount.value | integer | Amount in minor units; fractional values are rejected |
params.payment.amount.currency | string | ISO 4217 currency code; must match the service_id route |
params.payment.identifiers.c_id | string | Merchant reference, unique per payment |
params.payment.payer | object | Customer who sends funds |
Optional Fields
| Field | Type | Description |
|---|---|---|
description | string | Max 1024 characters |
payer.email | string | Customer email |
payer.phone | string | Customer phone |
payer.person.first_name | string | Customer first name |
payer.person.last_name | string | Customer last name |
payer.customer_account.id | string | Merchant-side customer identifier |
client.language | string | Language hint, max 10 characters |
client.country | string | Country hint, max 3 characters |
redirect.on_success | string | HTTP(S) URL returned in the response redirect object |
redirect.on_fail | string | HTTP(S) URL returned in the response redirect object |
webhook_url | string | Absolute public HTTP(S) URL for per-payment webhook delivery |
Example
payment.out
Creates a withdrawal/payout.
Required Fields
| Field | Type | Description |
|---|---|---|
service_id | integer | Route assigned during onboarding |
params.payment.amount.value | integer | Amount in minor units |
params.payment.amount.currency | string | ISO 4217 currency code; must match the service_id route |
params.payment.identifiers.c_id | string | Merchant payout reference and idempotency key, unique per payment |
params.payment.receiver.bank.account.id | string | Recipient account identifier |
Region-Specific Bank Fields
| Region | Account Field | Additional Field |
|---|---|---|
| India | receiver.bank.account.id | receiver.bank.ifsc |
| Mexico | receiver.bank.account.id with 18-digit CLABE | None |
| Argentina | receiver.bank.account.id with CBU/CVU | Optional receiver.bank.code |
| Turkey | receiver.bank.account.id with IBAN | None |
receiver.bank.clabe is not part of the current request DTO. For Mexico, send the CLABE in receiver.bank.account.id.
Tracking
The create response returns yourc_id, a 123hub h_id, and, when available, an opaque provider p_id. Use c_id or h_id with payment.status; payout webhooks also include these identifiers under data.result.payment.identifiers.
Provider-specific callback fields such as order_id, transaction_id, session_token, or user_id are not part of the public MultiHub contract.
Example
payment.status
Returns the current payment state.
| Identifier | Supported | Notes |
|---|---|---|
c_id | Yes | Merchant reference |
h_id | Yes | Hub payment ID |
p_id | No | Returned in responses only |
payment.notification
Queues a webhook re-delivery for a payment and returns the same payment result shape as payment.status.
The delivered merchant webhook uses the same envelope as automatic lifecycle webhooks: data.success, data.result.payment, data.next: null, data.request_id, and data.processing_time. The outer webhook id can be fresh for each manual re-delivery; use data.result.payment.identifiers for reconciliation.
service_id is optional. The API prefers the stored service_id from payment metadata and falls back to the request value only when metadata is unavailable.
balance.get
Returns balances for the authenticated merchant.
gateway.ping
Validates authentication and connectivity.
Payment Response Object
| Field | Type | Description |
|---|---|---|
payment.payer | object | Present for deposits when customer data is known |
payment.receiver | object | Bank/customer destination details when known |
payment.amount.value | integer | Amount in minor units |
payment.amount.currency | string | ISO 4217 code |
payment.description | string | Description when available |
payment.identifiers.c_id | string | Merchant reference |
payment.identifiers.h_id | string | Hub payment ID |
payment.identifiers.p_id | string | Provider reference when available |
payment.identifiers.utr | string | Bank/provider tracking reference when available |
payment.redirect.to | string or string[] | Payment URL or payment-app deep links |
payment.status | object | Current status and optional history |
payment.timestamps | object | created, updated, and terminal finished timestamps when available |
payment.destination | string | in or out |
payment.operations | array | Operation records derived from the payment |
payment.service_id | integer | Route ID when known |
operation | object | Shortcut to the primary operation |
Status Values
| Status | Final | Success | Internal Source |
|---|---|---|---|
created | No | null | created, pending |
processing | No | null | processing |
success | Yes | true | completed |
error | Yes | false | failed |
canceled | Yes | false | cancelled |
declined | Yes | false | expired |
refunded | Yes | true | refunded |
partially_refunded | Yes | true | partial_refund |
