Developer reference

ArcFX API

A read API over ArcFX's on-chain payment activity. Check whether an invoice has been paid, and pull payment history — all indexed from Arc and served as JSON. Authenticate with an API key; no wallet or signing required.

Arc Testnet · base URL below

Quickstart

The base URL for all endpoints is:

Base URL
https://arcfx-backend-production.up.railway.app

Three steps to your first call: request a key with your email, then send it as a Bearer token. For example, to check an invoice:

cURL
# 1. Get a key (returned once — save it)
curl -X POST https://arcfx-backend-production.up.railway.app/api/v1/keys \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com"}'

# 2. Use it to check an invoice's paid status
curl https://arcfx-backend-production.up.railway.app/api/v1/invoices/status\?number=INV-001\&recipient=0xYourAddress \
  -H "Authorization: Bearer arcfx_sk_test_..."

Authentication

Every request to /api/v1/* requires an API key, sent as a Bearer token in the Authorization header:

Header
Authorization: Bearer arcfx_sk_test_xxxxxxxxxxxxxxxx

Keys are scoped to Arc Testnet and prefixed arcfx_sk_test_. Treat your key like a password — it's stored only as a hash on our side and shown to you exactly once at issuance.

Get an API key

POST/api/v1/keys

Issues a new Testnet API key. Self-serve — no key required to call this. The key is returned once in the response and cannot be retrieved again, so save it immediately.

Body parameters

FieldTypeDescription
emailrequiredstringA valid email. Used to label the key and for support contact.
Request
curl -X POST https://arcfx-backend-production.up.railway.app/api/v1/keys \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com"}'
Response · 201
{
  "id": "key_...",
  "key": "arcfx_sk_test_...",
  "message": "Save this key now — it cannot be retrieved again."
}
Issuance is limited to 3 keys per IP per day. Past that you'll get a 429 issuance_limit — email support@arcfx.app if you need more.

Rate limits

Authenticated requests are limited to 60 requests per minute, per key. Every response includes the current limit state in its headers:

HeaderMeaning
X-RateLimit-LimitMaximum requests allowed in the window (60).
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetSeconds until the window resets.

Exceeding the limit returns 429 rate_limited with a Retry-After header (in seconds). Wait that long, then retry.

Invoice status

GET/api/v1/invoices/status

Check whether a specific invoice has been paid. Matches an invoice number against on-chain payments to the given recipient. This is the endpoint to poll while waiting for a payment to settle.

Query parameters

ParamTypeDescription
numberrequiredstringYour invoice number, e.g. INV-001. Must match what was used to create the invoice.
recipientrequiredaddressThe recipient wallet the invoice was issued to (0x…, 40 hex chars).
Request
curl https://arcfx-backend-production.up.railway.app/api/v1/invoices/status\?number=INV-001\&recipient=0xAbC... \
  -H "Authorization: Bearer arcfx_sk_test_..."
Response · paid
{
  "paid": true,
  "invoiceNumber": "INV-001",
  "recipient": "0xAbC...",
  "payment": {
    "txHash": "0x...",
    "payer": "0x...",
    "token": "USDC",
    "gross": "100.00",
    "fee": "0.10",
    "net": "99.90",
    "blockNumber": 46716837,
    "blockTime": "2026-06-12T...",
    "explorer": "https://testnet.arcscan.app/tx/0x..."
  }
}
Response · not yet paid
{
  "paid": false,
  "invoiceNumber": "INV-001",
  "recipient": "0xAbC..."
}

Payments

GET/api/v1/payments

Returns indexed payments, newest first. Includes both single payments and multisend recipient records. Optionally filter to a single payer.

Query parameters

ParamTypeDescription
limitoptionalintegerHow many to return. Default 20, maximum 100.
payeroptionaladdressFilter to payments sent from this wallet (0x…).
Request
curl https://arcfx-backend-production.up.railway.app/api/v1/payments\?limit=5 \
  -H "Authorization: Bearer arcfx_sk_test_..."
Response · 200
{
  "count": 1,
  "payments": [
    {
      "txHash": "0x...",
      "payer": "0x...",
      "recipient": "0x...",
      "token": "USDC",
      "gross": "100.00",
      "fee": "0.10",
      "net": "99.90",
      "blockNumber": 46716837,
      "blockTime": "2026-06-12T...",
      "explorer": "https://testnet.arcscan.app/tx/0x..."
    }
  ]
}

Errors

Errors return a non-2xx status and a JSON body with an error code and a human-readable message.

StatusErrorWhen
400invalid_emailThe email on key issuance is missing or malformed.
401missing_api_keyNo Authorization: Bearer header was sent.
401invalid_api_keyThe key is malformed, unknown, or revoked.
429rate_limitedOver 60 requests/minute on this key. See Retry-After.
429issuance_limitOver 3 key requests from your IP today.
400A required query parameter is missing or invalid.
Questions, higher limits, or production access? Email support@arcfx.app.