DropplinkDocsPowered bydropp.

SDK API

POST /v1/events and /v1/identify

Send in-app events in batches, and link a user to an install.

POST https://attribution.ondropp.app/v1/events
POST https://attribution.ondropp.app/v1/identify
Content-Type: application/json
X-Key-Id: ak_3f9c1e2a7b6d4c80
X-Timestamp: 1760700000
X-Signature: <signature>

The calls the SDK makes for track and identify, signed with the app's SDK key like /v1/init. Only build these yourself if you integrate without the SDK. From a backend, use the server API instead.

POST /v1/events#

Up to 100 events in one request, 64 KB at most.

Request body
{
  "installId": "6f1c2a9e-3b7d-4c51-9a8e-2d4f6b1c0e73",
  "events": [
    { "eventId": "3f2b8c1d-5e6a-4b7c-9d8e-0f1a2b3c4d5e", "name": "add_to_cart", "ts": 1760700100,
      "props": { "sku": "TSHIRT-M", "qty": 1 } },
    { "eventId": "7a6b5c4d-3e2f-4a1b-8c9d-0e1f2a3b4c5d", "name": "purchase", "ts": 1760700200,
      "revenue": { "amount": 499, "currency": "INR", "orderId": "A1023" } }
  ]
}
FieldRules
installIdThe UUID sent to /v1/init.
eventIdA UUID created when the event is tracked and kept with it, so every retry sends the same one. That's what makes retries safe.
namesnake_case: ^[a-z][a-z0-9_]{0,63}$.
tsWhen it happened, unix seconds. Within the last 7 days; up to 10 minutes ahead is treated as now.
propsOptional. Up to 20 keys of [A-Za-z0-9_]{1,40}. Values are text (up to 256 characters), numbers, booleans or null. A value containing an email or that is a phone number is dropped and listed in warnings.
revenueOptional. amount 0 or more with at most 2 decimals, currency an ISO 4217 code like INR, optional orderId (up to 128). Shown as app-reported.
200 OK
{
  "accepted": 1,
  "duplicates": 0,
  "rejected": [{ "index": 1, "eventId": "7a6b5c4d-…", "code": "too_old", "message": "ts is more than 7 days ago" }],
  "warnings": [{ "eventId": "3f2b8c1d-…", "code": "pii_in_props", "props": ["email"] }]
}
FieldMeaning
acceptedNew events stored.
duplicatesEvents an earlier attempt already stored.
rejectedEvents that will never be accepted: invalid_event, too_old or too_far_in_future. index is the position in the request.
warningsEvents stored with some properties removed because they looked like personal data.

Each event is checked on its own, so one bad event doesn't fail the batch. After a 200, remove every event in the batch from your queue: accepted, duplicates and rejected.

ResponseDo
404 unknown_installDropplink hasn't seen this install. Call /v1/init, then send the batch again.
429 rate_limitedWait Retry-After seconds, then send the same batch. The limit is 600 events a minute per install.
503 storage_unavailableNothing was kept. Wait Retry-After seconds and send the whole batch again.

POST /v1/identify#

Request body
{
  "installId": "6f1c2a9e-3b7d-4c51-9a8e-2d4f6b1c0e73",
  "userId": "user_8812",
  "traits": { "emailHash": "<sha256 hex>", "phoneHash": "<sha256 hex>" }
}
FieldRules
userIdYour own user ID, 1–128 characters. null logs the user out. An email or phone number is refused with 400 pii_in_user_id.
traits.emailHashOptional. Lower-case hex SHA-256 of the trimmed, lower-cased email.
traits.phoneHashOptional. Lower-case hex SHA-256 of the phone in E.164, like +919876543210. Plain values are refused.
200 OK
{ "installId": "6f1c2a9e-3b7d-4c51-9a8e-2d4f6b1c0e73", "userId": "user_8812" }

404 unknown_install: call /v1/init first. The limit is 5 identifies a minute per install, so only send one when the user changes. See Users and revenue credit for how the user's creator is decided.

Sending reliably#

If you build your own client, do what the SDK does:

  1. Save each event, with its eventId and ts, to storage on the device before sending it.
  2. Send after a short pause (about a second), when the app goes to the background, and on every launch after /v1/init succeeds.
  3. Keep events on network errors, 429 and 5xx, and retry with exponential backoff from 1 second to 5 minutes, honouring Retry-After.
  4. Send an identify before the events tracked after it, so they carry the user.
  5. Cap what's waiting (the SDK keeps 1,000 events) and drop the oldest events without revenue first.

Other errors: Errors.

Something unclear? Tell us.Powered bydropp.