{"openapi":"3.1.0","info":{"title":"EventDash ingest API","version":"1.0.0","description":"Server-side event and goal ingest. Tracking keys use prefix ed_. Not a read API — query analytics via MCP."},"servers":[{"url":"https://www.eventda.sh"}],"tags":[{"name":"Events","description":"Batched event ingest"},{"name":"Goals","description":"Conversion goal ingest"},{"name":"Keys","description":"Tracking key validation"}],"paths":{"/api/events":{"post":{"operationId":"ingestEvents","summary":"Ingest a batch of events","tags":["Events"],"security":[{"trackingApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestBatch"}}}},"responses":{"200":{"description":"Events accepted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"integer"}},"required":["success","count"]}}}},"400":{"description":"Invalid payload","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Quota exceeded or plan restriction","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/goals":{"post":{"operationId":"ingestGoal","summary":"Record a conversion goal","tags":["Goals"],"security":[{"trackingApiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"goal_name":{"type":"string","minLength":1,"maxLength":64},"metadata":{"type":"object","additionalProperties":true},"anonymous_id":{"type":"string","maxLength":128},"session_id":{"type":"string","maxLength":128},"page_url":{"type":"string"},"page_title":{"type":"string"},"referrer":{"type":"string"},"client_timestamp":{"type":"string"}},"required":["goal_name"]}}}},"responses":{"200":{"description":"Goal accepted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"400":{"description":"Invalid payload","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Quota exceeded or plan restriction","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/api/validate":{"get":{"operationId":"validateTrackingKey","summary":"Validate a tracking API key","tags":["Keys"],"security":[{"trackingApiKey":[]}],"responses":{"200":{"description":"Key is valid","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean"},"canTrack":{"type":"boolean"}},"required":["valid"]}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean"},"error":{"type":"string"}},"required":["valid"]}}}},"429":{"description":"Rate limited"}}}}},"components":{"securitySchemes":{"trackingApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Tracking key with prefix ed_. Authorization: Bearer ed_… is also accepted on /api/events and /api/validate."}},"schemas":{"IngestBatch":{"type":"object","required":["id","sessionId","anonymousId","timestamp","events"],"properties":{"id":{"type":"string","maxLength":128},"sessionId":{"type":"string","maxLength":128},"anonymousId":{"type":"string","maxLength":128},"timestamp":{"type":"number"},"compressed":{"type":"boolean"},"fingerprint":{"type":"object","additionalProperties":true},"events":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["type","timestamp","pageUrl"],"properties":{"type":{"type":"string","maxLength":64},"name":{"type":"string","maxLength":128},"timestamp":{"type":"number"},"pageUrl":{"type":"string"},"pageTitle":{"type":"string"},"referrer":{"type":"string"},"properties":{"type":"object","additionalProperties":true}}}}}}}}}