Server API
Server-to-server API
Revenue, refunds and data deletion from your backend, with your server key.
POST https://attribution.ondropp.app/v1/s2s/events
DELETE https://attribution.ondropp.app/v1/s2s/users/:userId
GET https://attribution.ondropp.app/v1/s2s/deletions/:requestId
Authorization: Bearer sk_5a7c9e1b3d2f4a60.<secret>
Content-Type: application/jsonFor your backend: payment webhooks, renewals, refunds and website orders. Authenticate with the app's server key as a bearer token. There's nothing to sign. For a walkthrough, see Send revenue from your server.
Send events#
POST /v1/s2s/events, up to 100 events per request.
{
"events": [
{ "eventId": "order-A1099", "userId": "user_8812", "name": "subscription_renewed", "ts": 1760700300,
"revenue": { "amount": 199, "currency": "INR", "orderId": "A1099" } },
{ "eventId": "refund-A1023", "userId": "user_8812", "name": "refund", "ts": 1760700400,
"revenue": { "amount": -499, "currency": "INR", "orderId": "A1023" } }
]
}{ "accepted": 1, "duplicates": 0, "pending": 1, "rejected": [], "warnings": [] }Which creator gets it:
- A
userIdyour app has identified: that user's creator. See Users and revenue credit. - Only an
installId: that install's attribution, or its user's creator if it's logged in. - A
visitorIdor aclickId, when 1 and 2 give no creator: the visitor's first Dropplink click (or that click), so first touch still wins. Stored with the platformwebwhen no install is named. With auserIdtoo, the click becomes that user's first touch, so their later orders are credited byuserIdalone, on any device; avisitorIdalso marks that visitor as this user (verified). See Web. - A
userIdyour app hasn't identified yet: pending. It's credited as soon as the user is identified, or stored as organic after 7 days. It's never dropped.
Revenue is stored in its own currency and also converted to rupees at that day's rate.
503 storage_unavailable means nothing from the request was kept: send it again after Retry-After seconds. Because eventId
is yours, resending is always safe.
Delete a user's data#
DELETE /v1/s2s/users/:userId, for account deletion and data requests (DPDP, GDPR). URL-encode the user ID.
{ "requestId": "6711a0c2f1e4b8a9c3d2e3a0", "status": "pending", "requestedAt": "2026-10-22T10:00:00.000Z", "completedAt": null, "counts": null }Dropplink deletes the user's identity, events and pending events, and the website visitors linked to them with their visits and page views, and removes the user and device details from their installs. Installs keep their attribution as anonymous counts, so creator totals don't change. It usually finishes within seconds; a failed run is retried automatically, and it always completes within 72 hours.
Check a deletion#
GET /v1/s2s/deletions/:requestId
{ "requestId": "6711a0c2f1e4b8a9c3d2e3a0", "status": "done", "requestedAt": "…", "completedAt": "…",
"counts": { "identities": 1, "events": 14, "pendingEvents": 0, "installs": 2, "webVisitors": 1 } }status is pending, done or failed (failed runs are retried). You can only see your own app's requests; others return
404 deletion_not_found. The record keeps a hash of the user ID, never the ID itself.