All systems operationalโ€ขIP pool status
Coronium Mobile Proxies

Open-source implementation guide

Mobile proxy
reseller kit

Build your reseller dashboard with working API patterns, AI coding guidance and a plan for production.

From order to working connection

Save the order

Your server records the customer, approved price and a stable order key before making a purchase request.

Architecture walkthrough. No live orders or account data.

What the Coronium reseller kit actually gives you

A mobile proxy reseller buys access from a supplier, packages that access under their own brand and supports the end customer. The supplier operates or sources the mobile network infrastructure. You decide what to sell, collect retail payments and keep customer connections working when upstream details change.

The Coronium Reseller Kit is an MIT-licensed starting point for that software. The reviewed Next.js example is a private operator dashboard. It lets your team map customers to proxies, buy and renew access, and receive signed lifecycle events. Its SQLite database stores customer records, modem assignments and webhook events on a persistent disk. [1] [2]

Kit responsibilities and additional production work
AreaIncluded in the reviewed exampleYour production work
Operator accessAdministrator login and protected server routesHTTPS, login rate limits, secret handling and operator access policy
Proxy managementInventory, protocol credentials, purchases and explicit renewalsProduct packaging, customer ownership checks and delivery workflow
RecoverySigned event inbox, SQLite customer mapping and a reconciliation workerMonitor the worker, handle review events and notify affected customers
Retail businessIntegration code you can modify under MITCustomer login, checkout, invoicing, refunds, support and customer terms

Use this page for the implementation. The reseller business playbook covers market selection and launch planning; reseller onboarding is the route for an account-specific commercial agreement.

Choose the operating model before writing code

Owning a dashboard and owning mobile hardware are separate decisions. An API reseller still operates the retail application and supports customers. A hardware operator takes on carrier contracts, power, cooling and recovery as well.

Mobile proxy reseller operating models
ModelWhat you operateWhat to check
API resellerYour application, customer billing and first-line support; upstream supplies proxy accessInventory, API contract, renewal rules, recovery capability and supplier dependency
Own proxy farmHardware, SIMs, network access and customer softwareCarrier terms, physical maintenance, redundancy and utilization
Hosted white-label storefrontBrand, sales and support on a provider-hosted applicationExport options, branding limits, checkout ownership and recurring fees
AffiliateReferral traffic and acquisitionAttribution, payout rules and who owns the customer relationship

If hardware ownership is part of your plan, start with the proxy farm operating guide and hardware options. For an API business, compare the actual product contract in our mobile proxy provider guide. Dedicated device access, bandwidth billing and replacement terms are different products, even when they share the same country label.

Run the kit, then give your coding agent a bounded task

Start with the working repository so the agent can inspect real routes and types. The existing client gives the agent concrete API fields, and the README specifies the required worker. The setup below pins the snapshot reviewed for this article; check upstream changes before adopting it for a new deployment. [1]

Clone and run the reviewed operator dashboard
git clone https://github.com/bolivian-peru/coronium-reseller-kit
cd coronium-reseller-kit
# Review the latest changes, or reproduce the snapshot used in this guide:
git checkout e5e9030c4532f6380dffb2ba3a8f1bbd49735ff1
cd examples/nextjs-dashboard
cp .env.example .env
# Set the API key, operator login and webhook signing secret locally.
npm ci
npm run build
npm run start
# In a second terminal, from the same directory:
# npm run worker

Use a Node version supported by the checked-out package. The reviewed README specifies Node 20 or later. Configure CORONIUM_API_KEY, RESELLER_ADMIN_USER, RESELLER_ADMIN_PASSWORD and CORONIUM_WEBHOOK_SECRET in the server environment. Obtain the signing secret through Coronium support. Keep the local environment file out of version control. [2]

Choose durable hosting for the example

Run one Next.js instance with a persistent writable disk and the reconciliation worker. Back up SQLite and its WAL state consistently. An unchanged copy on an ephemeral serverless filesystem can lose customer mappings or webhook events. To use Vercel or another serverless deployment, first replace local storage with a shared durable database and provide a worker or queue. [2]

A prompt for adapting the existing application

This prompt defines the implementation and the tests. It does not authorize an agent to spend account balance. Keep purchase and rotation tools under the approval controls of your coding environment.

AI coding prompt for the reseller kit
Work in my fork of https://github.com/bolivian-peru/coronium-reseller-kit.
Read AGENTS.md, llms.txt and examples/nextjs-dashboard/README.md first.
Use the existing operator dashboard as the foundation.

