POST the claim URL once. On success you receive an access URL as text/plain:https://{username}:{password}@api.synci.io/simplefin{access URL}/accounts using HTTP Basic auth built from the embedded username:password.403 whose body begins with Forbidden.403.GET {access URL}/accounts returns a SimpleFIN Account Set. It is called in two shapes:GET /accounts?balances-only=1transactions array.GET /accounts?start-date={epoch}&end-date={epoch}&pending=1&account={id}&account={id}start-date / end-date are Unix timestamps in seconds. end-date is exclusive.pending=1 includes not-yet-posted transactions.account={id} to limit the response to specific accounts. Ids not exposed by this connection are ignored.start-date is omitted, the response is capped to roughly the last 90 days.{
"errors": [],
"accounts": [
{
"org": {
"domain": "inst-916407839591829.synci.io",
"sfin-url": "https://api.synci.io/simplefin",
"name": "DNB"
},
"id": "916407839591829",
"name": "DNB Brukskonto",
"currency": "NOK",
"balance": "12345.67",
"available-balance": "12000.00",
"balance-date": 1767225600,
"transactions": [
{
"id": "935986745228429",
"posted": 1767139200,
"transacted_at": 1767052800,
"amount": "-129.00",
"description": "REMA 1000 OSLO",
"payee": "REMA 1000",
"pending": false
}
]
}
]
}balance, available-balance, transaction amount) are signed decimal strings with exactly two decimal places. A negative amount is an outflow.posted, transacted_at, balance-date) are Unix seconds at noon UTC of the relevant calendar date.id, transaction id) are stable across requests, so consumers can safely deduplicate on them.payee is always present and non-empty.transacted_at.org identifies the underlying institution, not Synci: org.name is the institution's name (for example "DNB") and org.domain is stable and unique per institution. Consumers that group accounts into "banks" by org.domain therefore get one bank per institution, and multiple accounts from the same institution are grouped together.available-balance is included only when Synci has one for the account.start-date is given.1.0, which the protocol's info endpoint reports as {"versions":["1.0"]}. An issued access URL is permanent for the life of the credential. Any breaking change would ship as a new protocol version and new credentials rather than altering an existing access URL, so a working integration keeps working.