Sonic API endpoint
Returns the nutrition, allergen and ingredient documents Sonic Drive-In publishes nationally -- the printable menu, the Spanish-language menu, the nutrition guide, allergen information, and the ingredient statement -- each with a directly fetchable URL, file name, MIME type, size in bytes, and the date it was last republished. These are the only structured nutrition source Sonic publishes; per-item macro and micronutrient values are not available anywhere on the public site, and GET /sonic/menu carries calories only. Files are large print-ready PDFs (several megabytes each), so check size_bytes before downloading.
/sonic/nutrition-documentsThis endpoint takes no query parameters; the document set is national rather than per-restaurant.
Response includes heading, documents[], count, source_url, and fetched_at.
Each entry in documents[] has name, category, url, file_name, content_type, size_bytes, title, and updated_at.
url is absolute and directly fetchable. size_bytes is worth checking first — these are print-ready PDFs and the menu files run to several megabytes. updated_at is when Sonic last republished that file, so a caller can skip re-downloading unchanged documents.
category is the heading the document is grouped under and usually matches name, since most groups hold a single document.
| Field | Filled in, of 5 checked | Values in the sample |
|---|---|---|
| name | 5 | “Menu” and 4 other values |
| category | 5 | “Menu” and 4 other values |
| url | 5 | downloads.ctfassets.net and 1 other host |
| file_name | 5 | “61131-13_SUM26_NAT_WOP-English_FA_cp_WCAG.pdf” and 4 other values |
| content_type | 5 | application/pdf in all 5 |
| size_bytes | 5 | 235,810 to 14,351,111, median 3,225,091 |
| title | 5 | “61131-13 SUM26 NAT WOP-English FA cp WCAG” and 4 other values |
| updated_at | 5 | 2026-06-30 to 2026-10-06 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/sonic/nutrition-documents" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"heading": "Sonic Nutrition & Allergen Information",
"documents": [
{
"name": "Menu",
"category": "Menu",
"url": "https://downloads.ctfassets.net/whnlxz6bna9d/6X8nDHcfG3mPLdYU4HxwF1/06dbca0002645257cecde3ca121c3634/menu.pdf",
"file_name": "61131-13_SUM26_NAT_WOP-English_FA_cp_WCAG.pdf",
"content_type": "application/pdf",
"size_bytes": 14351111,
"title": "61131-13 SUM26 NAT WOP-English FA cp WCAG",
"updated_at": "2026-06-30T16:45:09.549Z"
},
{
"name": "Nutrition Guide",
"category": "Nutrition Guide",
"url": "https://assets.ctfassets.net/whnlxz6bna9d/665Hn9SdgyT53pJgF9cmkK/090ae5fe05d8cd9643fb98fcde32ef1a/nutrition-guide.pdf",
"file_name": "61667-1_FEE_0926_Nutrition.pdf",
"content_type": "application/pdf",
"size_bytes": 3243128,
"title": "61667-1 FEE 0926 Nutrition",
"updated_at": "2026-06-30T16:45:00.000Z"
}
],
"count": 5,
"source_url": "https://www.sonicdrivein.com/_next/data/<buildId>/nutrition-allergen.json",
"fetched_at": "2026-09-05T12:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/sonic.nutritionDocumentsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | sonic.NutritionDocumentsResponse | No | ||||
| data.count | integer | No | 5 | |||
| data.documents | array | No | ||||
| data.documents[].category | string | No | Nutrition Guide | Category is the heading the document is grouped under. It usually matches Name, since most groups hold a single document. | ||
| data.documents[].content_type | string | No | application/pdf | ContentType is the document's MIME type, in practice "application/pdf". | ||
| data.documents[].file_name | string | No | 61667-1_FEE_0926_Nutrition.pdf | |||
| data.documents[].name | string | No | Nutrition Guide | Name is the label Sonic gives the document on the page, e.g. "Nutrition Guide" or "Allergen Info". | ||
| data.documents[].size_bytes | integer | No | 14351111 | SizeBytes is the file size. These are large print-ready PDFs -- several megabytes each -- so callers may want it before fetching. | ||
| data.documents[].title | string | No | 61131-13 SUM26 NAT WOP-English FA cp WCAG | |||
| data.documents[].updated_at | string | No | 2026-06-30T16:45:09.549Z | UpdatedAt is when Sonic last republished the file. | ||
| data.documents[].url | string | No | https://downloads.ctfassets.net/.../nutrition-guide.pdf | |||
| data.fetched_at | string | No | ||||
| data.heading | string | No | Sonic Nutrition & Allergen Information | |||
| data.source_url | string | No | ||||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/sonic/nutrition-documents" \
-H "x-api-key: $CRAWLORA_API_KEY"