Orders API
Version 2026-10-28, effective 28 October 2026
For Simvito partners and their developers: read the orders credited to you and their commissions, without any buyer data.
1. Overview
- One read-only endpoint lists the orders credited to your partner account and the commission on each, so you can reconcile them with your own records.
- Records are anonymous. They never contain the buyer’s name, email, account or customer ID, click ID, IP address, location, device or eSIM details.
- The same fields are in the CSV file from Export CSV in the partner dashboard (Earnings for creators, Orders for comparison sites; UTF-8 with a byte order mark, so Excel and Numbers open it as is).
- Price-comparison sites read the plan list with the same key: see the plan feed reference.
2. Authentication
- The owner of an approved partner account creates keys in the dashboard under API keys, gives each a name, and can revoke them there. Up to 5 keys can be active at a time.
- The key is shown once, when it’s created. We only keep a hash of it, so a lost key can’t be shown again: revoke it and create a new one.
- Send it on every request, as
x-api-key: <key>(the header the plan feed uses) orAuthorization: Bearer <key>. A missing, wrong or revoked key gets401withmissing_key,invalid_keyorrevoked, the same codes as the feed. - Every key reads both your orders and the plan feed; there is nothing to choose when you create it.
- Keep keys on your server. Don’t put them in browser or app code.
x-api-key: svp_your_key
3. List orders
GET https://partners.simvito.com/api/simvito/partner-api/v1/orders
All parameters are optional query parameters.
| Parameter | Description |
|---|---|
from | Records created at or after this time. A date (2026-10-01, from 00:00 UTC) or an ISO 8601 time with a time zone (2026-10-01T08:00:00Z). |
to | Records created before this time. A date includes that whole UTC day; a time is exclusive. Both are optional: without them you get all your records, newest first. |
status | One status or several separated by commas, such as pending,confirmed. See Statuses. |
statement | A month (2026-10): the records on that month’s statement (their statement field). Comparison sites; combine it with the others or use it alone. |
updated_since | Records that changed at or after this time (status, refund, payment), whenever they were created. Same formats as from. The way to keep a copy in step: see Statuses. |
sample | true: fixed example records instead of yours, one of each kind (pending, confirmed with a buyer paying in euros, paid, reversed for a refund within the allowance and for a chargeback, a refund adjustment), to build against before your first order. Their order IDs start with order_sample_; they never change. |
limit | Records per page, 1 to 100. Default 100. |
cursor | The next_cursor of the previous page. Send the same other parameters with it. |
Records come newest first. Read pages while has_more is true; on the last page next_cursor is null.
4. Fields
Every record has exactly these fields. Amounts are decimal strings.
| Field | Type | Meaning |
|---|---|---|
order_id | string | Simvito’s ID for the order. A refund record carries the ID of the order it refunds. |
type | string | sale for an order. refund for a refund of an order whose commission was already paid out, or (comparison sites) that is on a statement that has closed: it takes the difference off the next payout, or is an adjustment on the statement of the month it happens in, so its amounts are negative. |
plan_name | string or null | The plan bought, in English (for example Japan · 15 GB · 7 days), as the buyer saw it at checkout. It isn’t the feed’s planName, which adds network details to keep names unique. null on refund records. |
variant_id | string or null | The plan’s ID: the v= in its feed link, so you can match the order to the plan you listed. null for top-ups and refund records. |
ordered_at | string (ISO 8601) or null | UTC. For a sale, when the buyer placed the order; null for refund records and for sales recorded before 28 October 2026. |
created_at | string (ISO 8601) | UTC. When we recorded the sale (up to about 10 minutes after payment) or the refund. Pages and filters go by this time. |
updated_at | string (ISO 8601) | UTC. When the record last changed: its status, a refund, a payment. updated_since filters on it. |
confirmed_at | string (ISO 8601) or null | UTC. When the record was confirmed (left its pending period); null until then. A site without a pending period has its orders confirmed as they come in. |
statement | string (YYYY-MM) or null | Comparison sites: the monthly statement the record is on (the UTC month it was confirmed in). null until it’s confirmed, and for creators. |
order_amount | string (decimal) | What the buyer paid in USD, after any discount and minus any partial refund made before it was confirmed. A buyer who paid in another currency is converted at the market exchange rate of the payment day (fx_rate). The commission is worked out on this amount. |
order_currency | string | The currency of order_amount and the commission: always USD. |
paid_amount | string (decimal) or null | What the buyer paid, in the currency they paid in (paid_currency), as charged at checkout. null on refund records and for sales recorded before 28 October 2026. |
paid_currency | string or null | ISO 4217 code of the currency the buyer paid in. |
fx_rate | string (decimal) or null | Units of paid_currency per 1 USD: the market reference rate order_amount was converted at (1 for USD). |
fx_rate_date | string (YYYY-MM-DD) or null | The day of that rate. |
commission_amount | string (decimal) | Your commission on the order. 0.00 for a reversed sale: it isn’t paid. |
reversed_commission_amount | string (decimal) or null | For a reversed sale, the commission it had before it was reversed. Otherwise null. |
commission_currency | string | ISO 4217 code, currently always USD. |
status | string | See Statuses. |
reversed_reason | string or null | For a reversed order: refunded, refund_allowance (refunded and taken off its statement within the 5% allowance), chargeback (the buyer’s bank took the payment back), topup_excluded (a top-up, which your terms don’t pay commission on), canceled, not_eligible or duplicate. Otherwise null. |
refund_review | boolean | true when the order was refunded and, under your terms, the refund doesn’t reverse the commission: if the month’s refunds are within 5% of its orders they come off its statement when it closes (refund_allowance), otherwise the order stays on it and we go through it with you. |
link_key | string or null | Your referral code the order came through, or null when it isn’t known. |
sub_id | string or null | Comparison sites: the subid= you added to the link the buyer came through, as you sent it (letters, digits, . _ -, up to 64). null without one, and on refund records. |
5. Statuses
| Status | Meaning |
|---|---|
pending | Inside the pending period: 30 days for creators, 45 until a partner has been paid once and is 90 days in; a comparison site’s period is on its Your terms page (a site whose refunds are only flagged has none). Can still be reduced or reversed. |
confirmed | Confirmed. Goes out with the next payout, or, for comparison sites, is on the statement in its statement field. Comparison sites: once that statement’s month is over, the record doesn’t change any more; a later refund or chargeback adds a refund record on the current month’s statement. |
under_review | Under review, for example while a chargeback is open. Not paid until it’s cleared. |
reversed | Not paid: the order was refunded in full, canceled, or didn’t qualify (for example a duplicate or an invalid order). |
paid | Paid out to you, or settled against your statement. |
Statuses change as orders move through the pending period and payouts or statements, and a refund after payout adds a refund record. To keep a copy in step, ask once a day for updated_since the time of your last sync (a few minutes earlier, to be safe) and upsert by order_id and type: that catches new orders, confirmations, reversals and payments, however old the order is. To check a statement before you invoice it, read it whole with statement=.
6. Rate limits and errors
- 60 requests per minute per key. Every response carries
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset(Unix seconds). - Over the limit you get
429withRetry-Afterin seconds.
| HTTP | code | When |
|---|---|---|
| 400 | invalid_request | A parameter or the cursor isn't valid. |
| 401 | missing_key | No key in the request. |
| 401 | invalid_key | The key isn't one of ours. |
| 401 | revoked | The key was revoked. |
| 403 | no_scope | The key can't read orders. |
| 403 | forbidden | The partner account isn't active. (A partnership that ended or is paused can still read its own orders.) |
| 429 | rate_limited | Too many requests; wait for Retry-After. |
| 503 | unavailable | A lookup or rate check can't answer right now; retry after Retry-After. |
| 500 | internal_error | Our side failed; try again later and quote x-request-id if it keeps happening. |
{ "error": { "code": "revoked", "message": "This API key was revoked. Create a new one on your partner dashboard under Settings → API." } }7. Example
curl -s "https://partners.simvito.com/api/simvito/partner-api/v1/orders?from=2026-10-01&to=2026-10-31&limit=2" \ -H "x-api-key: $SIMVITO_API_KEY"
{
"data": [
{
"order_id": "order_sv_5ecbbdb71c217c023c953918920d88b7",
"type": "sale",
"ordered_at": "2026-10-21T09:06:41.208Z",
"created_at": "2026-10-21T09:14:03.512Z",
"updated_at": "2026-10-21T09:14:03.512Z",
"confirmed_at": "2026-10-21T09:06:41.208Z",
"statement": "2026-10",
"plan_name": "Japan · 15 GB · 7 days",
"variant_id": "variant_01K8F3JAPAN15GB7D",
"order_amount": "20.65",
"order_currency": "USD",
"paid_amount": "18.90",
"paid_currency": "EUR",
"fx_rate": "0.9152",
"fx_rate_date": "2026-10-20",
"commission_amount": "2.07",
"reversed_commission_amount": null,
"commission_currency": "USD",
"status": "confirmed",
"reversed_reason": null,
"refund_review": false,
"link_key": "yoursite",
"sub_id": "top10-japan"
},
{
"order_id": "order_sv_f06d3829d4c619f0945d67114d6669ea",
"type": "refund",
"ordered_at": null,
"created_at": "2026-10-19T16:40:11.004Z",
"updated_at": "2026-10-19T17:00:00.130Z",
"confirmed_at": "2026-10-19T17:00:00.130Z",
"statement": "2026-10",
"plan_name": null,
"variant_id": null,
"order_amount": "-9.50",
"order_currency": "USD",
"paid_amount": null,
"paid_currency": null,
"fx_rate": null,
"fx_rate_date": null,
"commission_amount": "-0.95",
"reversed_commission_amount": null,
"commission_currency": "USD",
"status": "confirmed",
"reversed_reason": null,
"refund_review": false,
"link_key": "yoursite",
"sub_id": null
}
],
"has_more": true,
"next_cursor": "MTc2MDg5MjAxMTAwNDpjbV8xMjM0"
}The next page:
curl -s "https://partners.simvito.com/api/simvito/partner-api/v1/orders?from=2026-10-01&to=2026-10-31&limit=2&cursor=MTc2MDg5MjAxMTAwNDpjbV8xMjM0" \ -H "x-api-key: $SIMVITO_API_KEY"
Every record that changed since your last daily sync:
curl -s "https://partners.simvito.com/api/simvito/partner-api/v1/orders?updated_since=2026-10-27T23:55:00Z" \ -H "x-api-key: $SIMVITO_API_KEY"
8. Attribution lookup
Why one order was or wasn’t credited to you. Needs a key with orders access; 30 requests per minute per key.
GET https://partners.simvito.com/api/simvito/partner-api/v1/attribution?order_id=order_sv_5ecbbdb71c217c023c953918920d88b7
- Pass
order_id(a Simvito order ID or the order number the buyer has) orclick_id, not both. datahas up to 5 records:order_id,ordered_at,result(one of the codes in the Attribution rules),explanation(one sentence),rules_version,decided_at,your_touch,commissionand, for credited orders of comparison sites,calculation(rate, order amount, minimum, whether the margin floor applied).- It only ever describes your own referral. Another partner is never named, and nothing about the buyer is returned.
503unavailablewhen the lookup can’t answer right now; retry afterRetry-Afterseconds.
{
"data": [
{
"order_id": "order_sv_5ecbbdb71c217c023c953918920d88b7",
"ordered_at": "2026-10-21T09:14:03.512Z",
"result": "CREDITED",
"explanation": "Credited to you.",
"rules_version": "2026-10-28.1",
"decided_at": "2026-10-21T09:12:40.118Z",
"your_touch": { "occurred_at": "2026-10-19T16:02:11.000Z", "channel": "web", "evidence": "link" },
"commission": { "amount": "1.89", "currency": "USD", "status": "pending" },
"calculation": { "basis": "sale", "rate_percent": 10, "order_amount": "18.90", "minimum": "1.00",
"minimum_applied": false, "capped_by_margin_floor": false }
}
]
}9. How orders are matched
- A landing from your link sets a first-party cookie on simvito.com whose value our server signs (code, time, referral record, random browser ID). Altered values are ignored.
- An order is credited to the latest valid referral within 30 days before its checkout was created; the result and the rules version are fixed then.
- Paid orders are reported once per order ID (repeats count once), and every day we reconcile credited orders against commissions in both directions.
- The full rules, results and how to appeal: Attribution rules.
10. Changes
We email partners with API keys before a change that could break an integration. Additions that don’t (a new field, a new parameter) are listed here.
| Date | Change |
|---|---|
| 28 October 2026 | New fields updated_at, statement, paid_amount, paid_currency, fx_rate and fx_rate_date; new parameters updated_since and sample. order_amount is now what the buyer paid, converted to USD at the market rate of the day (it used to be the plan’s USD price, without the exchange margin a buyer paying in another currency pays). New reversed_reason values refund_allowance and chargeback. The error codes missing_key, invalid_key, revoked, no_scope and internal_error replace unauthorized and server_error, as in the plan feed. |
11. Questions
Email partners@simvito.com with the partner account’s email address. Never send your API key.