Bank Accounts
API Reference
Sync Now

Sync Now

Who calls these endpoints?External API (s2s)
Base path
/api/v1/bank-connect
Identity
Ed25519 request signature on every request — X-Key-Id, X-Date, X-Nonce, X-Signature. ±5 min clock window, single-use nonce. A Bearer token or a panel session is not accepted here (401 AUTH_HEADERS_MISSING).
Authorization
The key must carry the Bank Connections product (BANK_CONNECT) and the permission for the endpoints on this page: bank-connect:view. Without the product the call gets 403 PRODUCT_NOT_ENABLED; without the permission 403 API_INSUFFICIENT_SCOPE. See API Introduction › Permissions.
Cross-surface
These endpoints are the s2s surface — call them from your own server with a signed request. The same data has screens in the panel, but panel endpoints cannot be called with an API key, and these endpoints cannot be called with a panel session. Connecting and disconnecting a bank is done only in the panel.

POST /api/v1/bank-connect/accounts/{accountId}/sync asks for an account to be read from the bank again. The endpoint returns no account data and changes no data; it only brings the read forward. When the read completes, new transactions arrive by webhook and the account's lastSuccessfulSyncAt advances.

⚠️

A sync request does not shorten the read interval. If minSyncIntervalSeconds has not elapsed since the account was last read, the read does not happen immediately; it is scheduled for nextSyncAvailableAt. Sending repeated requests to this endpoint does not speed up the read.

Request

There is no body. The bank-connect:view permission is enough.

source lunixi-sign.sh
REQ_PATH="/api/v1/bank-connect/accounts/00000000-0000-0000-0000-000000000100/sync"
lunixi_sign POST "$REQ_PATH"
 
curl -X POST "https://api-gateway.lunixi.com$REQ_PATH" \
  -H "X-Key-Id: $LUNIXI_KEY_ID" \
  -H "X-Date: $DATE" \
  -H "X-Nonce: $NONCE" \
  -H "X-Signature: $SIGNATURE"

$bankConnect in the PHP example: API Introduction › PHP SDK.

Response

A successful request returns 202 Accepted:

{
  "status": "success",
  "code": "SUCCESS",
  "data": {
    "accountId": "00000000-0000-0000-0000-000000000100",
    "syncStatus": "SCHEDULED",
    "scheduledAt": "2026-01-01T07:20:00.000Z",
    "lastSuccessfulSyncAt": "2026-01-01T07:05:00.000Z",
    "minSyncIntervalSeconds": 900
  },
  "statusCode": 202,
  "requestId": "00000000-0000-0000-0000-000000000000"
}
FieldTypeDescription
accountIdstring (UUID)The account's ID.
syncStatusstringQUEUED or SCHEDULED; see below.
scheduledAtstringThe moment the read starts or started.
lastSuccessfulSyncAtstringTime of the last successful read from the bank. Absent if there has been no read yet.
minSyncIntervalSecondsintegerShortest time between two reads (seconds). The value in the example is only an example.

syncStatus

ValueMeaning
QUEUEDThe read interval has elapsed; the read was started or queued. It does not mean the read has finished.
SCHEDULEDThe read interval has not elapsed yet; the read will happen at scheduledAt.

Behaviour

  • A pending read is merged. If a read is already pending, no new one is opened; a second request returns the same scheduled read.
  • Other accounts may be refreshed too. The read may cover your other accounts read in the same round as this account; their lastSuccessfulSyncAt may advance as well.
  • The connection must be readable. If the account's connection is not ACTIVE or DEGRADED, the request returns 409 bank_connect.connection.not_active. Check the connection status with the Connections endpoint.

Tracking the result

Do not poll for the result of a sync request; use one of these two ways:

Sync request and its resultFlow: a sync request is QUEUED when the read interval has elapsed and SCHEDULED for scheduledAt when it has not; the read then happens, a webhook arrives for each new transaction, and the account freshness lastSuccessfulSyncAt advances whether or not there were new transactions.INTERVAL PASSEDTOO EARLYSync requestPOST …/syncQUEUEDread startsSCHEDULEDat scheduledAtRead fromthe bankWebhookper new transactionFreshnesslastSuccessfulSyncAtLEGENDsyncStatusTHE READHOW YOU SEE THE RESULT
Do not poll. QUEUED means the read has started or is queued, not that it has finished. Without new transactions no event arrives; read the account once after scheduledAt and check lastSuccessfulSyncAt.
  1. Webhook. If the read finds new transactions, a bank_account.transaction.received event arrives for each one. → Webhook Events
  2. Freshness. If there are no new transactions, no event arrives; you can tell the read happened when the account's freshness.lastSuccessfulSyncAt advances. Read the account once after scheduledAt. → Accounts

Request limit

This endpoint is limited to 6 requests per minute per API key. When the limit is exceeded the request returns 429 RATE_LIMITED; the response's Retry-After header and details.retryAfterSeconds field tell you how many seconds to wait. Read endpoints do not count towards this limit. → Limits

Errors

HTTPcodeWhat to do
404bank_connect.account.not_foundCheck the ID and your key's environment.
409bank_connect.connection.not_activeThe connection is not readable; check its status. Retrying does not change the result.
429RATE_LIMITEDWait for Retry-After and retry. → Rate Limits