Reference
Changelog
Breaking and notable changes to the v3 API. We follow semver (opens in a new tab) — additive changes (new optional parameters, new actions, new fields in responses) ship within a major version; breaking changes go in a new major.
- Latest
v3.2: A new order system: one error list, simpler drip-feed, clearer cancel and refill
Everything below ships together under the header
X-NotPanel-API-Version: 2026-10. Every earlier action keeps working, and the /api/v1, /api/v2 and /api/v3 addresses behave identically.- Every order has one number that works in the dashboard, in support and in the API. API orders keep their old numbers.
- Drip-feed:
runswithintervalstill works. The new simple form takes the totalquantityanddrip_feed_total_minutes, up to 48 hours. - Cancel is instant with a full refund during the first 15 seconds. After that you can request a cancel where the service supports it, with an automatic refund.
orderreturns one object, as before;ordersreturns an array. - Refill works once every 6 hours per order, with no end date and a clear reason when it is refused.
- Telegram reactions are one
reactionsfield, either a mix (👍,❤️,🔥) or exact counts (👍:60,❤️:40), checked before you are charged. - The service list shows tags, extra fields with limits, drip-feed limits and availability.
cancel: truenow means cancel requests really work. - Every error has a fixed code, an HTTP status and a retryable flag. The earlier codes and the current ones are listed below.
- New
order_details, which can also find an order by yourrequest_id. statuscarries the refund: for a canceled or partial order,refundis the refunded amount, so no separate call is needed.refund_quoteis an earlier name that returns the same reply asstatus.- Webhooks are one system now: one signed event per call, versioned, with new events for canceled and partial orders and for refill results.
- Removed: batched webhook bodies, the
couponparameter, and from status therefund_pendingfields and the two refund policy fields. The olddelayparameter is no longer read; usedrip_feed_total_minutes. - Added:
can_cancelin status andinstant_cancel_untilin the reply ofadd. The earliercancel_availablestays in both, andcancel_window_secondsandcancel_beforestay in the reply ofadd. - Kept: the
catalogandaccount_statusactions keep working as before, andcatalogis now documented under List services. Earlier parameter names still work:referer,lpost_count,hashtagfor hashtag lists, comma-separatedusernamesand the earlier reactions map.webhook.addalso accepts the event namesorder.refundedandorder.refill_completed. /api/v1,/api/v2and/api/v3all keep working and behave the same./api/v3is the one documented.- A completed order always shows
remainsas 0.
v3.1: Optional market-native service names
The services and catalog actions now accept an optional language code for localized service names using curated market terminology in ten supported languages. Curated market terminology preserves recognizable brands and product identifiers; admins can review or refine individual names. Explicit requests add canonical-name and actual-language metadata and safely fall back to English when a translation is missing or stale. Requests without language keep the legacy English response shape unchanged; numeric service IDs remain the stable integration key.
v3.0: v3 becomes the default API
Promoted /api/v3 as the canonical endpoint and made the familiar reseller contract a direct base-URL replacement. v3 adds optional caller-controlled idempotency, 60-second protection for identical legacy adds, the advanced catalog, numeric order and refill IDs, refund_quote, account_status, single or sequential bulk cancellation with the unchanged 15-second ordinary-order window, batch status and refill, and signed webhooks. API throughput now uses a lifetime-successful-spend tier and one rolling 60-second account bucket shared by every key. /api/v1 and /api/v2 are exact aliases of the same current contract.
v2.5: Advanced catalog, refund reconciliation, and cancellation
Added the paginated catalog and read-only refund_quote actions, expanded add and status metadata, and added a 15-second cancellation window for ordinary API orders. API webhook events now carry a stable event id, while a deliveryId remains stable across retries of the same batch; each retry gets a new timestamp and signature. Webhook delivery remains best-effort with retries, not a durable at-least-once guarantee.
v2.4: 12 new media platforms in the catalog
Added services for Google, Rumble, Audiomack, Tumblr, Kwai, Clubhouse, Vimeo, Deezer, Tidal, Apple Music, Quora, and GitHub. They appear in the services action like any other service and each has a dedicated public platform page. No client changes required — new service IDs simply show up in the catalog.
v2.3: Service availability enforced on add
Unavailable services reject action=add instead of silently accepting or queuing a new order. Refresh the catalog and choose an available service before retrying.
v2.2: Optional order parameters
The add action now accepts supported service-type-specific optional fields, such as a start delay and per-type engagement options. Fields already defined by a service type keep their documented meaning.
v2.1: Drip-feed parameters on order placement
The add action accepts runs and interval together for services with dripfeed=true. Total delivery is quantity × runs and cannot exceed the service maximum. Non-drip services reject these fields.
v2.0: Public launch of the v2 API
Launched the form-encoded v2 action API with rate controls, signed best-effort webhooks with retries, and idempotent order placement. The current v1 and v2 URLs are aliases of the v3 contract and use the documented shared account limit.
Moving from earlier versions
Error codes and webhook event names changed. Use these lists once when you update your code.
Error codes
Earlier replies used the codes on the left. Version 3.2 uses one closed list, shown in Errors. The last column says how they map.
| Earlier | Now | How it changed |
|---|---|---|
| INVALID_ACTION | INVALID_ACTION | Same code. |
| MISSING_SERVICE, MISSING_LINK, MISSING_QUANTITY, MISSING_ORDER, MISSING_ORDER_PARAMETER, MISSING_REFILL, MISSING_WEBHOOK_URL, MISSING_WEBHOOK_ID, NO_ORDER_IDS, NO_REFILL_IDS, NO_WEBHOOK_EVENTS, MISSING_CUSTOM_FIELD | MISSING_PARAMETER | Several earlier codes became one. Read details for the specifics. |
| INVALID_SERVICE_ID, INVALID_QUANTITY, LINK_TOO_LONG, IDEMPOTENCY_EMPTY, IDEMPOTENCY_EMPTY_REQUEST, IDEMPOTENCY_TOO_LONG, IDEMPOTENCY_TOO_LONG_REQUEST, INVALID_LANGUAGE, INVALID_WEBHOOK_EVENT | INVALID_PARAMETER | Several earlier codes became one. Read details for the specifics. |
| INVALID_LINK_URL | INVALID_LINK, LINK_BLOCKED | One earlier code became several, each more specific. |
| INVALID_CUSTOM_FIELD | INVALID_OPTION | Same code. |
| RUNS_INVALID, RUNS_TOO_HIGH, INTERVAL_INVALID, INTERVAL_TOO_HIGH | DRIP_FEED_INVALID | Several earlier codes became one. Read details for the specifics. |
| REQUEST_ID_CONFLICT | REQUEST_ID_CONFLICT | Same code. |
| SERVICE_NOT_FOUND, ADD_SERVICE_NOT_FOUND, WRONG_SERVICE_TYPE | SERVICE_NOT_FOUND | Several earlier codes became one. Read details for the specifics. |
| SERVICE_NOT_ACTIVE | SERVICE_PAUSED | Same code. |
| SERVICE_DISCONTINUED, REFILL_SERVICE_DISCONTINUED | SERVICE_DISCONTINUED | Several earlier codes became one. Read details for the specifics. |
| INSUFFICIENT_BALANCE | INSUFFICIENT_BALANCE | Same code. |
| ORDER_NOT_FOUND, STATUS_ORDER_NOT_FOUND, REFUND_ORDER_NOT_FOUND, REFILL_ORDER_NOT_FOUND | ORDER_NOT_FOUND | Several earlier codes became one. Read details for the specifics. |
| ORDER_ALREADY_COMPLETED, ORDER_ALREADY_REFUNDED | ORDER_FINISHED | Several earlier codes became one. Read details for the specifics. |
| ORDER_NOT_CANCELLABLE | CANCEL_NOT_AVAILABLE, ORDER_FINISHED | One earlier code became several, each more specific. |
| TOO_MANY_ORDERS, TOO_MANY_REFILLS | TOO_MANY_IDS | Several earlier codes became one. Read details for the specifics. |
| INACTIVE_ACCOUNT, ACCOUNT_NOT_FOUND, ACCOUNT_ERROR | INACTIVE_ACCOUNT, EMAIL_UNVERIFIED | One earlier code became several, each more specific. |
| API_RATE_LIMITED, IP_RATE_LIMITED, CANCEL_RATE_LIMITED | API_RATE_LIMITED | Several earlier codes became one. Read details for the specifics. |
| REFILL_STATUS_INELIGIBLE | REFILL_NOT_COMPLETED, REFILL_NOT_AVAILABLE | One earlier code became several, each more specific. |
| REFILL_SERVICE_NOT_REFILLABLE, REFILL_REQUEST_FAILED | REFILL_NOT_AVAILABLE | Several earlier codes became one. Read details for the specifics. |
| REFILL_ALREADY_PENDING | REFILL_ALREADY_PENDING | Same code. |
| REFILL_WAITING_PERIOD | REFILL_COOLDOWN | Several earlier codes became one. Read details for the specifics. |
| REFILL_NOT_FOUND | REFILL_NOT_FOUND | Same code. |
| INVALID_WEBHOOK_URL | INVALID_WEBHOOK_URL | Same code. |
| WEBHOOK_LIMIT | WEBHOOK_LIMIT | Same code. |
| WEBHOOK_NOT_FOUND | WEBHOOK_NOT_FOUND | Same code. |
| REQUEST_PROCESSING, REQUEST_OUTCOME_UNKNOWN, REQUEST_OUTCOME_NOT_RECORDED, REQUEST_UNCONFIRMED, REQUEST_RESULT_UNAVAILABLE, CONFLICTING_REQUEST_RECORDS | – | No longer happens. The API never waits for another system, and later problems arrive as a Canceled order with a reason code. |
Webhooks
Two event names changed. The batched body is gone: each call now carries one event in an envelope with id, type, schema_version, created_at, sequence and data, and endpoints belong to the account instead of a key.
| Earlier | Now |
|---|---|
| order.refunded | order.canceled |
| order.refill_completed | refill.completed |