Skip to main content

The Arc API (/v1)

The /v1 REST API is what the arc CLI is built on. It's read-only today.

Base URL

https://api.arc.tech/v1

Authentication

Every request carries an API key (arc_sk_…) as a bearer token:

Authorization: Bearer arc_sk_your_key_here

Create and manage keys under Settings → Developer. A key is company-scoped, acts with its owner's permissions, and every failed auth returns a generic 401 (no enumeration oracle).

Resources

List endpoints are paginated (limit/cursor, per the list envelope below). Transaction and invoice lists also accept from/to (inclusive, YYYY-MM-DD, on the transaction date and the invoice issue date respectively).

Identity & organization

Method & pathDescription
GET /v1/meThe identity behind the key (company, owner, key metadata).
GET /v1/profileThe key owner's personal profile (name, email, phone, address, and KYC details when verified).
GET /v1/organizationThe company's organization profile (legal name, DBA, masked EIN, phone, legal address). ?investmentPreferences=true also returns investment preferences.
GET /v1/usersCompany members — name, email, role, status. Filter with ?role, ?status, ?email (exact, any casing), ?name (substring).

Accounts & transactions

Method & pathDescription
GET /v1/accountsCash-management accounts and balances. Filter with ?type=treasury|operating and ?status=ACTIVE|ACCOUNT_RESTRICTED|PENDING_APPROVAL|ACCOUNT_CLOSED — the app's own name for each state. Defaults to open accounts; naming another state returns it, with zero balances where there is no ledger.
GET /v1/cardsArc-issued cards — masked last-4, form factor, cardholder, status, spend limit. Filter with ?scope, ?status, ?format, ?cardholder, ?last4 (exact — the only per-card handle).
GET /v1/external-accountsLinked external bank accounts (the app's "Linked Accounts") — institution, masked number, type, status. Filter with ?type=checking|savings and ?status=active|inactive.
GET /v1/transactionsCash-management transactions. Filter with ?account, ?direction, ?status, ?method, ?minAmount/?maxAmount (integer minor units, matched on the amount's magnitude), ?search, ?from/?to, ?excludeInternalTransfers=true; see the API reference for each parameter's values.
GET /v1/transactions/:idA single transaction's detail, including isInternalTransfer.

Payments

Method & pathDescription
GET /v1/paymentsOutgoing payments in one uniform shape. All lifecycle states are returned by default; ?status= can select one state. Filter with ?counterparty, ?method, ?minAmount/?maxAmount (integer minor units), and ?from/?to (the single date the row displays); see the API reference for each parameter's values.
GET /v1/payments/:idA single payment's detail, in any lifecycle state.

Statements

Method & pathDescription
GET /v1/statementsAvailable monthly account statements. Filter with ?account (an id from /v1/accounts), ?month=2026-06, and ?year=2026.
GET /v1/statements/:id/downloadA short-lived signed URL to download a statement PDF.

Invoices

Method & pathDescription
GET /v1/invoicesInvoices you've sent — money in. Filter with ?recipient (name substring), ?number (exact), ?dueFrom/?dueTo (due-date range), ?overdue=true (due before today — a due-date test only; invoices carry no payment status), ?from/?to (issue-date range).
GET /v1/invoices/:idA single invoice's detail — the list row plus the sender's note and its line items.
GET /v1/invoice-recipientsThe customers you bill — who your invoices are sent to, with each billing address.

Treasury

Method & pathDescription
GET /v1/treasury/summaryTreasury (invested) account overview: total value (matches /v1/accounts), cash to trade, net yield (bps), earnings.
GET /v1/treasury/positionsTreasury holdings in one uniform row shape (cash / MMF / T-bill / …), with per-position net yield (bps). Holdings are a small bounded set, so all of them come back in one page — this route takes no limit/cursor.
GET /v1/treasury/ratesCurrent money-market fund rates (gross + net of your fees), highest-yield highlights, cash-sweep rate.

Accounting

Method & pathDescription
GET /v1/accounting-connectionsAccounting integrations (QuickBooks/Xero links + bank feeds) with normalized sync status.

Conventions

  • List envelope: list endpoints return { "data": [ … ], "nextCursor": string | null }. Page by passing nextCursor back as the cursor parameter until it's null.
  • Money: always { "minorUnits": <integer>, "currency": "USD" } — integer minor units (cents), never a float, so clients can do exact math.
  • Dates: ISO-8601 strings in UTC.
  • Tenant scoping: every response is scoped to the key's company; an id from another company is reported as not found.
  • Query parameters: each endpoint rejects any parameter it doesn't support — a typo'd filter, or one that belongs to another endpoint, is a 400 invalid_parameter rather than being silently dropped, so a filtered read is either applied or refused. A few endpoints accept filters the spec doesn't list yet, so treat the documented set as the supported minimum rather than the exact accepted set.
  • Response shapes: the exact schema of every resource is the OpenAPI spec — run arc openapi (or fetch /v1/openapi.json) rather than relying on shapes copied into prose. This page says what each resource is, not its field-by-field layout. Or browse the API reference.

Rate limits

Requests are rate-limited per key and per company — creating or rotating keys does not raise a company's ceiling. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset for whichever of the two you are closest to; a 429 carries Retry-After (seconds) and means you should back off.

Statement PDFs are generated on demand, so GET /v1/statements/:id/download draws on a separate, much smaller per-company hourly budget shared with the Arc app. Download the statements you need rather than sweeping the whole list, and cache the PDF — the signed URL expires in minutes, but re-requesting the same statement spends the budget again.