Implement only these requirements:
- My branding and operator-only customer/proxy management.
- Separate HTTP and SOCKS5 endpoint display; capability-aware actions.
- Purchases with a persisted order intent and stable Idempotency-Key.
- Explicit renewals with a fresh server quote and price confirmation.
- Signed lifecycle events in a durable inbox, plus the reconciliation worker.
- A durable customer/modem index and metadata re-stamping after replacement.

Keep API keys, webhook secrets and proxy passwords out of logs and client bundles.
Keep operator authentication. Do not add a public customer portal unless requested.
Use a persistent disk for SQLite and run one app instance plus the worker.
If targeting serverless, propose a shared durable database before deployment.
Read credentials from local environment configuration; do not print them.

Run read-only integration checks first. Test errors and duplicate events locally.
Report documentation conflicts rather than inventing the API contract.
Ask before a purchase, renewal, rotation or other account-changing test.
Finish with build results, test evidence and remaining production work.

Load the instructions in your AI tool

The API contract is the same whichever coding assistant you use. Instruction discovery differs, so confirm that the agent has read the kit before it edits payment or webhook code.

Codex

Open the fork as the project. Codex reads applicable AGENTS.md instructions; check nested instructions before changing a subdirectory. [8]

Claude Code

Current versions can load AGENTS.md when a project has no overriding CLAUDE.md. If your project uses both, check the configured loading rules or import @AGENTS.md from CLAUDE.md. [9]

Cursor

Use the repository instructions and any scoped project rules. Cursor supports nested AGENTS.md files; avoid maintaining conflicting copies of the API contract. [10]

Windsurf / Devin Desktop

The Windsurf instructions URL now redirects to Devin Desktop documentation. It describes root and directory-scoped AGENTS.md discovery. Check the behavior in the installed client. [11]

Aider

Load the contract explicitly with /read AGENTS.md or aider --read AGENTS.md, then add only the files needed for the change. [12]

GitHub Copilot

Repository instruction support varies by Copilot feature. Use the documented instruction file for your environment and explicitly include the kit contract in the task. [13]

For tool access from an editor, see the Coronium MCP integration and machine-readable API resources. Enabling an MCP server can expose account-changing actions; repository context alone does not grant permission to run them.

The integration details that decide whether orders recover

1. Read stock and each protocol endpoint separately

Send X-Coronium-Proxy-Credentials: separate-protocol-v1 on stock and purchase requests when your client supports separate endpoints. The current public stock endpoint accepted this contract during our October 11 check. Inventory changes between a quote and a purchase; a successful read is not a reservation. [3] [4]

Read current tariff availability
# Read-only. A stock response does not reserve a proxy.
curl --fail-with-body "https://api.coronium.io/api/v3/tariffs/available" \
  -H "X-Coronium-Proxy-Credentials: separate-protocol-v1"

When proxyEndpoints is present, read http and socks5 independently. Each can have its own host, port, username and password. Use flat fields only for legacy rows without that object. Gate actions on the advertised capabilities rather than a provider name. Do not offer replacement or automatic renewal for a proxy that does not support it. [4]

Match the requested country, carrier and rental term. Several tariff periods can point at the same devices, so adding tariff stock counts can overstate inventory. For customer setup, link to the SOCKS5 guide and use the proxy checker to diagnose protocol or authentication mistakes.

2. Persist purchase intent before sending money

Save the customer, tariff, approved amount, request body and order key before the request. The explicit idempotency contract replays the first successful response for the same key and identical request for 24 hours. Reusing the key with different request details is a conflict. Generating a new key after a timeout can create another purchase. [3]

Paid account-credit purchase with a stable order key
# PAID REQUEST. First create and save purchase.json with your chosen tariff.
# Example purchase.json body (metadata is a JSON-encoded string):
# {"tariff_id":"YOUR_TARIFF_ID","modemCount":1,
#  "metadata":"{\"customer_id\":\"customer-007\"}"}

# Set ORDER_KEY once from your persisted order record.
# Reuse that key AND the exact file on every retry of this order.
curl --fail-with-body \
  "https://api.coronium.io/api/v3/payment/buy-with-account-credit" \
  -H "Authorization: Bearer $CORONIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "X-Coronium-Proxy-Credentials: separate-protocol-v1" \
  -H "Idempotency-Key: $ORDER_KEY" \
  --data-binary @purchase.json

The exact field is modemCount. Send metadata as a JSON-encoded string, including an internal customer identifier. Keep names, email addresses and other personal details in your own customer system unless the upstream mapping needs them. The kit client implements this encoding. [1]

