Appearance
PostHog, Mixpanel and Amplitude
These tools' SDKs put their key inside the request body, so they can't simply be pointed at simpledatalogs. Their event shapes are understood, though: post them to /v1/ingest with an ingest key, and the fields map for you.
sh
curl -sS https://edge.simpledatalogs.com/v1/ingest \
-H "Authorization: Bearer sdl_sec_…" \
-H "Content-Type: application/json" \
-d '{"batch":[{"event":"$pageview","distinct_id":"d-1","uuid":"0199f0c4-6c1e-7a3b-9d2e-5b8f1a2c3d4e","timestamp":"2026-10-15T10:00:00Z","properties":{"$current_url":"/pricing"}}]}'This is useful when you replay exported events, or forward them from your own backend.
How shapes map
| Shape | Recognized by | Mapping |
|---|---|---|
| Wrapper | An object with a batch array (Segment, PostHog) or an events array (Amplitude), and no event | Each entry is one event; the wrapper's own fields (api_key, sentAt …) aren't stored |
| PostHog, Mixpanel | event with a properties object, or a top-level distinct_id | properties → props; distinct_id → anonymous_id; uuid, else properties.$insert_id → event_id; timestamp, else properties.time → ts |
| Amplitude | event_type and no event | event_type → event; event_properties → props; user_properties → props.user_properties; insert_id → event_id; user_id, device_id, session_id as they are; time (ms) → ts |
| Segment | A type of track, page, screen, identify, group or alias | As on Segment |
Send the ids
PostHog's id is uuid, Mixpanel's properties.$insert_id, Amplitude's insert_id. Without them, a retried request counts twice. Amplitude's integer event_id is a per-device counter, so it is kept as props.event_id, not used as the id.
- Documented fields always win: if an object also sends
event_id,anonymous_id,tsorprops, the vendor field stays a prop. - Client IPs (
context.ip,$ip,ip) and body keys (api_key,token,writeKey) are never stored.
Next steps
- Events and log objects: the native shape.
- Segment: a true drop-in for Segment's SDKs.