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) or Authorization: Bearer <key>. A missing, wrong or revoked key gets 401 with missing_key, invalid_key or revoked, 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.

ParameterDescription
fromRecords 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).
toRecords 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.
statusOne status or several separated by commas, such as pending,confirmed. See Statuses.
statementA 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_sinceRecords 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.
sampletrue: 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.
limitRecords per page, 1 to 100. Default 100.
cursorThe 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.

FieldTypeMeaning
order_idstringSimvito’s ID for the order. A refund record carries the ID of the order it refunds.
typestringsale 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_namestring or nullThe 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_idstring or nullThe 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_atstring (ISO 8601) or nullUTC. For a sale, when the buyer placed the order; null for refund records and for sales recorded before 28 October 2026.
created_atstring (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_atstring (ISO 8601)UTC. When the record last changed: its status, a refund, a payment. updated_since filters on it.
confirmed_atstring (ISO 8601) or nullUTC. 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.
statementstring (YYYY-MM) or nullComparison sites: the monthly statement the record is on (the UTC month it was confirmed in). null until it’s confirmed, and for creators.
order_amountstring (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_currencystringThe currency of order_amount and the commission: always USD.
paid_amountstring (decimal) or nullWhat 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_currencystring or nullISO 4217 code of the currency the buyer paid in.
fx_ratestring (decimal) or nullUnits of paid_currency per 1 USD: the market reference rate order_amount was converted at (1 for USD).
fx_rate_datestring (YYYY-MM-DD) or nullThe day of that rate.
commission_amountstring (decimal)Your commission on the order. 0.00 for a reversed sale: it isn’t paid.
reversed_commission_amountstring (decimal) or nullFor a reversed sale, the commission it had before it was reversed. Otherwise null.
commission_currencystringISO 4217 code, currently always USD.
statusstringSee Statuses.
reversed_reasonstring or nullFor 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_reviewbooleantrue 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_keystring or nullYour referral code the order came through, or null when it isn’t known.
sub_idstring or nullComparison 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

StatusMeaning
pendingInside 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.
confirmedConfirmed. 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_reviewUnder review, for example while a chargeback is open. Not paid until it’s cleared.
reversedNot paid: the order was refunded in full, canceled, or didn’t qualify (for example a duplicate or an invalid order).
paidPaid 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-Remaining and X-RateLimit-Reset (Unix seconds).
  • Over the limit you get 429 with Retry-After in seconds.
HTTPcodeWhen
400invalid_requestA parameter or the cursor isn't valid.
401missing_keyNo key in the request.
401invalid_keyThe key isn't one of ours.
401revokedThe key was revoked.
403no_scopeThe key can't read orders.
403forbiddenThe partner account isn't active. (A partnership that ended or is paused can still read its own orders.)
429rate_limitedToo many requests; wait for Retry-After.
503unavailableA lookup or rate check can't answer right now; retry after Retry-After.
500internal_errorOur 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) or click_id, not both.
  • data has 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, commission and, 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.
  • 503 unavailable when the lookup can’t answer right now; retry after Retry-After seconds.
{
  "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.

DateChange
28 October 2026New 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.