Reconcile the actual charge from billing.charged_usd, with subtotal_usd and discount explaining the difference. A submitted coupon is not evidence that a discount was applied. Store the returned charge and the supplied proxies together in your order ledger. [5]

3. Quote an owned proxy before renewing it

Use POST /payment/renewal-quote for the exact modem and number of days. Show the fresh quote before charging and carry the same coupon into the renewal request. A tariff for the same country can belong to a different carrier or product. The example performs explicit renewals; it does not implement your customer's recurring retail subscription. [2] [5]

Account credit and BTC are separate payment lanes in the reviewed client. Do not infer the spendable balance from a generic wallet total. A support process must also handle customer cancellation before your next upstream purchase or renewal.

4. Verify, store and deduplicate lifecycle events

Lifecycle events carry event_id, event and event-specific fields under data. Verify X-Coronium-Signature against the exact raw body before parsing. Insert the event into durable storage using a unique event ID, then return a successful acknowledgment. Process it in a worker that can resume after a crash. [3] [7]

Raw-body HMAC verification in Node.js
// Signature verification only; not a complete webhook receiver.
import { createHmac, timingSafeEqual } from 'node:crypto';

export function verifySignature(rawBody, header, secret) {
  if (!secret || typeof header !== 'string') return false;
  const expected = 'sha256=' + createHmac('sha256', secret)
    .update(rawBody).digest('hex');
  const a = Buffer.from(expected);
  const b = Buffer.from(header);
  return a.length === b.length && timingSafeEqual(a, b);
}

// Then: validate envelope -> durable insert keyed by event_id -> 2xx.
// Process the saved event in a worker. A failed insert must not return 2xx.

The full receiver implementation also validates the envelope and limits payload size. Keep payloads and proxy passwords out of logs. Log an event ID, processing outcome and request ID instead. Duplicate delivery must not duplicate customer credits or notifications.

For modem.replaced, find the customer through the old modem's durable local mapping. Confirm the new modem belongs to your account, update the assignment and restore metadata.customer_id on the replacement. Replacement metadata is not inherited. Notify the customer through your own workflow; the starter does not send customer email or update a customer's browser configuration. [2] [6]

Replacement depends on product capability and available stock. A modem.dead or failed-purchase event needs an operator response. Poll expiry and health as a reconciliation check, and test recovery when events arrive late or out of order.

5. Read rotation results, then tell the customer what happened

The authenticated POST /modems/{id}/restart is documented as synchronous. Both a changed IP and an unchanged IP can return HTTP 200. Branch on rotated and read ip; the old ?sync=true example and new_ip field are not the current documented contract. Authentication, validation and infrastructure errors still need their own handling. [3]

Interpret authenticated rotation results
// Successful HTTP response examples. They describe different outcomes.
{ "result": "ok", "rotated": true,  "ip": "198.51.100.21" }
{ "result": "ok", "rotated": false, "ip": "198.51.100.20" }

// After checking authentication and HTTP errors:
if (body.rotated === true) showConfirmedIP(body.ip);
else showRotationFailure(body.message);

The token-based rotation route has a separate status contract. Follow the reference for the exact route you call, respect cooldowns, and do not loop rotations when the carrier retains the same IP. The IP troubleshooting guide helps distinguish a connection failure from an account restriction that a new address cannot resolve.

API reference and a useful failure-handling contract

Requests below are relative to https://api.coronium.io/api/v3. Keep the account Bearer key on your server. Use the live API reference alongside the reviewed kit client; the client also shows the explicit renewal routes. Check each operation's schema before implementing its request body.

Reseller API operations
MethodPathIntegration responsibility
GET/accountRead account credit and crypto balances separately.
GET/tariffs/availableRead current offers; include the protocol credential header.
GET/account/proxiesRead owned proxies, expiry, metadata and protocol endpoints.
GET/account/proxies/healthCheck device health and plan a support response.
POST/payment/buy-with-account-creditPaid purchase using account credit. Preserve request identity.
POST/payment/buy-modems-with-crypto-balancePaid purchase using the documented BTC balance lane.
POST/payment/renewal-quoteRead-only quote for exact owned modems and rental terms.
POST/payment/renew-with-account-creditExplicit paid renewal after price confirmation.
POST/payment/renew-modems-with-crypto-balanceExplicit paid renewal using the BTC lane.
POST/modems/{id}/restartRotate when supported; inspect rotated in the response.
PUT/modems/{id}/set-metadataRestore a customer tag after a supported replacement.
PUT/account/webhookRegister the final public HTTPS receiver URL.
POST/account/webhook/testSend a test delivery; inspect the actual delivery result.
Reseller API failure handling
SignalMeaning to preserveOperator action
401 / 403Authentication or access failedCheck the configured account key and permissions; do not expose it to the browser.
409 OUT_OF_STOCKThe selected product is unavailableRefresh the offer and ask the buyer before changing product or price.
409 duplicate_requestRequest identity or outcome needs inspectionRead reason; reconcile an in-progress or unknown order before choosing a new key.
429The operation is rate-limitedRespect the endpoint cooldown or retry guidance.
Timeout / ambiguous 5xxThe purchase may still have completedKeep the order key; inspect payments, owned proxies and balance.
rotated: falseThe authenticated rotation did not change the IPShow the failure and wait before another supported attempt.
Webhook queuedRecorded for delivery, not yet acknowledged by youCorrelate event_id with the durable inbox and monitor processing.

