Skip to content

Menudata API

The Menudata API provides a daily export of posts.

The API is designed for bulk delivery:

  • You call the API endpoint.
  • It returns a signed download URL.
  • You download the export file from that URL.

This endpoint requires an API key.

Send one of:

  • Preferred: Authorization: Bearer <YOUR_API_KEY>
  • Alternative: x-api-key: <YOUR_API_KEY>

If the key is missing or invalid, the API returns 401.

Returns a signed download URL for the daily export file.

Terminal window
curl -sS "https://menudata-api-794349016039.us-east4.run.app/v1/menudata" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"ok": true,
"durationMs": 12345,
"expiresAt": "2025-12-18T23:53:01.344Z",
"downloadUrl": "https://storage.googleapis.com/<bucket>/<path>?X-Goog-..."
}

Fields

  • downloadUrl: signed URL (temporary) to download the export file.
  • expiresAt: when the signed URL will expire (request a new URL after expiration).

The export is NDJSON (one JSON object per line).

The object is stored in GCS as gzip-compressed (.ndjson.gz), but depending on your HTTP client, the download response may be automatically decompressed; if gunzip fails, treat the response as plain NDJSON.

Terminal window
curl -L -o menudata.ndjson.gz "$DOWNLOAD_URL"

Read the first few rows (works even if the response is auto-decompressed)

Section titled “Read the first few rows (works even if the response is auto-decompressed)”
Terminal window
curl -sSL "$DOWNLOAD_URL" | head -n 5
Terminal window
gunzip -c menudata.ndjson.gz | head -n 5

If you need an array instead of NDJSON:

Terminal window
gunzip -c menudata.ndjson.gz | jq -s '.' > menudata.json
  • The signed URL is temporary. If it expires, call GET /v1/menudata again to get a new one.