CoinWorldCap Developer Request a key

Endpoints · v1 / Assets

GET https://open-api.coinworldcap.com/openapi/v1/assets

Returns a paginated list of crypto assets (coins/tokens).

Query parameters

You can combine id, symbol, and slug in one request — they're ANDed together.

Sorting on a non-unique column (name, symbol) has id appended as a tiebreaker, so paging through such a sort never repeats or skips a row.

Do not treat symbol as a unique identifier. Tickers are reused by unrelated assets, so a symbol filter may match more than one — and where it matches exactly one, that is not a guarantee we can make for the future. If you need to resolve exactly one asset, use id or slug, both of which are unique per asset and stable.

Use id as your join key once you have resolved an asset. slug is unique and stable too, but id is stable, unique, and the one our support team can act on.

Response

Envelope fields

Field Type Notes
code integer 0 on success. Branch on this, never on message.
message string English fallback copy, derived from message_key. Wording may change; the key will not.
message_key string Stable identifier to localise from.
result object Always present. {} on error — never null, and never absent.

result.items is always an array, [] when nothing matches — never null.

total_page is never below 1, so a filter that matches nothing answers total: 0 with total_page: 1 and an empty items — a client looping while page <= total_page reads one empty page rather than none. /quotes pages identically.

total is a snapshot count, not transactionally consistent with items. The count and the page are two statements, and the upstream cron can upsert between them, so a page can disagree with its total by a row or two. Paginate by page/offset, treat total as approximate, and do not assert sum(len(items)) == total across a walk.

total is how many assets we currently list, not how many exist. An asset we have not picked up is absent, and one we stop carrying stops being listed — so total can go down as well as up. Use it to page through our data, never as a market-wide count.

Item fields

Field Type Notes
id integer Unique asset id.
rank integer, optional Market-cap rank, starting at 1. The field is absent when no rank is available for that asset — it is not 0 and not null. Expected for very new or untracked assets, and not an error. Previously this was published as rank: 0 for those assets — a magic value meaning "unknown" that nothing in the response explained; if your client treats a missing field as 0, nothing changes for you.
name string
symbol string Ticker symbol — not unique, see note above.
slug string Unique identifier. Not necessarily URL-safe — see the warning under /categories' parameters; encode it before putting it in a query string.
logo string Logo image URL. The host is elided in the example above on purpose: it is not part of this contract and may change without notice, so do not hard-code it and do not infer it from a sample response. If your environment needs the domain on an egress allowlist, email [email protected] for the current one.
explorers array of strings Block-explorer URLs for the asset. Always present, [] when we have none — never null. Unlike links this needs no fields= flag: it is a top-level field, and gating one field behind another's switch would make the shape guesswork.
links object, optional Only present when fields=links is passed. See below.
json
"links": {
  "website": "https://bitcoin.org/",
  "whitepaper": "https://bitcoin.org/bitcoin.pdf"
}
Field Notes
website Official website URL, or "" if unknown.
whitepaper Whitepaper URL, or "" if we have none.

Every value here is a string, and it will stay that way: anything list-shaped goes at the item top level instead (that is why explorers is not in here), so a client modelling links as a string dictionary keeps working.

Not implemented

Absent by design in v1, so you do not build against it: there is no quota or credit accounting — no monthly allowance, no per-request credit cost, and no code for exhausting one. Rate limiting itself is live; see Rate limiting.

Examples

/assets reads id, symbol, slug, page, size, limit, offset, sort and fields. links is the only name fields recognises today; an unrecognised name in it — like any parameter not on that list — is ignored rather than rejected, though the 100-value cap applies to fields as it does to id, symbol and slug.

bash
# Default listing (20 items, sorted by id ascending)
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/assets"

# Page-based pagination, sorted by name descending
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/assets?page=2&size=50&sort=name:desc"

# The other paging mode, limit/offset — sending page as well makes page win
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/assets?limit=50&offset=100"

# Look up specific assets by slug, which is unique — use symbol instead and one
# ticker can come back as several unrelated assets
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/assets?slug=bitcoin,ethereum"

# The opt-in links object, on a single asset picked by id
curl -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/assets?id=1&fields=links"

# Show the response headers, including X-Request-Id
curl -i -H "X-Api-Key: <your-api-key>" \
  "https://open-api.coinworldcap.com/openapi/v1/assets?limit=1"

Anything other than a 200 is in Errors, which covers every endpoint here.