Reference

Public API

Read public profiles and claims over HTTP. No account or key is needed, and responses never contain a balance, position, trade or credential.

Examples use $API_URL, the address of the API you are reading from. Every response is JSON. Errors have the shape { "error": "code" }.

Get a public profile

GET /public/profiles/:address
curl "$API_URL/public/profiles/0xYourAddress"

Returns the combined record at an address: an optional on-chain profile (name and bio) and the tracks array, which holds one entry, all accounts added together.

Response
{
  "address": "0x…",
  "privacyMode": false,
  "profile": { "name": "…", "bio": "…", "updatedAt": 1789000000 },
  "tracks": [{
    "statement": {
      "trackName": "All accounts",
      "since": "2026-09-18T12:00:00.000Z",
      "trackedDays": 12,
      "metrics": {
        "return": "0.0421",
        "maxDrawdown": "0.0210",
        "sharpe": "1.32",
        "winRate": { "value": "0.58", "closedTrades": 24 }
      },
      "computedAt": "2026-09-30T12:00:00.000Z"
    },
    "unavailable": []
  }],
  "origin": { "mechanism": "A0", "collector": "9c177b47…c134" }
}

Ratios are decimal strings, so "0.0421" is 4.21%. A metric that cannot be computed yet is missing from metrics and listed in unavailable. In privacy mode the response is { "privacyMode": true, "profile": null, "tracks": [] }.

StatusMeaning
400 not_an_addressThe path is not a 0x address.
404 no_public_profileNothing is public at that address.
502 profile_unavailableThe data source could not be reached. Retry.

Get the return curve

GET /public/profiles/:address/series?range=30d
curl "$API_URL/public/profiles/0xYourAddress/series?range=30d"

range is one of 24h, 7d, 30d, 1y, 5y or max (the default). The response has points, each with timeMs and returnFraction (return since the start of the range), plus stepMs and sinceMs. Errors: 400 for a bad address or range, 404 when nothing is public.

Get the collector

GET /public/collector
curl "$API_URL/public/collector"

Returns { "mechanism": "A0", "collector": "<fingerprint>" }: the key that signs the figures this instance reads from exchanges. collector is null when no signing key is configured. Profiles and claims carry the same origin. Compare the fingerprint with a list of collectors you trust; one that is not on your list is self-attested. See Verify a proof.

Get a claim

GET /public/claims/:digest
curl "$API_URL/public/claims/$DIGEST"

The digest is the identifier in a claim link (/c/<digest>).

Response
{
  "digest": "7a34269267a8…",
  "owner": "0x…",
  "claimSet": {
    "identityId": "0x…",
    "trackId": "all",
    "periodStart": "2026-09-18T12:00:00.000Z",
    "periodEnd": "2026-09-30T12:00:00.000Z",
    "claims": [{ "type": "LE", "metric": "maxDrawdown", "threshold": "0.03" }],
    "audience": "public",
    "expiresAt": "2026-10-30T12:00:00.000Z"
  },
  "publishedAt": "2026-09-30T12:00:00.000Z",
  "verification": "owner_signed_collector_attested",
  "origin": { "mechanism": "A0", "collector": "9c177b47…c134" }
}

Predicate types are GE (at least) and LE (at most). The response never includes the figure behind the statement. Errors: 404 when it does not exist or is not public, 410 when it has expired.

The digest is the SHA-256 of the claim set in canonical JSON (RFC 8785), which is what the owner signed.

Notes

  • Public reads are cached for up to a minute; each profile says when it was computed.
  • Requests from a browser must come from an origin the API allows. Server-side use has no such limit.
  • Ownership and registration can also be read straight from the chain. See Contracts.
Public API