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 belowThe base URL for all endpoints is:
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:
# 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_..."
Every request to /api/v1/* requires an API key, sent as a Bearer token in the Authorization 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.
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.
| Field | Type | Description |
|---|---|---|
| emailrequired | string | A valid email. Used to label the key and for support contact. |
curl -X POST https://arcfx-backend-production.up.railway.app/api/v1/keys \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com"}'
{
"id": "key_...",
"key": "arcfx_sk_test_...",
"message": "Save this key now — it cannot be retrieved again."
}
429 issuance_limit — email support@arcfx.app if you need more.Authenticated requests are limited to 60 requests per minute, per key. Every response includes the current limit state in its headers:
| Header | Meaning |
|---|---|
| X-RateLimit-Limit | Maximum requests allowed in the window (60). |
| X-RateLimit-Remaining | Requests left in the current window. |
| X-RateLimit-Reset | Seconds until the window resets. |
Exceeding the limit returns 429 rate_limited with a Retry-After header (in seconds). Wait that long, then retry.
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.
| Param | Type | Description |
|---|---|---|
| numberrequired | string | Your invoice number, e.g. INV-001. Must match what was used to create the invoice. |
| recipientrequired | address | The recipient wallet the invoice was issued to (0x…, 40 hex chars). |
curl https://arcfx-backend-production.up.railway.app/api/v1/invoices/status\?number=INV-001\&recipient=0xAbC... \
-H "Authorization: Bearer arcfx_sk_test_..."
{
"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..."
}
}
{
"paid": false,
"invoiceNumber": "INV-001",
"recipient": "0xAbC..."
}
Returns indexed payments, newest first. Includes both single payments and multisend recipient records. Optionally filter to a single payer.
| Param | Type | Description |
|---|---|---|
| limitoptional | integer | How many to return. Default 20, maximum 100. |
| payeroptional | address | Filter to payments sent from this wallet (0x…). |
curl https://arcfx-backend-production.up.railway.app/api/v1/payments\?limit=5 \
-H "Authorization: Bearer arcfx_sk_test_..."
{
"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 return a non-2xx status and a JSON body with an error code and a human-readable message.
| Status | Error | When |
|---|---|---|
| 400 | invalid_email | The email on key issuance is missing or malformed. |
| 401 | missing_api_key | No Authorization: Bearer header was sent. |
| 401 | invalid_api_key | The key is malformed, unknown, or revoked. |
| 429 | rate_limited | Over 60 requests/minute on this key. See Retry-After. |
| 429 | issuance_limit | Over 3 key requests from your IP today. |
| 400 | — | A required query parameter is missing or invalid. |