Skip to main content
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.
An agent (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

  1. Create the agent — name, principal customer, source account, limits, allowlist
  2. Issue a key — the secret is returned once; give it to the runtime
  3. Pay — the runtime calls POST /v1/transfers with the agent key; onBehalfOf defaults to the agent’s customer
  4. Watch — GET /v1/agents/{id}/spend and GET /v1/transfers?agentId=
  5. Pause or revoke — PATCH status PAUSED stops new writes and keeps keys; DELETE revokes 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.
The response is the Agent object with 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 on POST /v1/transfers. onBehalfOf must be the agent’s customer and source.accountId the agent’s source account; anything else is denied before routing.
The transfer response includes 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. Set overLimitAction: REQUEST_APPROVAL on the agent (at create or with PATCH /v1/agents/{id}) and it is sent to you instead:
  1. The agent submits a draft over a limit. It gets 403 agent_approval_required; the draft stays DRAFT with agentApprovalStatus: PENDING, and agent.approval_requested fires with the limit it went over.
  2. You find waiting payments with GET /v1/transfers?agentApprovalStatus=PENDING.
  3. You decide with POST /v1/transfers/{id}/agent-approval and { "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.
  4. agent.approval_resolved fires with the decision, and the agent sees agentApprovalStatus change on the transfer.
Approval applies to submitted drafts. A create with 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 carry agentId 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

  1. Create a business customer for the principal, or reuse one already ACTIVE
  2. Issue that customer a dedicated account — fund only what the agent should spend
  3. Register payees as counterparties and external accounts, and wait for them to leave IN_REVIEW
  4. Create the agent with that customer, account, limits, and payee allowlist, then issue its key
  5. Subscribe to webhooks for agent.* and transfer.*, 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 be BALANCE 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:
  1. Onboard your customer — POST /v1/customers/businesses (or /individuals), then a hosted verification link via POST /v1/verification/initiate, or submit verification over the API
  2. Issue accounts to that cus_ once they are ACTIVE
  3. Move money on their behalf — every transfer takes onBehalfOf: "cus_…"
For payees who are not the customer, create a counterparty (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 with developerFeeFixed 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 treat GET /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