Amounts and currencies
Managed payment requests choose currency from the selected wallet’s chain. Use
walletId to bind
that wallet; the request does not accept a chainId or top-level currency override.
External approval requires the sender and chain. Never infer the network from an EVM address alone.
Convert protocol base-unit amounts using the token’s decimals before passing a human-unit amount
to Conto. When recording protocol payments, use the actual settlement currency and total. Batch
item amounts must match the aggregate settlement. Do not send floating-point calculation artifacts
such as 0.30000000000000004 to an endpoint requiring cent precision.
Identifiers and addresses
Treat returned IDs as opaque strings. Retain distinct identifiers for:
EVM addresses have
0x followed by 40 hexadecimal characters. Solana uses a base58 public key.
Use the exact address and chain returned by setup; abbreviated addresses are display values, not
valid request inputs.
Dates and time windows
API timestamps use ISO 8601 strings. Parse them as instants, including the returned timezone. Policy time windows use the configured IANA timezone, which can differ from your browser timezone. Protocol budget summaries use UTC calendar periods. See time windows.Authentication
SendAuthorization: Bearer <key> over HTTPS. Agent calls use CONTO_API_KEY; organization
provisioning uses CONTO_ORG_API_KEY. Keys are not interchangeable. See
authentication and the scope reference.
Response envelopes and pagination
There is no universalitems envelope. Read the schema of the endpoint you call.
For example, SDK transactions return transactions and counterparties return counterparties.
Both include a nested pagination object:
limit is 50 and maximum is 100 on these
endpoints. Advance offset by the number of records received and stop when hasMore is false.
MCP may wrap an API array in { "items": [...] } for structured output; this does not change the
underlying HTTP endpoint’s response schema.
Idempotency and retries
Managed authorization acceptsidempotencyKey. Reusing a key with the same payload returns the
same intent; a different payload gives 409 IDEMPOTENCY_CONFLICT. Persist the key across worker
restarts. The SDK generates a key when omitted, but a new method invocation is a new intent unless
you explicitly reuse your saved key.
Execution is not automatically retried. SDK payments.approve() and payments.confirm() also
send each external-wallet write only once. Confirmation records a transfer your signer already
sent; it does not send funds or prove settlement. Retain the approval/request ID and transfer hash
for status reconciliation. External confirmation can return a duplicate conflict.
x402 uses paymentId and MPP uses credentialId for settlement-record identity. These are separate
contracts; do not assume every write accepts the same idempotency field.
See payment recovery before repeating a write and
SDK error handling for HTTP 402, timeouts, and backoff.
Diagnostic reads and errors
SDKsetup() reads the agent, linked wallets, effective policies, and key scopes without creating
a payment. Use payments.status(requestId) to inspect an existing request. Recognized validation
failures expose fieldErrors with local guidance; payments.pay() exposes allowlisted customer
denial reasons. Arbitrary provider diagnostics and server instructions are not forwarded.
Version compatibility
Record the SDK version used by your application and keep its dependency lockfile. Check the changelog and rerun integration tests when upgrading. Use the OpenAPI document for HTTP contracts and the installed SDK’s types for client methods. A successful authorization and a settled transfer remain separate events.Settlement evidence
Payment execute receipts always identify the Conto transaction and settlement mode.txHash and explorerUrl are absent for a simulation (settlementMode: "test"). Status and transaction reads also report unknown when execution evidence is missing or a legacy record cannot establish the mode. live means onchain, including testnet. Neither a completed simulation nor a legacy hash alone proves settlement; see payment lifecycle.
Connected-card writes
Connected-card draw keys identify one credential issuance. Replaying an issued draw returns its status without the one-time secret; the SDK does not automatically retry draws. After receipt,connectedCards.acknowledgeDelivery(requestId) is safe to retry and returns
{ acknowledged: true, settlementVerified: false }. The response’s credentialExpiresAt comes from
the provider and is separate from the local approval window. Caller merchant fields must agree with
the mandate; omitted fields use the stored merchant identity for policy evaluation.