Skip to the page
Docs
Intake API

Docs Reference

Intake API

What every Apparent SDK sends. Use it to write an SDK for another platform, or to send events from a server.

Send a batch

HTTP
POST https://in.apparent.fyi/i
content-type: application/json

No auth header: the app id and key go in the body. One request is one batch of up to 100 events from one app on one phone. You can gzip the body with content-encoding: gzip; 1 MB is the limit both as sent and unpacked.

Terminal
curl https://in.apparent.fyi/i -H 'content-type: application/json' -d '{
  "a": "<app id>", "k": "<write key>", "v": "my-sdk-0.1.0", "sa": 1792761605123,
  "d": { "platform": "ios", "os": "18.0", "app": "1.0.6", "model": "iPhone15,2", "locale": "de-DE",
         "anon": "9f2c4b7e1a3d4c5b8e6f7a9b0c1d2e3f", "user": null },
  "e": [{ "n": "app_open", "t": 1792761600010, "s": "5d1e0a9b7c3f4e2a8b6d0c1f2e3a4b5c",
          "i": "0a1b2c3d4e5f60718293a4b5c6d7e8f9", "p": { "cold": true } }]
}'

The batch

FieldWhat it is
aThe app's id.
kThe app's write key. It only adds events.
vYour SDK's name and version.
saThe phone's clock when this request is sent, in milliseconds. Read again on every retry.
dThe device, below.
e1 to 100 events, oldest first.

The device: d

FieldWhat to send
platform"ios", "android" or "macos" (a Mac app, also an iPhone app running on a Mac). iPadOS is "ios".
osiOS: "18.0". Android: the API level, "30".
appThe store version only, exactly as in the store: "1.0.6".
buildThe build number, "42". Optional.
modelThe raw hardware id: "iPhone15,2", "Pixel 8", "Mac14,3". In the iOS Simulator, "arm64".
simulatortrue in the iOS Simulator or an Android emulator. Leave it out on a real phone, never false.
localeThe first preferred language, "de-DE".
regionThe region setting, "DE". Optional.
tzThe time zone, "Europe/Berlin". Optional.
anonThe install id of the first event: 32 random hex characters, saved on the phone.
userThe first event's user id, or null.

Send raw values: Apparent spots simulators, emulators and test phones from them.

An event: e[]

FieldWhat it is
nName, lowercase_snake, up to 80 characters.
tWhen it happened, phone clock, milliseconds. Never changed later.
sSession id: new at launch and after 30 minutes away.
iA random id for this event (32 hex), the same on every retry.
pProperties, flat: text, number, true/false, null. Optional.
a, uThis event's install or user id, only when it differs from d.

Answers

AnswerMeansDo
200 {"ok":true,"accepted":4,"duplicates":0,"skipped":0,"dropped":0}Stored. dropped: events past the 500th, not stored (never happens at 100 a batch).Remove the batch.
413Over 1 MB.Halve the batch, send again.
408, 429, 5xx, no answerBusy or offline.Keep it, wait, retry: 2 s doubling up to 5 min, or Retry-After.
401Wrong app id or key.Drop it. Retrying won't help. In a debug build, print once: Apparent: app id or key is wrong — events are not being saved.
other 4xxBad JSON or gzip, a body that isn't one object, e that isn't a list, or an encoding other than gzip (415).Drop it.

Sending a batch twice is safe: the server keeps one copy per event id. When unsure, send again.

Limits

500 events per batch (stay at 100), 60 properties per event, 64 characters per property name, 512 per value, ids up to 128. Ids must be text (or numbers): any other type counts as missing, so an event falls back to the batch's install and user id. Events older than 60 days are skipped. Phones with a wrong clock are corrected with sa.

Check your SDK

Every Apparent SDK passes the same 25-rule check against a local intake. Writing your own? Write to hello@apparent.fyi and we'll run it with you.

Updated 2026-10-24 · Markdown · Report a mistake