Endpoints · v1 / Assets
Returns a paginated list of crypto assets (coins/tokens).
Query parameters
pageinteger1-based page number. When present, pagination usespage/sizeinstead oflimit/offset. Must be>= 1.sizeintegerDefault20Page size when usingpage. Max 100 — above it is a400.0or a negative value falls back to the defaultlimitintegerDefault20Max rows to return when not usingpage. Max 100 — above it is a400.0or a negative value falls back to the defaultoffsetintegerDefault0Rows to skip when not usingpage. Must be>= 0and at most100000. The cap is far past the end of the dataset.idcomma-separated list of integersFilter by exact asset id(s). Max 100 values.symbolcomma-separated list of stringsFilter by ticker symbol(s). Max 100 values. Not unique — see note below.slugcomma-separated list of stringsFilter by slug(s). Max 100 values. Slug is unique per asset.sortstringDefaultid:ascFormat<key>[:asc|desc]. Allowed keys:id,name,symbol,slug— these are API key names, not storage names, so how we store an asset can change without changing this list. Defaults toid:ascif omitted.fieldscomma-separated listOpt-in extra response fields. Currently supported:links.
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
symbolas 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, useidorslug, both of which are unique per asset and stable.Use
idas your join key once you have resolved an asset.slugis unique and stable too, butidis 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.
totalis a snapshot count, not transactionally consistent withitems. The count and the page are two statements, and the upstream cron can upsert between them, so a page can disagree with itstotalby a row or two. Paginate bypage/offset, treattotalas approximate, and do not assertsum(len(items)) == totalacross a walk.
totalis 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 — sototalcan 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. |
links (opt-in via fields=links)
"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.
# 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.