| Tool | What it is for |
|---|---|
list_corporates | Which companies your login can act for |
list_accounts | A company's currency accounts and balances |
get_account | One account in full, including pay-in details |
get_account_ledger | Transaction history for an account |
list_beneficiaries | Who a company can pay |
get_beneficiary | One payee in full, with account details and verification |
get_beneficiary_schema | What details a new payee needs |
validate_beneficiary | Check payee details, or an e-Transfer email, before relying on them |
create_beneficiary | Creates a new payee, behind an emailed code |
update_beneficiary | Changes an existing payee, behind an emailed code |
list_financial_institutions | Banks available when setting up a payee |
list_financial_institution_branches | A bank's branches and routing numbers |
list_instructions | Payments and conversions, listed |
get_instruction | One payment or conversion in full |
get_instruction_request | How a submitted payment actually turned out |
validate_payment_instruction | Check a payment without sending it |
create_payment_instruction | Prepare a payment for review. Sends nothing |
submit_payment_instruction | Sends a real payment |
create_fx_payment_instruction | Prepare a pay-in-another-currency payment. Sends nothing |
submit_fx_payment_instruction | Sends a real payment, converting as it goes |
get_fx_quote | Open the quote card for converting between your own accounts (no rate without cards) |
create_fx_quote | Create a real, short-lived rate. Moves no money |
settle_fx_quote | Converts real money between your own accounts |
visualize | Draw a diagram or chart in the chat |
get_documentation_links | Where Sokin's documentation lives |
play_cheetah_dash | An arcade game, in the chat |
| If you want to | The tools behind it |
|---|---|
| See which companies you can act for | list_corporates |
| See balances across accounts | list_accounts, get_account |
| See transaction history | get_account_ledger |
| Look up who you can pay | list_beneficiaries |
| Look up a bank or branch | list_financial_institutions, list_financial_institution_branches |
| Check on payments already made | list_instructions, get_instruction, get_instruction_request |
| Check a payment before sending it | validate_payment_instruction |
| Send a payment | create_payment_instruction, then submit_payment_instruction |
| Start a conversion between your own accounts (see the rate on a card) | get_fx_quote |
| Convert between your own accounts | create_fx_quote, then settle_fx_quote |
| Draw a chart or diagram of a result | visualize |
| Find Sokin's documentation | get_documentation_links |
get_account_ledger,list_instructions, list_beneficiaries andlist_financial_institution_branches. When there is more, the result says so| Client with cards | Client without | |
|---|---|---|
| All the read-only tools | Work | Work |
get_fx_quote | Interactive quote card | No rate and no quote, just a link to the Sokin portal to see the rate and trade |
create_fx_quote, settle_fx_quote | Driven by the card's buttons | Not available |
| Paying a beneficiary, either pair | Review card with Approve | Works — the figures and key come back as text, and you confirm in the chat |
visualize, play_cheetah_dash | Render | Return their content as text |
get_fx_quote asvalidate_payment_instruction, which is asettle_fx_quote checks the session's declared card support before anythingcreate_fx_quote does the same. Send those users to theprepare → confirm → submit flow is the supported path on those clients, notcreate_fx_quote and settle_fx_quote are absentcreate_fx_quote,validate_beneficiary, create_beneficiary and update_beneficiary — write| Tool | What it does |
|---|---|
create_fx_quote | Creates a real, short-lived exchange rate. Moves no money |
settle_fx_quote | Converts real money between two of your own accounts |
submit_payment_instruction | Sends a real payment to a beneficiary |
submit_fx_payment_instruction | Sends a real payment, converting as it goes |
| You want to | Pair |
|---|---|
| Pay someone in a currency you hold | create_payment_instruction → submit_payment_instruction |
| Pay someone in a currency you do not hold | create_fx_payment_instruction → submit_fx_payment_instruction |
| Convert between two of your own accounts | get_fx_quote card → create_fx_quote → settle_fx_quote |
get_instruction_request tells you howlist_corporates{"name": "list_corporates", "arguments": {}}2 corporates: CORP-8842 — Northwind Trading Ltd (direct assignment); CORP-9110 — Northwind Logistics BV (inherited access).{
"data": {
"items": [
{"corporateReference": "CORP-8842", "corporateName": "Northwind Trading Ltd", "assignmentType": "direct"},
{"corporateReference": "CORP-9110", "corporateName": "Northwind Logistics BV", "assignmentType": "inherited"}
]
}
}assignmentType is direct if you were given access to that company, orinherited if it comes via a parent.list_accounts| Takes | Required | What it is |
|---|---|---|
corporate_reference | yes | From list_corporates |
{"name": "list_accounts", "arguments": {"corporate_reference": "CORP-8842"}}2 accounts for CORP-8842: CCA-1001 (GBP) — balance 48200.00, of which 47150.00 available; CCA-1002 (USD) — balance 12000.00, available balance not computable.{
"message": "Success.",
"data": [
{
"corporateReference": "CORP-8842",
"corporateCurrencyAccountReference": "CCA-1001",
"currencyCode": "GBP",
"balance": "48200.00",
"availableBalance": "47150.00"
},
{
"corporateReference": "CORP-8842",
"corporateCurrencyAccountReference": "CCA-1002",
"currencyCode": "USD",
"balance": "12000.00",
"availableBalance": null
}
],
"pagination": {"nextToken": null, "previousToken": null, "totalItems": 2, "hasMore": false}
}null.get_account| Takes | Required | What it is |
|---|---|---|
account_reference | yes | An account reference from list_accounts |
{"name": "get_account", "arguments": {"account_reference": "CCA-1001"}}Account CCA-1001 (GBP): balance 48200.00, of which 47150.00 available. Local funding: active — ready to receive payments — pay into Northwind Trading Ltd, account 12345678, SortCode 04-00-75, at Modulr FS Limited (London branch), GB. International funding: not yet set up.{
"message": "Success.",
"data": {
"externalReference": "CCA-1001",
"currency": "GBP",
"currentBalance": "48200.00",
"availableBalance": "47150.00",
"localAccountStatus": "ACTIVE",
"internationalAccountStatus": "NOT_PROVISIONED",
"localPaymentDetails": {
"accountName": "Northwind Trading Ltd",
"accountNumber": "12345678",
"routingCodeType": "SortCode",
"routingCode": "04-00-75",
"bankName": "Modulr FS Limited",
"bankBranch": "London",
"bankCountry": "GB"
},
"internationalPaymentDetails": []
}
}get_account_ledger| Takes | Required | What it is |
|---|---|---|
account_reference | yes | The account to look at |
from_date | no | Only entries from this date (YYYY-MM-DD) |
to_date | no | Only entries up to this date |
limit | no | Entries per page (default 25, max 100) |
next_token | no | Ask for the next page, using the token from the last one |
{
"name": "get_account_ledger",
"arguments": {"account_reference": "CCA-1001", "from_date": "2026-08-01", "limit": 25}
}| Date | Type | Amount | Counterparty | Description |
|---|---|---|---|---|
| 2026-08-14 | deposit | +5000.00 | Contoso Ltd | Invoice 4471 |
| 2026-08-15 | withdrawal | -1250.00 | Fabrikam GmbH | Supplier payment |
| 2026-08-16 | FX Trade | -800.00 | GBP to EUR conversion |
{
"message": "Success.",
"data": [
{
"amount": "5000.00",
"direction": "credit",
"type": "deposit",
"effectiveDate": "2026-08-14",
"sourceReference": "Contoso Ltd",
"beneficiary": null,
"description": "Invoice 4471",
"transactionReference": "TXN-77120"
},
{
"amount": "1250.00",
"direction": "debit",
"type": "withdrawal",
"effectiveDate": "2026-08-15",
"sourceReference": null,
"beneficiary": "Fabrikam GmbH",
"description": "Supplier payment",
"transactionReference": "TXN-77121"
},
{
"amount": "800.00",
"direction": "debit",
"type": "FX Trade",
"effectiveDate": "2026-08-16",
"sourceReference": null,
"beneficiary": null,
"description": "GBP to EUR conversion",
"transactionReference": "TXN-77122"
}
],
"pagination": {"nextToken": "eyJrIjoi...", "previousToken": null, "totalItems": 3, "hasMore": true}
}direction says which it is. The +/- in the table above is added forsourceReference for money in andbeneficiary for money out.type covers deposits, withdrawals, FX trades and more, and not every valuelist_beneficiariescreate_beneficiary adds one and update_beneficiary changes its bank orget_beneficiary_schema tells you what a new payee needs, andvalidate_beneficiary checks details before you commit to them.| Takes | Required | What it is |
|---|---|---|
corporate_reference | no, but effectively yes | The company whose payees you want |
search | no | Match against the name. Leave out to list everyone |
search_mode | no | "contains" (default) or "starts_with" |
limit | no | Per page |
next_token | no | Token from the previous page |
{
"name": "list_beneficiaries",
"arguments": {"corporate_reference": "CORP-8842", "search": "fab", "search_mode": "contains"}
}| Reference | Name | Type | Country | Currencies (rails) | Status |
|---|---|---|---|---|---|
| BEN-3301 | Fabrikam GmbH | company | DE | EUR (sepa/swift) | active |
| BEN-3302 | Jane Okafor | individual | GB | GBP (faster_payments) | active |
{
"data": [
{
"externalReference": "BEN-3301",
"displayName": "Fabrikam GmbH",
"entityType": "company",
"countryCode": "DE",
"destinations": [
{"currencyCode": "EUR", "paymentRail": "sepa"},
{"currencyCode": "EUR", "paymentRail": "swift"}
],
"status": "active"
},
{
"externalReference": "BEN-3302",
"displayName": "Jane Okafor",
"entityType": "individual",
"countryCode": "GB",
"destinations": [{"currencyCode": "GBP", "paymentRail": "faster_payments"}],
"status": "active"
}
],
"pagination": {"nextToken": null, "previousToken": null, "totalItems": 2, "hasMore": false}
}page and offset, purely so it can tell you clearlylimit and next_token.get_beneficiarylist_beneficiaries collapses a payee| Takes | Required | What it is |
|---|---|---|
beneficiary_id | yes | The payee's reference from list_beneficiaries |
corporate_reference | no, but effectively yes | The company the payee belongs to |
{"name": "get_beneficiary", "arguments": {"beneficiary_id": "BEN-3301", "corporate_reference": "CORP-8842"}}| Currency | Rail | Validation | Account |
|---|---|---|---|
| EUR | sepa | matched | DE89370400440532013000 |
| EUR | swift | not_validated | DE89370400440532013000 |
{
"data": {
"externalReference": "BEN-3301",
"displayName": "Fabrikam GmbH",
"entityType": "company",
"countryCode": "DE",
"status": "active",
"isInternal": false,
"destinations": [
{
"currencyCode": "EUR",
"paymentRail": "sepa",
"validationStatus": "matched",
"account_number": "DE89370400440532013000",
"institution": "Commerzbank AG"
},
{
"currencyCode": "EUR",
"paymentRail": "swift",
"validationStatus": "not_validated",
"account_number": "DE89370400440532013000",
"institution": "Commerzbank AG"
}
],
"company": {"registeredName": "Fabrikam GmbH"},
"address": {"city": "Berlin", "countryCode": "DE"},
"createdAt": "2026-02-11T09:20:00Z"
}
}matched means the account details were checked against the account holder'snot_validated means they were not. It is per destination, so the samedeleted gets an explicit closing line saying itget_beneficiary_schema| Method | Rails |
|---|---|
bank_account | faster_payments, sepa, swift, ach, eft, and the rest |
e_transfer | e_transfer |
virtual_account | pix |
sokin_internal | internal |
crypto | base, tron, ethereum, polygon, solana |
| Takes | Required | What it is |
|---|---|---|
payment_method | yes | One of the five above. crypto is always refused — the upstream endpoint cannot describe crypto payees yet |
currency_code | unless sokin_internal | Currency the payee is paid in |
country_code | unless sokin_internal | Country of the payee's account |
entity_type | unless sokin_internal | individual or company |
autodeposit_enrolled | no | e-Transfer only: "true", "false" or "unknown". Pass "unknown" rather than omitting it when you have not checked — omitting behaves like "true" and leaves the security question optional |
corporate_reference | no, but effectively yes | The company the payee will belong to |
{
"name": "get_beneficiary_schema",
"arguments": {
"payment_method": "bank_account",
"currency_code": "GBP",
"country_code": "GB",
"entity_type": "company",
"corporate_reference": "CORP-8842"
}
}| Field | Type | Required | Notes |
|---|---|---|---|
| displayName | string | yes | length 1-100 |
| bankAccount.accountNumber | string | only for faster_payments | |
| bankAccount.sortCode | string | yes | |
| entityType | enum | yes | one of: individual, company |
{
"data": {
"condition": {
"currencyCode": "GBP",
"entityType": "company",
"countryCode": "GB",
"paymentMethod": "bank_account"
},
"fields": [
{"name": "displayName", "fieldType": "string", "isRequired": true, "min": 1, "max": 100},
{
"name": "bankAccount.accountNumber",
"fieldType": "string",
"isRequired": true,
"requiredForPaymentRails": ["faster_payments"]
},
{"name": "bankAccount.sortCode", "fieldType": "string", "isRequired": true},
{
"name": "entityType",
"fieldType": "enum",
"isRequired": true,
"allowedValues": ["individual", "company"]
}
]
}
}address.city andbankAccount.accountNumber tell you where each answer belongs. "Only forAPI error (400): No payment rails for GBP+US and bank_account.validate_beneficiary| To check | Pass |
|---|---|
| An existing payee, all destinations | beneficiary_id |
| Whether an e-Transfer email can auto-deposit | email |
| An IBAN against a name | iban + bic + account_name |
| A UK account against a name | sort_code + account_number + account_name |
| Takes | Required | What it is |
|---|---|---|
beneficiary_id | for the first check | The payee's reference from list_beneficiaries |
email | for the second | Recipient email to probe |
iban | for the third | The IBAN, 15–34 characters |
bic | for the third | BIC/SWIFT, 8 or 11 characters |
account_name | third and fourth | The account holder name to verify |
sort_code | for the fourth | UK sort code, 6 digits. Spaces and hyphens are fine |
account_number | for the fourth | UK account number, 8 digits |
corporate_reference | no, but effectively yes | The company to check under |
{
"name": "validate_beneficiary",
"arguments": {
"sort_code": "04-00-75",
"account_number": "12345678",
"account_name": "Jane Okafor",
"corporate_reference": "CORP-8842"
}
}| Currency | Rail | Check | Status | Name on record | Details |
|---|---|---|---|---|---|
| GBP | faster_payments | COP | matched | Jane Okafor | Name matches the account holder |
{
"data": {
"isValid": true,
"results": [
{
"validationType": "COP",
"status": "matched",
"actualName": "Jane Okafor",
"details": "Name matches the account holder",
"currencyCode": "GBP",
"paymentRail": "faster_payments"
}
]
}
}| Status | What it means |
|---|---|
matched | The name checks out |
close_match | Nearly — show the user both names and ask before going further |
no_match, invalid | Not verified |
check_not_possible, not_validated | The check did not run. Not a pass |
not_validated, meaning "not applicable" rather thancreate_beneficiaryotp_required.otp_code.| Takes | Required | What it is |
|---|---|---|
display_name | yes | Payee name, 1–255 characters |
currency_code | yes | ISO 4217, or the stablecoin code for a crypto rail |
payment_rail | yes | e.g. faster_payments, sepa, swift, eft, e_transfer, internal, pix |
entity_type | unless rail internal | individual or company |
country_code | unless rail internal | Country of the payee's account |
| one destination object | yes | bank_account, e_transfer, virtual_account, sokin_internal or crypto — whichever matches the rail. get_beneficiary_schema tells you the fields |
individual / company | per entity_type | Identity details |
address | bank rails and e_transfer | Not needed for internal, pix or crypto |
corporate_reference | no, but effectively yes | The company to create under |
otp_code | on the second call | The 6-character code from your email |
{
"name": "create_beneficiary",
"arguments": {
"display_name": "Contoso Ltd",
"currency_code": "GBP",
"payment_rail": "faster_payments",
"entity_type": "company",
"country_code": "GB",
"bank_account": {"accountNumber": "12345678", "sortCode": "040075"},
"company": {"registeredName": "Contoso Ltd"},
"address": {
"addressLineOne": "1 High St",
"city": "London",
"postCode": "EC1A 1AA",
"countryCode": "GB"
},
"corporate_reference": "CORP-8842"
}
}Payee created: Contoso Ltd (reference BEN-3310, status active).
Destinations: GBP via faster_payments (name verified).
No confirmation code was required for this corporate.{
"data": {
"externalReference": "BEN-3310",
"displayName": "Contoso Ltd",
"status": "active",
"createdAt": "2026-09-17T09:14:00Z",
"destinations": [
{
"currencyCode": "GBP",
"paymentRail": "faster_payments",
"validationStatus": "matched"
}
]
}
}list_beneficiaries first. There is no duplicate detection: callcorporate_reference included. Change anything and the flow restarts with aconfirm_verified_payee_name, which you would onlyupdate_beneficiarycreate_beneficiary. Called twice, exactly like| Takes | Required | What it is |
|---|---|---|
beneficiary_id | yes | The payee to change, from list_beneficiaries |
currency_code + payment_rail | if the payee has more than one destination | Which destination you mean, not a change to it. Supply both together |
bank_account, e_transfer, virtual_account, sokin_internal, crypto, individual, company | at least one | The fields to change |
corporate_reference | no, but effectively yes | The company the payee belongs to |
otp_code | on the second call | The 6-character code from your email |
{
"name": "update_beneficiary",
"arguments": {
"beneficiary_id": "BEN-3310",
"bank_account": {"accountNumber": "87654321"},
"corporate_reference": "CORP-8842",
"otp_code": "A1B2C3"
}
}otp_code is what triggers the email:A 6-character confirmation code has been emailed to the user. Ask them for it, then call update_beneficiary again with the SAME arguments plus otp_code. The code is single-use and expires in 10 minutes; to get a fresh one, call again without otp_code (max 5 emails per 15 minutes).| Currency | Rail | Validation | Account |
|---|---|---|---|
| GBP | faster_payments | matched | 87654321 |
{
"data": {
"externalReference": "BEN-3310",
"displayName": "Contoso Ltd",
"entityType": "company",
"countryCode": "GB",
"status": "active",
"createdAt": "2026-09-17T09:14:00Z",
"destinations": [
{
"currencyCode": "GBP",
"paymentRail": "faster_payments",
"validationStatus": "matched",
"account_number": "87654321"
}
]
}
}beneficiary_id,create_beneficiary's, including that fivelist_financial_institutions{"name": "list_financial_institutions", "arguments": {}}| Id | Name | Bank Number |
|---|---|---|
| 1 | Royal Bank of Canada | 003 |
| 2 | Toronto-Dominion Bank | 004 |
{
"message": "Success.",
"data": [
{"id": 1, "name": "Royal Bank of Canada", "bankNumber": "003"},
{"id": 2, "name": "Toronto-Dominion Bank", "bankNumber": "004"}
]
}list_financial_institution_branches| Takes | Required | What it is |
|---|---|---|
financial_institution_id | yes | The id from list_financial_institutions |
limit | no | Per page |
next_token | no | Token from the previous page |
{"name": "list_financial_institution_branches", "arguments": {"financial_institution_id": 1}}| Id | Description | Routing Number | Address | City | State | Postal Code |
|---|---|---|---|---|---|---|
| 4412 | Main Branch | 000312345 | 200 Bay Street, Suite 400 | Toronto | ON | M5J2J2 |
{
"data": [
{
"id": 4412,
"description": "Main Branch",
"routingNumber": "000312345",
"addressLineOne": "200 Bay Street, Suite 400",
"addressLineTwo": null,
"city": "Toronto",
"state": "ON",
"postalCode": "M5J2J2"
}
],
"pagination": {"nextToken": null, "previousToken": null, "totalItems": 1, "hasMore": false}
}list_financial_institutions.list_instructions| Takes | Required | What it is |
|---|---|---|
corporate_reference | one of these two | List for a whole company |
cca_reference | one of these two | List for a single account |
completed | no | true for finished, false for still in progress |
limit | no | Per page (default 20, max 100) |
next_token | no | Token from the previous page |
{"name": "list_instructions", "arguments": {"corporate_reference": "CORP-8842", "limit": 20}}| Reference | Account | Type | Amount | Currency | Status | Created |
|---|---|---|---|---|---|---|
| INS-5512 | CCA-1001 | Payment | 1250.00 | GBP | Processed | 2026-08-15T09:12:44Z |
| INS-5513 | CCA-1002 | FXPayment | 800.00 | USD | Pending Settlement | 2026-08-16T11:03:02Z |
{
"message": "Success.",
"data": [
{
"instructionReference": "INS-5512",
"corporateReference": "CORP-8842",
"ccaReference": "CCA-1001",
"instructionType": "Payment",
"amount": "1250.00",
"currency": "GBP",
"displayStatus": "Processed",
"createdAt": "2026-08-15T09:12:44Z",
"updatedAt": "2026-08-15T09:14:02Z"
},
{
"instructionReference": "INS-5513",
"corporateReference": "CORP-8842",
"ccaReference": "CCA-1002",
"instructionType": "FXPayment",
"amount": "800.00",
"currency": "USD",
"displayStatus": "Pending Settlement",
"createdAt": "2026-08-16T11:03:02Z",
"updatedAt": "2026-08-16T11:04:18Z"
}
],
"pagination": {"nextToken": null, "previousToken": null, "totalItems": 2, "hasMore": false}
}get_instruction| Takes | Required | What it is |
|---|---|---|
instruction_reference | yes | The instruction to look up |
{"name": "get_instruction", "arguments": {"instruction_reference": "INS-5513"}}Instruction INS-5513 (FXPayment) for corporate CORP-8842, account CCA-1002: 800.00 USD -> 742.10 EUR, status Pending Settlement. Beneficiary: BEN-3301. Sender reference (shown to the recipient): INV-4471. Purpose: SUPPLIER_PAYMENT. Fees: 4.20 FX, 1.50 transaction, 0.00 reseller. Created 2026-08-16T11:03:02Z, updated 2026-08-16T11:04:18Z.{
"message": "Success.",
"data": {
"externalReference": "INS-5513",
"displayStatus": "Pending Settlement",
"instructionType": "FXPayment",
"corporateReference": "CORP-8842",
"corporateCurrencyAccount": "CCA-1002",
"amount": "800.00",
"destinationAmount": "742.10",
"sourceCurrency": "USD",
"destinationCurrency": "EUR",
"beneficiaryReference": "BEN-3301",
"senderReference": "INV-4471",
"paymentPurpose": "SUPPLIER_PAYMENT",
"sokinFxFee": "4.20",
"sokinTransactionFee": "1.50",
"resellerTransactionFee": "0.00",
"failureReason": null,
"instructionRequestReference": "IR-Payment-5513",
"createdAt": "2026-08-16T11:03:02Z",
"updatedAt": "2026-08-16T11:04:18Z"
}
}get_instruction_request| Takes | Required | What it is |
|---|---|---|
instruction_request_reference | yes | The receipt reference from submitting. Not an instruction reference — those go to get_instruction |
{"name": "get_instruction_request", "arguments": {"instruction_request_reference": "IR-Payment-77"}}Instruction request IR-Payment-77 was accepted: instruction INS-9 was created. Use get_instruction for its full detail.{
"message": "Success.",
"data": {
"externalReference": "IR-Payment-77",
"status": "Accepted",
"createdInstructionReference": "INS-9",
"failureReason": null,
"errorCategory": null
}
}| Status | What it actually means |
|---|---|
Created | Still being processed. Not a success |
Accepted | Succeeded |
Rejected | Failed, and the reason is in the result |
Instruction request IR-Payment-77 is still being processed -- no outcome yet. Check again shortly.Instruction request IR-Payment-77 was rejected: Insufficient balance (category: amount). No instruction was created.validate_payment_instruction| Takes | Required | What it is |
|---|---|---|
corporate_currency_account | yes | The account to pay from |
beneficiary_reference | yes | Who to pay, from list_beneficiaries |
amount | yes | Plain decimal, up to 2 places, above zero (e.g. "125.50") |
reseller_fee | no | Same format, zero or more |
sender_reference | no | Text the recipient sees, max 18 characters |
payment_purpose | no | One of a fixed list of purpose codes, e.g. ACCOUNTS_PAYABLE. Any other value is refused |
amount_is_fees_inclusive | no | true takes fees out of the amount; default adds them on top |
{
"name": "validate_payment_instruction",
"arguments": {
"corporate_currency_account": "CCA-1001",
"beneficiary_reference": "BEN-3301",
"amount": "1250.00",
"reseller_fee": "1.50",
"sender_reference": "INV-4471"
}
}Validation passed: this payment would clear the creation checks. Total debit 1256.70 (5.20 Sokin fee, 1.50 reseller fee); beneficiary would receive 1250.00. Nothing was created and no money moved.{
"data": {
"success": true,
"failureReason": null,
"errorCategory": null,
"feeBreakdown": {
"amount": "1256.70",
"destinationAmount": "1250.00",
"sokinFee": "5.20",
"resellerFee": "1.50",
"feeRateCardReference": "RC-14"
}
}
}Validation failed: insufficient available balance on the source account (category: amount). The engine still computed amounts: total debit 1256.70 (5.20 Sokin fee, 1.50 reseller fee). Nothing was created and no money moved."125.50". Shorthand such as 1e3create_payment_instructionvalidate_payment_instruction first and fix anything it flags. Thisvalidate_payment_instruction, plus one optionalstatus_check_key that only the card itself sends. Leave it unset.{
"name": "create_payment_instruction",
"arguments": {
"corporate_currency_account": "CCA-1001",
"beneficiary_reference": "BEN-3301",
"amount": "1250.00",
"reseller_fee": "1.50",
"sender_reference": "INV-4471"
}
}Payment prepared and validated -- awaiting the user's confirmation in the review widget. Nothing has been submitted; do not report this payment as made, and do not call submit_payment_instruction yourself.{
"draft": {
"corporate_currency_account": "CCA-1001",
"beneficiary_reference": "BEN-3301",
"amount": "1250.00",
"reseller_fee": "1.50",
"sender_reference": "INV-4471",
"payment_purpose": null,
"amount_is_fees_inclusive": false
},
"currency": "GBP",
"validation": {
"success": true,
"failureReason": null,
"errorCategory": null,
"feeBreakdown": {
"amount": "1256.70",
"destinationAmount": "1250.00",
"sokinFee": "5.20",
"resellerFee": "1.50",
"feeRateCardReference": "RC-14"
}
},
"idempotencyKey": "a5f1c8e0-7d3b-4f2a-9c61-0b8e4d2f1a77"
}submit_payment_instruction| Takes | Required | What it is |
|---|---|---|
idempotency_key | yes | The key from create_payment_instruction |
| everything else | — | Must match the payment you reviewed, exactly |
{
"name": "submit_payment_instruction",
"arguments": {
"idempotency_key": "a5f1c8e0-7d3b-4f2a-9c61-0b8e4d2f1a77",
"corporate_currency_account": "CCA-1001",
"beneficiary_reference": "BEN-3301",
"amount": "1250.00",
"reseller_fee": "1.50",
"sender_reference": "INV-4471"
}
}Payment submitted: instruction request IR-Payment-77 for 1250.00 from CCA-1001 to BEN-3301. This is an instruction-request reference, not a completed payment -- it now needs human approval in the Sokin portal before it is processed. Check the outcome via get_instruction_request.{"data": {"externalReference": "IR-Payment-77"}}get_instruction_request for the real outcome.create_fx_payment_instructioncreate_payment_instruction| Takes | Required | What it is |
|---|---|---|
corporate_currency_account | yes | The account to pay from |
beneficiary_reference | yes | Who to pay, from list_beneficiaries |
buy_currency | yes | What the beneficiary receives, e.g. "USD" |
sell_currency | yes | What you are spending, e.g. "GBP" |
amount | yes | The amount of whichever side fixed_side names |
fixed_side | no | "BUY" or "SELL". Default "SELL" |
corporate_reference | no, but effectively yes | The company to quote for. Used only to mint the quote |
reseller_fee | no | Plain decimal, zero or more |
sender_reference | no | Text the recipient sees, max 18 characters |
payment_purpose | no | One of a fixed list of purpose codes, e.g. ACCOUNTS_PAYABLE. Any other value is refused |
status_check_key | no | Sent only by the card itself, to check a draft's status. Leave it unset |
{
"name": "create_fx_payment_instruction",
"arguments": {
"corporate_currency_account": "CCA-1001",
"beneficiary_reference": "BEN-3301",
"buy_currency": "USD",
"sell_currency": "GBP",
"amount": "100.00",
"fixed_side": "SELL",
"corporate_reference": "CORP-8842",
"sender_reference": "INV-4471"
}
}FX payment prepared and validated -- awaiting the user's confirmation in the review widget. Nothing has been submitted; do not report this payment as made, and do not call submit_fx_payment_instruction yourself.FX payment prepared and validated -- nothing has been submitted yet. Total debit 100.00 (0.50 Sokin fee, 0.00 reseller fee); beneficiary would receive 125.00 (GBP debited, beneficiary receives USD). idempotency key: 9c21ab4f-... . quote_id: FXQ-1a2b3c... . Read these figures back to the user and get their explicit approval. Only after they approve, call submit_fx_payment_instruction with this idempotency_key, this quote_id, and the same corporate_currency_account, beneficiary_reference, reseller_fee, sender_reference, and payment_purpose you used here -- it does not take buy_currency, sell_currency, amount, fixed_side, or corporate_reference; those only mint the quote. Never submit without that approval, and never tell the user the payment was made until submit_fx_payment_instruction succeeds -- it will still need approval in the Sokin portal afterward.{
"draft": {
"corporate_currency_account": "CCA-1001",
"beneficiary_reference": "BEN-3301",
"quote_id": "FXQ-1a2b3c",
"reseller_fee": null,
"sender_reference": "INV-4471",
"payment_purpose": null
},
"currency": "GBP",
"buyCurrency": "USD",
"quoteCreatedAt": "2026-09-16T10:02:00+00:00",
"quoteExpiresAt": "2026-09-16T10:12:00+00:00",
"idempotencyKey": "9c21ab4f-7c4e-4a2b-9f31-6d0e2a5b8c14",
"quoteRequest": {
"buy_currency": "USD",
"sell_currency": "GBP",
"amount": "100.00",
"fixed_side": "SELL",
"corporate_reference": "CORP-8842"
}
}quote_id and no amounts: the amounts come from thequote_id through unchanged. quoteRequest echoes those pricingcreate_payment_instruction: the card checks with Sokin first, andRejected with aquoteExpiresAt is what the cardsubmit_fx_payment_instructioncreate_fx_payment_instruction minted, with arguments matching the draft that| Takes | Required | What it is |
|---|---|---|
idempotency_key | yes | The key from create_fx_payment_instruction |
corporate_currency_account | yes | Must match the reviewed draft |
beneficiary_reference | yes | Must match the reviewed draft |
quote_id | yes | From the draft's quote_id — the quote the prepare step minted, not one you choose |
reseller_fee | no | Must match the reviewed draft |
sender_reference | no | Must match the reviewed draft |
payment_purpose | no | Must match the reviewed draft |
{
"name": "submit_fx_payment_instruction",
"arguments": {
"idempotency_key": "9c21ab4f-7c4e-4a2b-9f31-6d0e2a5b8c14",
"corporate_currency_account": "CCA-1001",
"beneficiary_reference": "BEN-3301",
"quote_id": "FXQ-1a2b3c",
"sender_reference": "INV-4471"
}
}FX payment submitted: instruction request IR-FXPayment-77 from CCA-1 to BEN-1. This is an instruction-request reference, not a completed payment -- it now needs human approval in the Sokin portal before it is processed. Check the outcome via get_instruction_request.{"data": {"externalReference": "IR-FXPayment-77"}}get_instruction_request is how you find out whenget_instruction_request's shape rather than the single-field one above. Codeget_fx_quote| Takes | Required | What it is |
|---|---|---|
buy_currency | yes | What you are buying, e.g. "USD" |
sell_currency | yes | What you are selling, e.g. "GBP" |
amount | yes | The amount of whichever side fixed_side names |
fixed_side | no | "BUY" or "SELL". Default "SELL" |
corporate_reference | yes | Which company to quote for. From list_corporates |
corporate_currency_account | no | The account a later conversion would come from |
card_id | no | Sent only by the card itself, to check what already happened on it. Leave it unset |
{
"name": "get_fx_quote",
"arguments": {
"buy_currency": "USD",
"sell_currency": "GBP",
"amount": "1000.00",
"fixed_side": "SELL",
"corporate_reference": "CORP-8842",
"corporate_currency_account": "CCA-1001"
}
}Ready to quote GBP -> USD, 1000.00 on the sell side. No quote has been created yet -- the card's Get Quote button mints one.corporateCurrencyAccountDisplay field below is the account's resolvedcorporate_currency_account is passed; if the account read fails itGBP account (number unavailable) and the card still renders.{
"buyCurrency": "USD",
"sellCurrency": "GBP",
"amount": "1000.00",
"fixedSide": "SELL",
"corporateReference": "CORP-8842",
"corporateCurrencyAccount": "CCA-1001",
"cardId": "0f8fad5b-d9cb-469f-a165-70867728950e",
"corporateCurrencyAccountDisplay": "GBP account 12345678"
}cardId is the card's own id. It is what lets the card remember its quote.IR- reference, and the card carries on tracking it,This client cannot show the FX quote card, so no quote was created and no rate is shown. Open https://portal.uat.sokin.com/v2/transfer/currency-exchange to see the live rate and execute GBP -> USD for 1000.00 (SELL side) for corporate CORP-8842. Do not try to quote or settle this through the assistant.{
"buyCurrency": "USD",
"sellCurrency": "GBP",
"amount": "1000.00",
"fixedSide": "SELL",
"corporateReference": "CORP-8842",
"indicative": true,
"quoteCreated": false,
"dashboardUrl": "https://portal.uat.sokin.com/v2/transfer/currency-exchange"
}create_fx_quoteget_fx_quote. Only available on a client with interactive cards.expiresAt in the result. Never assume aget_fx_quote, plus optionalreseller_fee and beneficiary_external_reference. The card also sends itscard_id, so that it remembers the quote if you come back to the{
"name": "create_fx_quote",
"arguments": {
"buy_currency": "USD",
"sell_currency": "GBP",
"amount": "1000.00",
"fixed_side": "SELL",
"corporate_reference": "CORP-8842",
"corporate_currency_account": "CCA-1001"
}
}Quote QT-88213 created: 1000.00 GBP -> 1187.40 USD at rate 1.18740. Expires at 2026-08-27T14:34:00+00:00 -- settle it before then, or ask for a fresh quote once it expires. The 2.50 GBP FX fee is included in the 1000.00 GBP sold; 1187.40 USD is the amount that settles. Settling from GBP account 12345678.{
"quoteId": "QT-88213",
"idempotencyKey": "7c2e9b41-5a08-4d6f-b3c2-91ef0a4d8b52",
"currencyPair": "GBP/USD",
"fxRate": "1.18740",
"fixedSide": "SELL",
"buyAmount": "1187.40",
"buyCurrency": "USD",
"sellAmount": "1000.00",
"sellCurrency": "GBP",
"fxFees": "2.50",
"createdAt": "2026-08-27T14:32:00+00:00",
"expiresAt": "2026-08-27T14:34:00+00:00",
"corporateCurrencyAccount": "CCA-1001",
"corporateCurrencyAccountDisplay": "GBP account 12345678",
"resellerFee": null
}settle_fx_quoteError: this session has not declared MCP UI support, so real-money FX settlement is refused here. Direct the user to the Sokin dashboard to execute this trade instead.| Takes | Required | What it is |
|---|---|---|
idempotency_key | yes | The key from create_fx_quote |
corporate_currency_account | yes | Must match the quote you saw |
quote_id | yes | Must match the quote you saw |
reseller_fee | no | Must match the quote you saw |
{
"name": "settle_fx_quote",
"arguments": {
"idempotency_key": "7c2e9b41-5a08-4d6f-b3c2-91ef0a4d8b52",
"corporate_currency_account": "CCA-1001",
"quote_id": "QT-88213"
}
}FX conversion submitted: instruction request IR-FX-9911 for account CCA-1001. This is a submission receipt, not confirmation the conversion completed -- check get_instruction_request for its actual outcome.{"data": {"externalReference": "IR-FX-9911", "status": "Created"}}Created means still processing. Useget_instruction_request for the outcome — it is a read, and it answersvisualize| Takes | Required | What it is |
|---|---|---|
markdown | yes | Markdown to render. Code blocks tagged mermaid become diagrams |
title | no | The card's heading |
{
"name": "visualize",
"arguments": {
"title": "Balances by currency",
"markdown": "```mermaid\npie title Balances\n \"GBP\" : 48200\n \"USD\" : 12000\n```"
}
}{"title": "Balances by currency", "markdown": "```mermaid\npie title Balances\n \"GBP\" : 48200\n \"USD\" : 12000\n```"}get_documentation_links| Takes | Required | What it is |
|---|---|---|
topic | no | "b2b_api", "mcp_server", or "all". Default "all" |
{"name": "get_documentation_links", "arguments": {"topic": "all"}}| Documentation | URL | What's there |
|---|---|---|
| Sokin B2B API reference | https://docs.sokin.com/llms.txt | The Sokin B2B REST API this MCP server calls: every endpoint, authentication, API versions, and request/response schemas |
| Sokin MCP server reference | https://docs.sokin.com/sokin-mcp-10453423f0 | This MCP server: the tools it exposes, what each returns, and how to connect a client |
{
"mcpServerUrl": "https://mcp.uat.sokin.com",
"documentation": [
{
"topic": "b2b_api",
"title": "Sokin B2B API reference",
"url": "https://docs.sokin.com/llms.txt",
"alternateUrl": "https://docs.sokin.com",
"summary": "The Sokin B2B REST API this MCP server calls: every endpoint, authentication, API versions, and request/response schemas"
},
{
"topic": "mcp_server",
"title": "Sokin MCP server reference",
"url": "https://docs.sokin.com/sokin-mcp-10453423f0",
"alternateUrl": null,
"summary": "This MCP server: the tools it exposes, what each returns, and how to connect a client"
}
]
}(none available) and says why, which is more useful thanplay_cheetah_dash{"name": "play_cheetah_dash", "arguments": {}}Cheetah Dash is ready -- use Space or tap to jump, again mid-air to double jump.| Idea | Tools | Prompt to try |
|---|---|---|
| Multi-currency balance dashboard | list_corporates, list_accounts | "Build a dashboard of all my Sokin balances by currency, with a bar chart of the biggest five." |
| FX quote checker | get_fx_quote | "Make a page where I enter an amount and from/to currency and it shows the current Sokin FX quote." |
| Transaction history explorer | get_account_ledger | "Build a screen to pick an account and list its recent transactions, newest first, with a date filter." |
| Beneficiary directory | list_beneficiaries | "Create a searchable directory of my saved beneficiaries with currency and country." |
| Payment pre-flight checker | validate_payment_instruction | "Let me paste payment details and flag any problems, without submitting anything." |
validate_payment_instruction saves nothing and moves no money.https://docs.sokin.com, orhttps://docs.sokin.com/llms.txt for the machine-readable index.get_documentation_links will return the ones for the environment you are