Skip to main content

Changelog

2026-08-29: Retail pricing fields on plans

  • retailPrice and pricingBasis (additive). GET /v1/plans now also returns retailPrice (your plan's published retail price, in kobo, when one exists) and pricingBasis ("retail" or "special"), so a reseller can price a plan correctly without guessing. pricingBasis: "retail" means sell at retailPrice and keep the difference from price as your margin. pricingBasis: "special" means there is no retail figure - retailPrice is null - so add your own markup on top of price instead. Neither field is ever inferred from name. Existing integrations are unaffected. See Quickstart.

2026-08-09: Airtime networks and structured catalog fields

  • Airtime networks endpoint (additive). New GET /v1/networks lists the mobile networks you can buy airtime for, each with an id to send as networkId. See List airtime networks.
  • Structured plan fields (additive). GET /v1/plans now also returns productId (a stable id for the same product across networks), sizeMb, validityDays, isUnlimited, and class, so you can group and label plans without parsing name. They populate once your account is on the product catalog; existing integrations are unaffected.
  • productId on bill products (additive). Cable TV, electricity, education and broadband product listings now include a productId (the canonical product id, shared across services) alongside planId.

2026-07-08 - IP allowlisting + source IPs on invoices

  • IP allowlisting. Your API access can now be locked to your approved server IPs (IPv4 and IPv6, single addresses or CIDR ranges) - a leaked key becomes useless from anywhere else. Accounts created from July 2026 onward must have an allowlist configured before their first call; earlier accounts are unchanged until they opt in. Requests from an unapproved address get 403 with error code ip.not_allowed (the rejected IP is echoed so you know exactly what to ask us to add); accounts that require an allowlist but haven't configured one get ip.not_configured. Blocked requests are refused before any processing - a blocked purchase never charges your wallet. Send your server IPs to Plustive to set up or change your list. See Authentication → IP allowlisting.
  • Source IP on every purchase (additive). Each purchase now records the IP it was made from. It appears per transaction on your invoice CSV, and your invoice PDF includes a summary of the addresses your account purchased from during the cycle - useful for reconciling exactly which of your servers made which purchases. Existing integrations are unaffected.

2026-06-20 - Idempotency-collision detection

  • Reusing a clientReference for a different order now returns 409 Conflict. If a clientReference that already has a transaction arrives with different order-defining parameters - a different plan/product, recipient, or (for variable-amount bills like electricity) amount - we reject it with 409 Conflict (error code transaction.idempotency_conflict) and make no purchase, instead of silently returning the unrelated original transaction. A genuine retry with the same parameters is unchanged: it still returns the original transaction with the idempotentReplay flag / Idempotent-Replay header. Applies to all data, airtime and bill payment vends. See Idempotency.

2026-06 - Idempotent-replay signal

  • Replays are now flagged (additive). When a purchase reuses a clientReference that already has a transaction, we return the original transaction unchanged (no new vend, no extra charge) - and now mark it so you can tell a replay from a fresh purchase: an "idempotentReplay": true field in the response body and an Idempotent-Replay: true response header. Fresh purchases are unflagged. Existing integrations are unaffected. See Idempotency.

2026-06 - Bill payments + reference sync

  • Bill payments added. New endpoints for cable TV, electricity, education and broadband - list products, verify a customer identifier, and pay. See Bill payments.
  • token field (additive). Purchase and transaction responses now include an optional token (electricity prepaid token, education PIN; null otherwise). Existing integrations are unaffected.
  • service values. Transaction service now includes CableTv, Electricity, Education, Broadband alongside Data and Airtime.
  • ported removed from requests. Data and airtime purchases no longer accept a ported field - we always handle ported numbers upstream, so you don't need to send it. Requests that still include it are ignored (non-breaking).
  • providerReference. The upstream reference field is named providerReference (it was briefly dataStationReference); same value, neutral name.