---
url: https://simpledatalogs.com/docs/integrations/payload-shapes.md
description: >-
  PostHog, Mixpanel and Amplitude event shapes are understood on /v1/ingest;
  post them with an ingest key.
---

# 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](/integrations/segment#how-messages-map) |

::: warning 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`, `ts` or `props`, 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](/api/events): the native shape.
* [Segment](/integrations/segment): a true drop-in for Segment's SDKs.
