The /v1 REST API is what the arc CLI is built on. It's
read-only today.
Base URL
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 & path | Description |
|---|
GET /v1/me | The identity behind the key (company, owner, key metadata). |
GET /v1/profile | The key owner's personal profile (name, email, phone, address, and KYC details when verified). |
GET /v1/organization | The company's organization profile (legal name, DBA, masked EIN, phone, legal address). ?investmentPreferences=true also returns investment preferences. |
GET /v1/users | Company members — name, email, role, status. Filter with ?role, ?status, ?email (exact, any casing), ?name (substring). |
Accounts & transactions
| Method & path | Description |
|---|
GET /v1/accounts | Cash-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/cards | Arc-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-accounts | Linked external bank accounts (the app's "Linked Accounts") — institution, masked number, type, status. Filter with ?type=checking|savings and ?status=active|inactive. |
GET /v1/transactions | Cash-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/:id | A single transaction's detail, including isInternalTransfer. |
Payments
| Method & path | Description |
|---|
GET /v1/payments | Outgoing 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/:id | A single payment's detail, in any lifecycle state. |
Statements
| Method & path | Description |
|---|
GET /v1/statements | Available monthly account statements. Filter with ?account (an id from /v1/accounts), ?month=2026-06, and ?year=2026. |
GET /v1/statements/:id/download | A short-lived signed URL to download a statement PDF. |
Invoices
| Method & path | Description |
|---|
GET /v1/invoices | Invoices 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/:id | A single invoice's detail — the list row plus the sender's note and its line items. |
GET /v1/invoice-recipients | The customers you bill — who your invoices are sent to, with each billing address. |
Treasury
| Method & path | Description |
|---|
GET /v1/treasury/summary | Treasury (invested) account overview: total value (matches /v1/accounts), cash to trade, net yield (bps), earnings. |
GET /v1/treasury/positions | Treasury 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/rates | Current money-market fund rates (gross + net of your fees), highest-yield highlights, cash-sweep rate. |
Accounting
| Method & path | Description |
|---|
GET /v1/accounting-connections | Accounting 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.