The key works
A JSON body comes back. Nothing else to do.
Agents authenticate against Tatum by sending an API key in the x-api-key header on every request. No token exchange, no refresh, no callback URL.
One header on every request, against every route on every chain. That is the entire auth surface.
GET /v4/data/wallet/portfolio?address=0x…&chain=ethereum-mainnet Host: api.tatum.io x-api-key: t-6890…c0b8 Read the key from the environment everywhere. Never commit it, and never put it in client-side code.
TATUM_API_KEY env in your MCP client JSON Lives in the editor config, never in the repo.
.env or a secret manager Server side only. The key is not public.
GitHub Actions · GitLab · Vercel · Cloudflare One key per environment, so you can rotate one at a time.
export TATUM_API_KEY=… Fine for scratch work. Rotate the key when you are done.
A JSON body means the key works. Anything else is one of three answers, and each one tells you exactly what to change.
$ curl -s -H "x-api-key: $TATUM_API_KEY" \ "https://api.tatum.io/v4/data/exchange-rate?currency=ETH&basePair=USD" {"value":"3241.08","basePair":"USD"} A JSON body comes back. Nothing else to do.
Check the spelling of x-api-key and that the variable resolved.
Back off and retry. Do not hammer the API in a loop.