CoinWorldCap Developer Support Request a key

Best practices and FAQ

How to build a client against the CoinWorldCap API that stays correct and inside its rate limit.

Identify by id, not by symbol

A symbol is not unique — one ticker can return several unrelated assets (/assets). Look an asset up once, by slug or by contract address, keep the id that comes back, and send that from then on. On /exchanges a slug is not unique either, so keep the exchange's id too.

Assets and RWAs share one id column, but an RWA's id finds nothing on /assets and an asset's finds nothing on /rwa. Exchanges and people are numbered separately, so the same number can name an asset and an unrelated exchange. Keep track of which endpoint an id came from. A DEX token has no numeric id to send: it is named by chain_slug and address (DEX tokens: what the endpoints share).

Poll no faster than the data changes

Each dataset is rebuilt on its own schedule, and calling more often than that spends your allowance on the same numbers. Cache a response for about its dataset's interval; Data methodology lists the intervals we publish and the field that dates each response.

To follow many assets, ask for them together: /assets, /quotes and /rwa take up to 100 ids in one id parameter. Send limit=100 with them — the default page is 20 rows — and a watchlist of 100 costs one request rather than one per asset.

Retry only what is retryable

Response What to do
429, code 42900 Wait at least Retry-After seconds, then retry. Rate limiting explains why the wait can exceed a minute.
503, code 50300 Retry with exponential backoff and random jitter — say 1, 2, 4 and 8 seconds, then give up for a while. It carries no Retry-After.
500, code 50000 Retry a few times with the same backoff. If it persists, tell us, quoting the X-Request-Id.
400, 401, 404 Do not retry unchanged: the same request gets the same answer. Fix the parameters, the key or the id. The exception is /global's 404 — see Errors.

Narrow a list instead of paging through it

offset stops at 100,000 (Errors). Filter or sort so that the rows you want come first. /dex/tokens/trades and /dex/tokens/liquidity page by cursor instead: pass next_cursor back exactly as it came until it is null.

Fetch history in ranges

With time_start, a range that holds more points than one response may carry is a 400, not a shorter answer (History: what the endpoints share). To load a long history, ask for consecutive ranges that each stay within that cap. Both ends of a range are included, so start the next range one interval after the last point you received. On /earn/history the cap counts every product: ask for one platform at a time with provider_id. For a recent chart, leave out time_start.

To keep a stored history current, ask again from a little before your newest point and replace points by time: recent points can still be revised for a while after they first appear.

Check parameter names

A query parameter an endpoint does not read is ignored, not rejected, so a misspelt filter — chain_slg=solana — returns the unfiltered list with a 200. Compare the names you send with the endpoint's parameter table.

FAQ

How often is the data rebuilt, and how old is a response? Data methodology lists the intervals we publish, and names the field that dates each response.

Why does an id return nothing? Usually one of three things. The id belongs to another family: an RWA's id sent to /assets matches nothing, because RWAs are listed by /rwa. Or a filter on a list matched nothing: that is an empty page, not a 404. Or the resource does not exist: an endpoint that returns one resource answers 404 with code 40400, and retrying will not help (Errors).

Where does each history start? It depends on the dataset, and on the asset: Data methodology lists them. A daily range that starts before the history does is not an error: it returns fewer points, or none. Hourly ranges have a limit of their own (History: what the endpoints share).

Why is an exchange missing from /exchanges? It lists centralized exchanges only; a decentralized exchange's id or slug matches nothing there (/exchanges).