Accurendocs
Access dApp

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

terminal
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.

GET/v1/wallets

List the addresses you are watching

POST/v1/wallets

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.
response
{
  "address": "0x7a1c…4f9e",
  "label": "ledger",
  "watchingFrom": { "block": 44901772, "date": "2026-08-14" },
  "backfill": { "status": "running", "coverageGaps": [] }
}
DELETE/v1/wallets/{address}

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.

GET/v1/positions

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.
response
{
  "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"
    }
  ]
}
GET/v1/basis

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.
response
{
  "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.

GET/v1/events

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.
response
{
  "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
    }
  ]
}
GET/v1/portfolio

Everything the dashboard reads, in one call: totals, positions, alerts and recent activity

response
{
  "summary": {
    "valueUsd": "774158.79",
    "positionCount": 6,
    "pricedPositions": 6,
    "positionsWithBasis": 4,
    "fxCurrency": "SGD"
  },
  "alerts": [{ "kind": "unclassified_transfers", "severity": "warning" }]
}
GET/v1/multiplier

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.
response
{
  "token": "NVDA",
  "changes": [
    { "block": 44901772, "date": "2026-08-14", "from": "1.0338", "to": "1.0341", "source": "chain_storage" }
  ],
  "coverage": { "from": "2025-11-14", "gaps": [] }
}
PATCH/v1/events/{id}

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.
response
{
  "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.

POST/v1/exports

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.
response
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,…
GET/v1/fx/{currency}/{YYYY-MM-DD}

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.
response
{
  "quote": "SGD",
  "date": "2026-08-14",
  "rate": "1.3410",
  "source": "ecb-via-frankfurter",
  "carriedForward": false
}
GET/v1/webhooks

List your endpoints, with their failure counts

POST/v1/webhooks

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.
response
{
  "id": "wh_7c31",
  "url": "https://example.com/hooks/accuren",
  "kinds": ["accrued-income", "token-paused"],
  "secret": "whsec_…",
  "enabled": true
}
PATCH/v1/webhooks/{id}

Change the URL, the subscribed kinds, or enable and disable it

DELETE/v1/webhooks/{id}

Remove an endpoint

GET/v1/webhooks/deliveries

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.

⌘I