Early access. Agents are enabled per organization alongside per-key transfer policy — ask your account team. Until enabled,
POST /v1/agents and key issuance return 403 agents_not_enabled; see Building blocks for the objects an agent is made of.agt_) is a spending identity inside your organization. It is bound to one ACTIVE customer and one funding account, carries hard spend limits and an optional destination allowlist, and authenticates with its own key (sk_live_agent_ / sk_sandbox_agent_). Every transfer the key makes is attributed to the agent and checked against its limits at the network — not in your code.
Lifecycle
- Create the agent — name, principal customer, source account, limits, allowlist
- Issue a key — the secret is returned once; give it to the runtime
- Pay — the runtime calls
POST /v1/transferswith the agent key;onBehalfOfdefaults to the agent’s customer - Watch —
GET /v1/agents/{id}/spendandGET /v1/transfers?agentId= - Pause or revoke —
PATCHstatusPAUSEDstops new writes and keeps keys;DELETErevokes the agent and every key
customerId, sourceAccountId, and limits.currency are fixed at create — start a new agent to change them.
Create an agent
Amounts are in smallest units as strings (cents for USD). Limits must be in the source account’s currency.status: ACTIVE.
Issue a key
Creating an agent returns an ID, not a credential. Issue a key from a console session or an unconstrained organization key (one with no transfer policy); an agent key cannot mint keys.secret is returned only in this response. Store it in your secrets manager; afterwards GET /v1/agents/{id}/keys shows only keyHint.
Agent keys have fixed scopes: transfers:read, transfers:write, accounts:read, customers:read, plus read access to their own agent and spend. Connect an assistant to the MCP server with an agent key and it gets payment tools — list_payees, get_balance, get_quote, create_transfer (draft), submit_transfer, get_agent — bound by the same limits. Reads are scoped: the key sees only its own agent, its own transfers, and its principal customer’s record and accounts. They cannot manage agents or keys, and — because they carry the agent’s pins — cannot create payout batches or debit any other account.
Pay as the agent
The runtime uses the agent key onPOST /v1/transfers. onBehalfOf must be the agent’s customer and source.accountId the agent’s source account; anything else is denied before routing.
agentId. Denials are 403 with a machine-readable code:
Customer, source-account, and destination-allowlist mismatches return the same
403 messages as per-key transfer policy — the agent’s key carries those pins.
Limits
Limits are enforced when a transfer leaves
DRAFT (confirm: true at create, or submit), in the same transaction as the status change, so two concurrent submits cannot both pass. GET /v1/agents/{id}/spend returns used, remaining, and resetsAt per window.
Owner approval
By default a payment over a limit is denied. SetoverLimitAction: REQUEST_APPROVAL on the agent (at create or with PATCH /v1/agents/{id}) and it is sent to you instead:
- The agent submits a draft over a limit. It gets
403 agent_approval_required; the draft staysDRAFTwithagentApprovalStatus: PENDING, andagent.approval_requestedfires with the limit it went over. - You find waiting payments with
GET /v1/transfers?agentApprovalStatus=PENDING. - You decide with
POST /v1/transfers/{id}/agent-approvaland{ "decision": "APPROVE" }or{ "decision": "DECLINE", "reason": "…" }from the console or an organization key. Agent keys cannot decide.- While approval is pending, the draft can’t be edited, so the owner approves exactly what the agent asked for.
- Approve submits the draft. Only the spend limits are skipped — a paused or revoked agent, a currency mismatch, or a payee removed from the allowlist still refuse it. The payment counts toward the agent’s spend.
- Decline cancels the draft.
agent.approval_resolvedfires with thedecision, and the agent seesagentApprovalStatuschange on the transfer.
confirm: true over a limit is always denied, since there is no draft to hold — have the agent create a draft and submit it.
Attribution
Transfers made with an agent key carryagentId in the transfer response and in every transfer.* webhook payload, and can be filtered with GET /v1/transfers?agentId=. A DRAFT created by an agent key keeps that attribution — and that agent’s limits — even if a console user submits it later.
Webhooks
Subscribe in the console under Developer → Webhooks. See Webhooks.
Building blocks
An agent sits on the same REST surface as any other caller: a KYB-verified customer, accounts issued to that customer, and transfers that screen on every instruction. The Agent resource binds them together and enforces the limits at the network. Know your agent (KYA) is the discipline. Bind the agent to a verified business, give it a funded account, restrict it to screened payees, and keep a webhook record of every state change. From MCP, an organization key gets the onboarding tools (create_business_customer, start_verification, …) and an agent key gets the payment tools (create_transfer, submit_transfer, …). See Paying with an agent key.
Setting one up
- Create a business customer for the principal, or reuse one already
ACTIVE - Issue that customer a dedicated account — fund only what the agent should spend
- Register payees as counterparties and external accounts, and wait for them to leave
IN_REVIEW - Create the agent with that customer, account, limits, and payee allowlist, then issue its key
- Subscribe to webhooks for
agent.*andtransfer.*, and poll the transfer when you need authoritative status
What an agent needs
Mapped to the object you call. Everything in this table is live.Roadmap. The Agent resource above is early access. Per-agent credit, payment Links, card issuing (preview), usage-based billing, a public invoice API, and instruction-audit export (
GET /v1/internal/transfers/{id}/instruction-audit) are in early access or beta. Ask your account team for access; nothing on this page depends on them.Wallet account
A dedicated account on a verified customer. The available balance caps what that account can send — a transfer cannot debit more than it holds. Organization API keys can still reach other customers and accounts unless you constrain the caller.
Treasury wallets have no public create endpoint. Model one agent as one customer, or one dedicated account on a shared customer.
See Accounts and Balance accounts.
Pay, request, and accept
Pay, request, and accept are the same money-movement objects with different directions. Pay — the agent sends. Create a transfer from a balance account to a screened destination. Source rail must beBALANCE when paying from a held USD balance:
rawValue is minor units (cents for USD). Destinations start IN_REVIEW and become payable only after screening — create the counterparty and external account first. Use a unique high-entropy Idempotency-Key on every write — see Idempotency.
Request / accept — the agent collects. Create a transfer that returns depositInstructions, or share a standing fixed route / balance-account deposit address. Funds land on the customer’s account; listen for transfer.* webhooks.
The console can generate a hosted pay page for an account id or a transfer awaiting deposit. Screening runs when the deposit or transfer is processed. Console invoicing emits invoice.* webhooks.
Transfer
One instruction: amount, currency, source, destination. Routing selects ACH, Fedwire, RTP, SWIFT, stablecoin, or FX from those fields. That is the product marketing calls Transfer Routes — in the API it is transfers plus fixed routes.
Customer must be
ACTIVE. Set confirm: true to submit immediately, or create a DRAFT and POST /v1/transfers/{id}/submit.
Credit
The liquidity facility draws USDC into a Solana treasury (POST /v1/liquidity/draws), then you pay back a position. Check with your account team — the facility is capability-gated.
Connect
Platform on Infinite is three existing calls:- Onboard your customer —
POST /v1/customers/businesses(or/individuals), then a hosted verification link viaPOST /v1/verification/initiate, or submit verification over the API - Issue accounts to that
cus_once they areACTIVE - Move money on their behalf — every transfer takes
onBehalfOf: "cus_…"
cp_) and attach it on the transfer. Child organizations (POST /v1/organizations/{id}/children) are a separate, capability-gated tenancy feature — not required for third-party funds flow.
Bill
Take your cut in the settlement path withdeveloperFeeFixed and developerFeePercent on transfers and fixed routes. That is the funds-flow billing mechanism that is live today. Provider-balance onramp sweep targets do not support developer fees.
Identity
Capabilities (
GET /v1/customers/{id}/capabilities) tell you what that customer may hold or send.
Observability
Subscribe to the supported lifecycle events below. Not every internal state change emits a customer webhook (for example draft transfer creation), so treatGET /v1/transfers/{id} — and the matching resource GET for customers, accounts, and verification — as the source of truth, with webhooks as the push path.
External accounts start
IN_REVIEW and become payable after screening. Listen for external_account.approved (and external_account.rejected) to know when a payee destination is usable — counterparty.* only covers counterparty create / update / delete.
When a transfer is held in IN_REVIEW, it stays there until a terminal status: COMPLETED, REVERSED, FAILED, or CANCELLED.
Compliance
Infinite’s compliance program screens customers, counterparties, and transfers. You see explicit statuses and, when more information is needed, RFIs. Approve / reject decisions are made by a human on Infinite’s side.
Some review paths place a hard hold and move the transfer to
IN_REVIEW (emits transfer.updated) until a human allows or blocks it. Transaction and account monitoring can also open a review case without holding settlement — do not treat a monitoring alert alone as a guarantee that funds stopped.
Next steps
Agents API reference
Every endpoint and field
Customers
Create the business the agent belongs to
Accounts
Issue the funded account that caps spend
Transfers
Pay, collect, and watch status
Webhooks
Signed events for every transition
MCP
Connect an assistant to your account