Send a conversion
When a sale or a sign-up happens, your server sends it with the hit; later it can change its status, for example a refund.
The call
POST https://<your workspace address>/track/conversions
x-api-key: your API key
Content-Type: application/json
{
"hit": "h1.…",
"conversionTypeCode": "sale",
"externalId": "order-1042",
"amount": { "value": 49.90 },
"currency": "EUR"
}
| Field | |
|---|---|
hit |
The signed hit from the hitctrl cookie (or from a server-side hit). |
conversionTypeCode |
Required. The conversion type's code, for example sale. |
externalId |
Your order or transaction ID. The same one counts once, so retrying is safe. |
amount.value, currency |
The sale amount; needed for percent payouts. Another currency is converted at the day's rate. |
exchangeRate |
Your own rate to the workspace currency, if your workspace accepts it. |
couponCodes |
Coupon codes used; a coupon's partner gets the sale ahead of the hit. |
externalClientId |
A client you registered; the sale counts for the partner of that client's hit. |
country |
The buyer's country (two letters); prices the sale by it instead of the hit's country. |
customParams.advS1–advS5 |
Your own values; payout groups and fraud rules can use them. |
status |
approved, pending or test; leave it out for what the offer's goal sets. |
One of hit, couponCodes or externalClientId is required. The call also works as GET with the same values in the address.
Changing a status later
POST https://<your workspace address>/track/conversions/status
{ "externalId": "order-1042", "status": "refunded" }
status is approved, pending, rejected or refunded. Add conversionTypeCode when one order has conversions of several types.
Busy moments
Send the header Prefer: respond-async: the answer is 202 at once and the conversion is recorded a moment later.
Did this answer your question?
Checked against the app on October 18, 2026