This workflow corresponds to n8n.io template #10969 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "hrihQYYG1y5icD2g",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Get Tokens From CMC Using Their Free API",
"tags": [
{
"id": "0MTVgNDL0NlGXyqZ",
"name": "CRYPTOSALES",
"createdAt": "2025-11-25T20:45:46.804Z",
"updatedAt": "2025-11-25T20:45:46.804Z"
},
{
"id": "vLLcwhiSm3lgtjpI",
"name": "PORTFOLIO",
"createdAt": "2025-10-30T14:01:29.686Z",
"updatedAt": "2025-10-30T14:01:29.686Z"
},
{
"id": "y9jqrrc7FyhdgP55",
"name": "NOCODB",
"createdAt": "2025-11-02T21:46:43.436Z",
"updatedAt": "2025-11-02T21:46:43.436Z"
}
],
"nodes": [
{
"id": "62d8175b-35ff-4e10-93e5-2f4fee00e849",
"name": "CLEAN CMC FIELDS",
"type": "n8n-nodes-base.set",
"position": [
-3216,
624
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "5bbaab90-6948-4a50-8d03-d9abc4df5164",
"name": "SOURCE",
"type": "string",
"value": "=COINMARKET CAP"
},
{
"id": "8f480896-f2b5-4fcb-adcc-960ea07d4e35",
"name": "TOKEN",
"type": "string",
"value": "={{ $json.data.name }}"
},
{
"id": "18b88dc7-f8d2-4fb6-956d-fdf1c9d4c516",
"name": "TICKER",
"type": "string",
"value": "={{ $json.data.symbol }}"
},
{
"id": "949d51e7-1ea9-49f9-80b4-a80e219523e4",
"name": "SLUG",
"type": "string",
"value": "={{ $json.data.slug }}"
},
{
"id": "fb7cd85b-dc87-4b7b-a293-c916b4b80882",
"name": "data.id",
"type": "number",
"value": "={{ $json.data.id }}"
}
]
}
},
"retryOnFail": true,
"typeVersion": 3.4,
"waitBetweenTries": 2000
},
{
"id": "b5e06bc7-db44-4f30-8b14-f51b306801b7",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
-3440,
624
],
"parameters": {
"include": "allOtherFields",
"options": {
"destinationFieldName": "data"
},
"fieldToSplitOut": "data"
},
"retryOnFail": true,
"typeVersion": 1
},
{
"id": "9c90c9af-4061-4a29-a777-3ae6c89f4da4",
"name": "CMC SPLIT IN BATCHES",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-2896,
528
],
"parameters": {
"options": {},
"batchSize": 10
},
"retryOnFail": true,
"typeVersion": 3
},
{
"id": "3ed61c72-4572-4845-89b3-e5088133f60c",
"name": "Generate Random Page",
"type": "n8n-nodes-base.code",
"position": [
-4032,
624
],
"parameters": {
"jsCode": "// \ud83e\udde9 Random CMC Listing Page Generator (sandbox-safe for n8n)\n// Includes sort direction + pseudo page calculation\n\n// --- CONFIG ---\nconst baseURL = \"https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest\";\nconst maxStart = 5000; // max offset\nconst limitOptions = [50, 100, 200];\nconst sortOptions = [\n \"market_cap\",\n \"market_cap_strict\",\n \"name\",\n \"symbol\",\n \"date_added\",\n \"price\",\n \"circulating_supply\",\n \"total_supply\",\n \"max_supply\",\n \"num_market_pairs\",\n \"market_cap_by_total_supply_strict\",\n \"volume_24h\",\n \"volume_7d\",\n \"volume_30d\",\n \"percent_change_1h\",\n \"percent_change_24h\",\n \"percent_change_7d\"\n];\nconst sortDirs = [\"asc\", \"desc\"];\n\n// --- HELPER ---\nfunction randomChoice(arr) {\n return arr[Math.floor(Math.random() * arr.length)];\n}\nfunction toQuery(params) {\n return Object.entries(params)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\n .join(\"&\");\n}\n\n// --- RANDOMIZE ---\nconst limit = randomChoice(limitOptions);\nconst start = Math.floor(Math.random() * maxStart) + 1;\nconst sort = randomChoice(sortOptions);\nconst sort_dir = randomChoice(sortDirs);\n\n// --- COMPOSE ---\nconst params = { start, limit, sort, sort_dir };\nconst query = toQuery(params);\nconst fullURL = `${baseURL}?${query}`;\nconst page = Math.ceil(start / limit);\n\n// --- OUTPUT ---\nreturn [\n {\n json: {\n description: \"Randomized CoinMarketCap Listings URL\",\n fullURL,\n params: { ...params, page }\n }\n }\n];\n"
},
"executeOnce": false,
"retryOnFail": true,
"typeVersion": 2
},
{
"id": "18d08eab-3677-4445-93ea-7a0433589fbf",
"name": "No Operation, do nothing3",
"type": "n8n-nodes-base.noOp",
"position": [
-2016,
-176
],
"parameters": {},
"typeVersion": 1
},
{
"id": "25c60872-742c-4000-96ca-d9880d794fec",
"name": "ADD TO CMC",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-2240,
-32
],
"parameters": {
"options": {}
},
"retryOnFail": true,
"typeVersion": 3
},
{
"id": "90a677fe-d31a-49cc-8c41-d9849dcd622c",
"name": "Every 3 Days At 10AM",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-4288,
624
],
"parameters": {
"rule": {
"interval": [
{
"daysInterval": 3,
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.3
},
{
"id": "96e80827-04de-464e-a52b-8fc6d7feda04",
"name": "Get Token Details From CMC",
"type": "n8n-nodes-base.httpRequest",
"position": [
-2672,
528
],
"parameters": {
"url": "=https://pro-api.coinmarketcap.com/v2/cryptocurrency/info?id={{ $json.data.id }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-CMC_PRO_API_KEY",
"value": ""
}
]
}
},
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 2000
},
{
"id": "eb6a0693-9da1-4ce0-acc0-27a7b1c93867",
"name": "EXTRACT WEBSITE",
"type": "n8n-nodes-base.set",
"position": [
-2480,
528
],
"parameters": {
"options": {
"ignoreConversionErrors": true
},
"assignments": {
"assignments": [
{
"id": "01c31061-2ae6-48b5-adc4-05424cf3e1db",
"name": "TOKEN",
"type": "string",
"value": "={{ $json.data[Object.keys($json.data)[0]].name.replace(/\\n/g, '').trim() }}"
},
{
"id": "a38788fe-5be9-42d4-b37a-2ea898cdb2c1",
"name": "TICKER",
"type": "string",
"value": "={{ $json.data[Object.keys($json.data)[0]].symbol.replace(/\\n/g, '').trim() }}"
},
{
"id": "904d3347-a60c-4553-8519-cd9a41253fef",
"name": "WEBSITE",
"type": "array",
"value": "={{$json.data[Object.keys($json.data)[0]].urls.website[0].trim()}}"
},
{
"id": "704e60c9-97a6-4605-86d3-ba8a7ae03218",
"name": "SOURCE",
"type": "string",
"value": "COINMARKETCAP"
},
{
"id": "df38721a-812a-4c45-8dc4-8709117ab928",
"name": "data[\"1\"].urls.twitter",
"type": "array",
"value": "={{ $json.data[\"1\"].urls.twitter }}"
},
{
"id": "fe374601-118f-4b52-a99e-e44979670c14",
"name": "data[\"1\"].urls.facebook",
"type": "array",
"value": "={{ $json.data[\"1\"].urls.facebook }}"
}
]
}
},
"retryOnFail": true,
"typeVersion": 3.4
},
{
"id": "4410ab68-b4c0-47b3-aea0-d3cec54b4fcf",
"name": "CLEAN WEBSITE",
"type": "n8n-nodes-base.set",
"position": [
-2208,
528
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "e2166526-866a-4d67-a61c-18853694b10c",
"name": "WEBSITE",
"type": "string",
"value": "={{ \n (() => {\n let w = $json[\"WEBSITE\"];\n if (!w) return \"\";\n // Try to parse if it\u2019s a JSON-like string\n if (typeof w === \"string\" && w.startsWith(\"[\")) {\n try { w = JSON.parse(w); } catch(e) {}\n }\n // If array, take first element\n if (Array.isArray(w)) w = w[0];\n // Force https\n return w.replace(/^http:\\/\\//, \"https://\");\n })()\n}}"
}
]
},
"includeOtherFields": true
},
"retryOnFail": true,
"typeVersion": 3.4
},
{
"id": "1d9349bc-8233-4001-ab11-151c1ec0d245",
"name": "Wait 1 Min",
"type": "n8n-nodes-base.wait",
"position": [
-2016,
528
],
"parameters": {
"unit": "minutes",
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "36e60c14-8a41-44fa-b420-8ff63bfd1c53",
"name": "Clean up Output",
"type": "n8n-nodes-base.set",
"position": [
-1616,
624
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "fd8caaf1-cbb7-410e-8263-097349f3e400",
"name": "TIMESTAMP",
"type": "string",
"value": "={{ new Date().toISOString() }}"
},
{
"id": "5d0f01df-9f9c-4911-9b2b-11d588497c7a",
"name": "BATCH NUMBER",
"type": "string",
"value": "={{ $runIndex + 1 }}"
},
{
"id": "c71ea4a6-fe97-451c-9bef-e24aeceec1b5",
"name": "DELAY SECONDS",
"type": "string",
"value": "={{ $runIndex + 1 }}"
},
{
"id": "a2bcc611-c886-4f7c-bb89-e9b8938fc3af",
"name": "TOKENS PROCESSED",
"type": "string",
"value": "={{ $items(\"Get Token Details From CMC\").length }}"
},
{
"id": "95ee3f23-d07f-413c-88ad-47e11269d0d5",
"name": "SOURCE",
"type": "string",
"value": "COINMARKETCAP"
},
{
"id": "9f1310e0-cd03-4c50-bfff-902c504c3456",
"name": "WEBSITE",
"type": "string",
"value": "={{ $('CLEAN WEBSITE').item.json.WEBSITE }}"
},
{
"id": "2c952ab6-bd4f-471d-b843-9dc51658d795",
"name": "TOKEN",
"type": "string",
"value": "={{ $('CLEAN WEBSITE').item.json.TOKEN }}"
},
{
"id": "1c35c9fb-1552-4055-b5a7-e1182633e225",
"name": "TICKER",
"type": "string",
"value": "={{ $('CLEAN WEBSITE').item.json.TICKER }}"
}
]
}
},
"retryOnFail": true,
"typeVersion": 3.4
},
{
"id": "eb176e3a-4f81-4b4d-b1f4-163ff9057784",
"name": "CMC Token DATA",
"type": "n8n-nodes-base.code",
"position": [
-2464,
-32
],
"parameters": {
"jsCode": "// Get all items (rows) from the node named \"if\"\nconst allRows = $items(\"DATA\").map(item => item.json);\n\n// You can now inspect or return them\nreturn allRows.map((row, index) => ({\n json: {\n index: index + 1,\n ...row,\n }\n}));"
},
"retryOnFail": true,
"typeVersion": 2
},
{
"id": "4aece9fe-5c21-4a28-bf80-072ded5742d1",
"name": "ADD TO CMC Sheet",
"type": "n8n-nodes-base.nocoDb",
"position": [
-2016,
16
],
"parameters": {
"table": "",
"fieldsUi": {
"fieldValues": [
{
"fieldName": "FIRST_NAME",
"fieldValue": "={{ $json.token }}"
},
{
"fieldName": "WEBSITE",
"fieldValue": "={{ $('ADD TO CMC').item.json.website }}"
},
{
"fieldName": "TICKER",
"fieldValue": "={{ $json.ticker }}"
},
{
"fieldName": "SOURCE",
"fieldValue": "=COINMARKETCAP"
},
{
"fieldName": "TOKEN",
"fieldValue": "={{ $json.token }}"
},
{
"fieldName": "DATE ADDED",
"fieldValue": "={{ new Date().toISOString().split('T')[0] }}"
}
]
},
"operation": "create",
"projectId": "",
"authentication": "nocoDbApiToken"
},
"credentials": {
"nocoDbApiToken": {
"name": "<your credential>"
}
},
"executeOnce": true,
"retryOnFail": true,
"typeVersion": 3
},
{
"id": "ae37241a-aef1-4e30-9b12-0c0b2ff3466e",
"name": "Get 100 Tokens From CMC",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3680,
624
],
"parameters": {
"url": "=https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest",
"options": {
"batching": {
"batch": {
"batchSize": 3
}
}
},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-CMC_PRO_API_KEY",
"value": ""
},
{
"name": "limit",
"value": "={{ $json.params.limit }}"
},
{
"name": "sort",
"value": "={{ $json.params.sort }}"
},
{
"name": "sort_dir",
"value": "={{ $json.params.sort_dir }}"
},
{
"name": "start",
"value": "={{ $json.params.start }}"
}
]
}
},
"retryOnFail": true,
"typeVersion": 4.2
},
{
"id": "2388606f-0fac-4933-918f-94d1c0111292",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4672,
-336
],
"parameters": {
"width": 544,
"height": 1120,
"content": "## \ud83d\udcca COINMARKET CAP TOKEN DISCOVERY \n## (FREE API)\n\n\n## How it works\n\nThis workflow periodically fetches cryptocurrency listings from CoinMarketCap using the free API.\n\nIt selects random listing pages, splits the response into individual tokens, retrieves each token\u2019s official website, and cleans the data to keep only usable links. Tokens without valid websites are skipped. Clean token records are then saved to a storage system (NocoDB in this example).\n\nThe workflow runs in batches with delays to stay within API limits.\n\n## Setup steps\n\n1. Create a free CoinMarketCap API key.\n2. Add the API key to the HTTP Request nodes.\n3. Connect your preferred storage (NocoDB, Sheets, database, or webhook).\n4. Adjust the schedule if needed.\n5. Activate the workflow.\n"
},
"typeVersion": 1
},
{
"id": "106c5368-bae6-48f0-be2e-ce4996449a26",
"name": "DATA",
"type": "n8n-nodes-base.code",
"position": [
-2688,
-32
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "function pickWebsite(v) {\n if (!v) return null;\n\n if (Array.isArray(v)) {\n v = v.find(x => typeof x === 'string' && x.trim()) || null;\n }\n\n if (typeof v === 'string') {\n let url = v.trim();\n\n // Handle stringified arrays: [\"http://...\"]\n if (url.startsWith('[') && url.endsWith(']')) {\n try {\n const parsed = JSON.parse(url);\n if (Array.isArray(parsed)) url = parsed[0];\n } catch {}\n }\n\n // Add protocol if missing\n if (!/^https?:\\/\\//i.test(url)) url = 'https://' + url;\n\n // Force HTTPS\n url = url.replace(/^http:\\/\\//i, 'https://');\n\n // Remove stray brackets/quotes\n url = url.replace(/[\"'\\[\\]]/g, '');\n\n return url;\n }\n\n return null;\n}\n\nconst j = $json;\n\n// Match your real field names\nconst out = {\n token: j.TOKEN || j.name || null,\n ticker: (j.TICKER || j.symbol || '').toString().toUpperCase(),\n source: j.SOURCE || 'COINGECKO',\n website: pickWebsite(j.WEBSITE || j.links?.homepage || j.homepage || null),\n timestamp: new Date().toISOString()\n};\n\nif (!out.website) return null; // skip invalid\nreturn out;"
},
"retryOnFail": true,
"typeVersion": 2
},
{
"id": "9d1562c8-4696-438a-81d3-22cc49c3ff31",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4112,
416
],
"parameters": {
"color": 7,
"width": 272,
"height": 368,
"content": "## STEP 1: Fetch Tokens\nSelects random pages from CoinMarketCap and retrieves token listings using the API.\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "bdf40825-19a3-48eb-a4d2-6be64c33f50c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3792,
416
],
"parameters": {
"color": 7,
"width": 288,
"height": 368,
"content": "## STEP 2: Normalize Data\nBreaks API responses into individual tokens and keeps only relevant fields.\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "12c3299c-c7f1-46db-b6c5-78f68d629884",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3456,
416
],
"parameters": {
"color": 7,
"width": 400,
"height": 368,
"content": "## STEP 3: Enrich Tokens\nFetches additional details such as websites and social links for each token.\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "133f6b29-d151-4951-b65a-d0dfd7cb23fe",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2720,
288
],
"parameters": {
"color": 7,
"width": 368,
"height": 496,
"content": "## STEP 4: Clean Websites\nNormalizes website URLs, forces HTTPS, and removes invalid or empty values.\n\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "8f068c15-2b33-4db4-b871-c7a95df20e65",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2272,
288
],
"parameters": {
"color": 7,
"width": 448,
"height": 496,
"content": "## STEP 5: Store Results\nSaves cleaned token data into a database or sheet. Replace with your preferred storage.\n\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "8f39c8cc-378b-40f7-b55d-9588983adef6",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1760,
288
],
"parameters": {
"color": 7,
"width": 352,
"height": 496,
"content": "## STEP 6: Prepare Clean Output\nThis step formats each token into a clean structure with name, symbol, website, source, and timestamp. \nInvalid or incomplete entries are skipped.\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "e10ab5a7-44ff-44d3-acc2-dd8864569d3d",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2720,
-352
],
"parameters": {
"color": 7,
"width": 896,
"height": 560,
"content": "## STEP 7: Save Token Data\nThis step stores the cleaned token data.\n\nIn this workflow, NocoDB is used, but you can replace it with any storage option such as Google Sheets, Airtable, a database, or a webhook.\n\n\n\n\n\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"timezone": "Africa/Lagos",
"callerPolicy": "workflowsFromSameOwner",
"errorWorkflow": "UNrVZbiiSpgbbt9H",
"availableInMCP": false,
"executionOrder": "v1",
"saveDataSuccessExecution": "none"
},
"versionId": "93393598-3c42-4d9d-ba77-037966e39a26",
"connections": {
"DATA": {
"main": [
[
{
"node": "CMC Token DATA",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "CLEAN CMC FIELDS",
"type": "main",
"index": 0
}
]
]
},
"ADD TO CMC": {
"main": [
[
{
"node": "No Operation, do nothing3",
"type": "main",
"index": 0
}
],
[
{
"node": "ADD TO CMC Sheet",
"type": "main",
"index": 0
}
]
]
},
"Wait 1 Min": {
"main": [
[
{
"node": "Clean up Output",
"type": "main",
"index": 0
}
]
]
},
"CLEAN WEBSITE": {
"main": [
[
{
"node": "Wait 1 Min",
"type": "main",
"index": 0
}
]
]
},
"CMC Token DATA": {
"main": [
[
{
"node": "ADD TO CMC",
"type": "main",
"index": 0
}
]
]
},
"Clean up Output": {
"main": [
[
{
"node": "CMC SPLIT IN BATCHES",
"type": "main",
"index": 0
}
]
]
},
"EXTRACT WEBSITE": {
"main": [
[
{
"node": "CLEAN WEBSITE",
"type": "main",
"index": 0
}
]
]
},
"ADD TO CMC Sheet": {
"main": [
[
{
"node": "ADD TO CMC",
"type": "main",
"index": 0
}
]
]
},
"CLEAN CMC FIELDS": {
"main": [
[
{
"node": "CMC SPLIT IN BATCHES",
"type": "main",
"index": 0
}
]
]
},
"CMC SPLIT IN BATCHES": {
"main": [
[
{
"node": "DATA",
"type": "main",
"index": 0
}
],
[
{
"node": "Get Token Details From CMC",
"type": "main",
"index": 0
}
]
]
},
"Every 3 Days At 10AM": {
"main": [
[
{
"node": "Generate Random Page",
"type": "main",
"index": 0
}
]
]
},
"Generate Random Page": {
"main": [
[
{
"node": "Get 100 Tokens From CMC",
"type": "main",
"index": 0
}
]
]
},
"Get 100 Tokens From CMC": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"No Operation, do nothing3": {
"main": [
[]
]
},
"Get Token Details From CMC": {
"main": [
[
{
"node": "EXTRACT WEBSITE",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
nocoDbApiToken
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automatically discover cryptocurrency tokens from CoinMarketCap, clean the data, enrich it with official websites, and store the results in your preferred database or sheet.
Source: https://n8n.io/workflows/10969/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow is an improvement of this workflow by Greg Brzezinka.
Monitoring SEO performance from Google Search Console (GSC) manually is repetitive and prone to human error. For marketers or analysts managing multiple domains, checking reports manually and copying
Scraping Articles Dev.to Prod. Uses itemLists, stickyNote, nocoDb, scheduleTrigger. Scheduled trigger; 44 nodes.
News Extraction. Uses html, openAi, httpRequest, stickyNote. Scheduled trigger; 36 nodes.
News Extraction. Uses html, openAi, httpRequest, stickyNote. Scheduled trigger; 36 nodes.