Documentation difference to check during integration

On October 11, the live reference described webhook.test as a flat payload and an eight-second delivery timeout. The reviewed kit docs describe an enveloped test event and five seconds; its receiver requires event_id and data. We did not trigger an authenticated delivery to resolve that difference. Aim to persist and acknowledge within five seconds, inspect the test delivery result, and verify lifecycle handling with a signed fixture. Keep signature and envelope validation intact. [3] [6] [7]

Price the service using contribution, not markup alone

Markup compares the selling price with the supplier cost. It leaves out payment fees, support and customer acquisition. Contribution is what remains after the variable costs you enter; fixed costs still need to be covered. Use an actual account quote and the billed charge for your country, carrier and term.

Model your monthly contribution

Illustrative defaults, not Coronium prices. Enter your quote and operating costs. Values stay in your browser.

Contribution per port, before fixed costs

$27.03

Price less supplier cost
$40.00
Contribution margin
27.3%
Break-even paid ports
3
After fixed costs / month
$210.30

Before tax, acquisition costs and any costs you have not entered. Assumes every counted port is paid for and supplied at the entered cost for a full month.

Contribution = price โˆ’ supplier cost โˆ’ support โˆ’ other variable cost โˆ’ payment fee

In the example, a $99 sale and $59 supplier cost create a $40 spread. After a 3% processing fee, $8 of support and $2 of other variable costs, contribution is $27.03 per port. Ten paid ports contribute $270.30, leaving $210.30 after $60 of fixed monthly costs. These are arithmetic examples, not measured business results.

Include idle stock, refunds, failed collections and chargebacks in your own model. Price trials using their actual cost and measure conversion from your customers; this guide does not assume a paid-trial conversion rate. The bulk pricing guide explains purchasing models, while reseller onboarding can confirm current account terms.

A launch checklist with observable acceptance checks

Test the parts that can lose an order, expose a credential or leave a customer offline. Keep read-only checks separate from actions that spend balance or alter a running connection.

  1. Protect the operator application

    Require login for pages and API routes, serve HTTPS, rate-limit login attempts and confirm that anonymous requests cannot retrieve credentials. Test cross-origin mutations.

  2. Verify configuration without spending

    Use the kitโ€™s examples/verify-integration.mjs from the repository root with the API key supplied through your local environment. It reads stock, account state and configuration by default. Do not print the key.

  3. Preserve customer ownership

    Map a customer to each purchased modem and backfill existing assignments before enabling replacement reconciliation. A customer portal must authorize every read and action on the server.

  4. Test one approved paid order

    Confirm the tariff, total and payment lane first. Save the stable order key, reconcile the response and verify each supported protocol. Keep a timeout in an unresolved state until reconciled.

  5. Exercise the webhook inbox

    Test a valid signature, a tampered body, an unsigned event and duplicate delivery. Verify that a failed database write produces an error response and that a worker restart resumes pending work.

  6. Rehearse a replacement and a failure

    Use fixtures for the old/new modem mapping, metadata restoration and no-stock outcome. Verify customer notification through your own system and keep unknown assignments visible for review.

  7. Verify renewals and expiry

    Quote the exact owned modem, confirm the price and use a stable renewal key. Check cancellation behavior and expiry reconciliation without assuming an advance-expiry webhook will arrive.

  8. Restore before you scale

    Restore a backup to a separate environment, confirm mappings and event history, and prove the worker runs after deployment. Add shared durable storage before running multiple app instances.

Record the response request_id when asking support to investigate an order. Send the event ID and processing state for webhook problems. Avoid including account keys or full proxy credentials in tickets.

