server-track-lab API reference
Base URL https://server-track-lab.pages.dev. Machine-readable: OpenAPI 3.1 · llms.txt. Pricing: free 1,000 events/month, then CA$2 per 1,000. Status: Meta CAPI live; Google Enhanced Conversions coming soon (preview only); LinkedIn on the roadmap.
Authentication
Get a key at /signup. Send Authorization: Bearer sst_live_… (or X-API-Key). Missing or wrong key: 401 unauthorized.
POST /api/v1/track
JSON body, max 32 KB, Content-Type: application/json.
| Field | Rules |
|---|---|
| event_name (required) | 1-64 chars [a-z0-9_] (lowercased). Alias: event. |
| event_id (required) | ≤128 chars [A-Za-z0-9._:-]. Repeats within 72h return deduplicated and are not re-sent. Forwarded to Meta unchanged. |
| timestamp (required) | ISO 8601 with Z or offset; ≤5 min in the future. Meta drops events older than 7 days. |
| user (required) | At least one of email, phone, external_id, fbp, fbc, fbclid, gclid, gbraid, wbraid. Also first_name, last_name, country (2-letter), ip, user_agent. Raw values are normalized + SHA-256 hashed for you; 64-char hex is treated as pre-hashed. Phone needs a country code (or a workspace default). |
| value, currency | value ≥0, max 2 decimals; currency [A-Z]{3}, required when value > 0 and for closed_won. |
| event_source_url | http(s) URL. |
| action_source | website, system_generated, crm (sent as system_generated), phone_call, email, chat, other. Default: website if user_agent + event_source_url present, else system_generated. |
| consent | {ad_user_data, ad_personalization}: granted | denied. |
| destinations | ["meta"], ["google"] (preview) or both. |
| test | boolean; sends to Meta Test Events with your test_event_code. |
| properties | ≤20 scalar keys, ≤2 KB; merged into Meta custom_data. |
Event name mapping (Meta)
| You send | Meta event_name |
|---|---|
| signup | CompleteRegistration |
| lead | Lead |
| trial_started | StartTrial |
| demo_booked | Schedule |
| contact | Contact |
| qualified | Lead + custom_data.event_stage=qualified |
| opportunity | qualified_opportunity |
| subscribed | Subscribe |
| closed_won | Purchase (value + currency required) |
| anything else | passed through |
curl -X POST https://server-track-lab.pages.dev/api/v1/track \
-H 'Authorization: Bearer sst_live_YOUR_KEY' -H 'Content-Type: application/json' \
-d '{"event_name":"demo_booked","event_id":"demo_booked:8f3a2c71","timestamp":"2026-10-14T15:04:05Z","user":{"email":"jane@example.com"}}'
Response 200: {"status":"accepted"|"deduplicated","event_id":…,"destinations":{"meta":{"status":"sent"|"skipped"|"failed",…}},"usage":{…}}. Errors: {"error":{"code","message","fields"?}} with 400 invalid_json, 401 unauthorized, 402 quota_exceeded, 405, 413 payload_too_large, 415 unsupported_media_type, 422 validation_error.
GET /api/v1/health
No auth. {"ok":true,"service":"server-track-lab","version":"0.1.0","google_adapter":"stub"}
POST /api/v1/playground
No API key. Body {"event":{…same as /track…},"turnstile_token":"…"}; Turnstile-protected, 20 runs/hour per IP. Stores nothing, no quota. Returns validation, the exact Meta CAPI body, a Google preview and dedup notes; Meta delivery is a dry run. Easiest via the playground page.
Related
Hashing tool · event_id generator · CAPI payload validator · Dedup guide · Form & CRM guide