Reference
API reference
A read-only REST API over your own position history. Every request needs a bearer token; no token carries a signing scope, because there is no signing path to scope.
Authentication
curl https://api.accuren.xyz/v1/positions \
-H "Authorization: Bearer $ACCUREN_API_KEY"Scopes, key rotation, and why agents get their own key are covered in Authentication.
Conventions
- Base URL
- https://api.accuren.xyz
- Amounts
- Decimal strings, never floats — a rounded basis is a wrong basis.
- Dates
- ISO 8601. A date means the day the event happened on chain.
- Provenance
- Every converted figure carries its rate, source, and rate date.
- Replays
- Changing a country rule rebuilds history; affected reads return 409 until it settles.
Wallets
Public addresses you are watching. Adding one starts live recording immediately, because multiplier history cannot be backfilled.
List the addresses you are watching
Watch a public address — no signature, no key
- address string
- Public address. Never a key or a seed phrase.
- label string
- Yours. Unlabelled addresses of your own look like a stranger's.
{
"address": "0x7a1c…4f9e",
"label": "ledger",
"watchingFrom": { "block": 44901772, "date": "2026-08-14" },
"backfill": { "status": "running", "coverageGaps": [] }
}Stop watching and delete the records derived from it
Positions
What you hold, what it is worth in real shares, and what it cost — in your reporting currency.
Balances, multiplier, share equivalence, basis
- currency string
- Not a parameter yet — figures follow the account’s chosen currency, and USD when it has chosen none.
- wallet string
- Limit to one address.
{
"positions": [
{
"token": "NVDA",
"balance": "120.0",
"multiplier": { "at": "1.0341", "from": "1.0000" },
"sharesEquivalent": "124.092",
"costBasis": "S$ 100,394",
"unreportedIncome": "S$ 3,783",
"encumbered": "40.0"
}
]
}Lots, disposals, and realised gains
- token string
- Filter to one token.
- lotMatching string
- Not honoured yet. The response states the rule it actually used (fifo) rather than accepting one it would ignore.
{
"token": "NVDA",
"currency": "SGD",
"lots": [
{ "acquired": "2025-10-02", "qty": "80.0", "basis": "67,710", "rate": "1.3204" }
],
"accruedIncomeAddedToBasis": "3,783",
"lotMatching": "fifo"
}Events and history
The trail behind every figure — including the income events that have no transaction anywhere in your wallet.
Every event, income with no wallet transaction included
- type string
- e.g. income.multiplier_increase, collateral_post.
- from / to date
- ISO dates, inclusive.
- needsReview boolean
- Only events an ai label has not had confirmed.
{
"events": [
{
"id": "evt_9f21",
"block": 44901772,
"type": "income.multiplier_increase",
"token": "NVDA",
"from": "1.0338",
"to": "1.0341",
"income": { "usd": "61.40", "sgd": "82.34", "rate": "1.3410", "rateDate": "2026-08-14" },
"walletTransaction": null
}
]
}Everything the dashboard reads, in one call: totals, positions, alerts and recent activity
{
"summary": {
"valueUsd": "774158.79",
"positionCount": 6,
"pricedPositions": 6,
"positionsWithBasis": 4,
"fxCurrency": "SGD"
},
"alerts": [{ "kind": "unclassified_transfers", "severity": "warning" }]
}Multiplier history for a token, with coverage gaps
- token string
- Required.
- at date
- The value that applied on that date, not the value now.
- from date
- Start of a range.
{
"token": "NVDA",
"changes": [
{ "block": 44901772, "date": "2026-08-14", "from": "1.0338", "to": "1.0341", "source": "chain_storage" }
],
"coverage": { "from": "2025-11-14", "gaps": [] }
}Resolve an event that needs review, by saying who owns the other address
- relationship string
- self, exchange, counterparty, or contract. Required.
- label string
- A name for the address, for your own reading.
- note string
- Why you classified it that way.
{
"id": "0x9f2…:transfer",
"counterparty": "0x1a2b…",
"relationship": "self",
"taxable": false,
"needsReview": false,
"alsoSettled": 29,
"stillNeedingReview": 1
}Exports and webhooks
Getting the record out, and hearing about it when something changes.
Build an export and stream it back as CSV
- format string
- positions, activity, multipliers, gains, or koinly. Defaults to positions. Anything else is 400 unsupported_format, with the list.
HTTP/1.1 200 OK
content-type: text/csv; charset=utf-8
content-disposition: attachment; filename="accuren-koinly-2026-08-30.csv"
cache-control: no-store
Date,Sent Amount,Sent Currency,Received Amount,Received Currency,Label,…The rate that applied on a date, with where it came from
- currency string
- One of the 20 currencies the ECB reference set publishes against USD.
- date date
- ECB publishes on business days. A weekend returns the last published day and says so.
{
"quote": "SGD",
"date": "2026-08-14",
"rate": "1.3410",
"source": "ecb-via-frankfurter",
"carriedForward": false
}List your endpoints, with their failure counts
Register an endpoint. Deliveries are signed and retried.
- url string
- HTTPS endpoint. Required.
- description string
- For your own reading.
- kinds string[]
- Alert kinds to subscribe to. Empty means all. An unknown kind is refused with 400 rather than dropped — silently ignoring it would subscribe you to less than you asked for.
{
"id": "wh_7c31",
"url": "https://example.com/hooks/accuren",
"kinds": ["accrued-income", "token-paused"],
"secret": "whsec_…",
"enabled": true
}Change the URL, the subscribed kinds, or enable and disable it
Remove an endpoint
What was sent, what answered, and what is being retried
Errors
Every failure returns a typed error with a code and a link to the page that explains it. Status codes, rate limits, and why a 409 is normal are in Errors and limits.