Frequently asked questions

What is a mobile proxy reseller kit?

It is source code and integration guidance for selling access to mobile proxies supplied through an upstream API. The Coronium kit provides an MIT-licensed operator dashboard, purchase and renewal flows, customer mapping and a signed event inbox. You run the application and handle your retail customer relationship.

Is the kit a complete white-label customer portal?

The reviewed example is an operator dashboard protected by an administrator login. A public customer portal needs tenant authentication, ownership checks, retail checkout, notifications and customer-facing support workflows. Those are additional development work.

Can Codex, Claude Code or Cursor build on the kit?

Yes, these coding tools can work on the repository. Load the project instructions and give the agent a limited implementation task with acceptance checks. Review its output and test it. A prompt alone does not establish production readiness, and paid account actions should require explicit approval.

Can I deploy the unmodified kit to Vercel?

The reviewed dashboard stores customer mappings and webhook events in SQLite on a persistent writable disk and requires a reconciliation worker. Use a persistent VM or container volume for that example. Before using an ephemeral serverless host, replace local storage with a shared durable database and provide a durable worker or queue.

Does customer metadata survive a modem replacement?

The reviewed kit documents that replacement modems do not inherit the original metadata. Keep a durable mapping from the old modem to its customer. After confirming the replacement belongs to your account, update the mapping and re-stamp metadata on the new modem.

Does HTTP 200 prove the IP changed?

For the authenticated restart endpoint, a successful HTTP response can contain rotated: false. Inspect rotated and ip in the response body. The token-based rotation endpoint has a different status contract; do not apply one endpointโ€™s success rules to the other.

Can HTTP and SOCKS5 use the same credentials?

Some legacy proxies use shared credentials, but proxies with separate protocol endpoints can have different hosts, ports, usernames and passwords. Read proxyEndpoints.http and proxyEndpoints.socks5 independently. Do not reuse legacy HTTP credentials for a separate SOCKS5 endpoint.

What markup should a proxy reseller charge?

Use the actual supplier charge and your own support, payment, acquisition and operating costs. A markup is not a net margin. The calculator on this page uses illustrative inputs and calculates contribution before tax and any omitted costs; it does not predict sales or promise returns.

Sources, review method and what was tested

Coronium publishes this guide about its own kit. We reviewed repository commit e5e9030, dated October 7, against the public API documentation on October 11, 2026. The source links below pin implementation claims to that snapshot. The repository's current branch can change after publication.

Validation covered the public stock request, example request syntax, signature verification with signed and tampered local fixtures, and calculator arithmetic. We did not make a paid purchase, renew a subscription, rotate a live modem or prove authenticated webhook delivery for this article. Setup guidance follows the reviewed repository; it is not a claim that every deployment target was tested.

  1. 1.
    Coronium kit: reviewed source and MIT license

    Repository snapshot reviewed October 11, 2026; commit dated October 7.

  2. 2.
    Operator dashboard: setup and deployment requirements

    Persistent SQLite, operator authentication, reconciliation worker and customer-portal limits.

  3. 3.
    Live Coronium API reference

    Authentication, request identity, rotation and webhook contracts. Retrieved October 11, 2026.

  4. 4.
    Stock and separate protocol credentials

    Credential negotiation, endpoint capabilities, rental terms and stock counting.

  5. 5.
    Billing and renewal reconciliation

    Itemized charges, coupons, carrier matching and webhook receipt fields.

  6. 6.
    Webhook integration and customer mapping

    Signed lifecycle envelopes, deduplication, replacement metadata and recovery limits.

  7. 7.
    Receiver implementation

    Raw-body signature verification, envelope validation and durable insert before acknowledgment.

  8. 8.
    Codex project instructions

    Official AGENTS.md documentation, checked October 11, 2026.

  9. 9.
    Claude Code project memory

    Current AGENTS.md and CLAUDE.md loading rules, checked October 11, 2026.

  10. 10.
    Cursor rules

    Project instructions and nested AGENTS.md, checked October 11, 2026.

  11. 11.
    Windsurf / Devin Desktop project instructions

    Windsurf documentation redirects here; workspace and directory scoping checked October 11, 2026.

  12. 12.
    Aider read-only conventions

    Explicitly load instruction files with /read or --read.

  13. 13.
    GitHub Copilot repository instructions

    Instruction support depends on the Copilot surface; checked October 11, 2026.

Related reading

Business side: the reseller business playbook and bulk pricing and volume discounts (10% at 10+ lines, 15% at 25+, code on request). Program details: Coronium reseller program.