

/api/v1/cotBatch read of COT positioning for up to 25 markets in one call, keyed by symbol. Charged per symbol resolved (deduplicated), not per request, so batching a list saves round trips rather than credits. A symbol that does not exist comes back as { notFound: true } instead of being dropped, so a typo is distinguishable from a market with no data. The single-symbol endpoint above keeps working unchanged.
| Name | In | Type | Req. | Description |
|---|---|---|---|---|
| symbols | query | string | yes | Comma-separated currency or instrument codes, case-insensitive. Up to 25. Example: EUR,GBP,GOLD. |
| from | query | string (ISO date) | no | Only rows on or after this date (YYYY-MM-DD). |
| to | query | string (ISO date) | no | Only rows on or before this date. |
curl -H "Authorization: Bearer afx_live_xxx" \
"https://www.analytics-fx.com/api/v1/cot"{
"apiVersion": "v1",
"data": {
"EUR": [ { "date": "2026-06-17", "symbol": "EUR", "long": 41250, "short": 60310,
"largespecsLong": 38900, "largespecsShort": 55120, "retailLong": 2350, "retailShort": 5190 } ],
"GOLD": [ { "date": "2026-06-17", "symbol": "GOLD", "long": 210000, "short": 90000,
"largespecsLong": 190000, "largespecsShort": 80000, "retailLong": 4200, "retailShort": 1800 } ],
"SP500": { "notFound": true }
},
"meta": { "requestId": "req_cb01", "credits": { "cost": 3, "remaining": 990 } }
}