Skip to main content
These endpoints let a merchant read and steer their own wholesale reseller program: list reseller accounts, invite new ones, suspend and reinstate them, and read or update the program settings. They are part of the merchant Developer API and authenticate with a normal shx_ API key. The API resellers themselves use to buy wholesale stock is a different API. See the Reseller API.
Tier authoring, product enrollment, and per-product price overrides are dashboard-only. They are configuration for the price cascade, not automation, and a second write path for them creates a second source of truth. GET /dev/v1/reseller-tiers is read-only for exactly that reason.

Scopes

A key with only resellers.read gets 403 FORBIDDEN on any of the write routes. Reseller scopes are not implied by customers.*, even though the dashboard puts Resellers under Customers.

Endpoints

GET /dev/v1/resellers

Page-based list, newest first.

GET /dev/v1/resellers/

Returns { "data": { "reseller": { … } } } with the same object. 404 RESELLER_NOT_FOUND when the ID belongs to another shop or does not exist.

POST /dev/v1/resellers/invite

Sends the wholesale invitation email and creates the relationship in INVITED state.
tier_id is optional. Omit it to use the program’s default tier. If neither is set the call fails with 422 and the message asks you to pick a tier. Requires an enabled program. Inviting an email that is already INVITED, APPLIED, ACTIVE, or SUSPENDED returns 409 CONFLICT. A previously REJECTED email can be re-invited.

POST /dev/v1/resellers//suspend

Blocks wholesale pricing and revokes Reseller API access for that account. Only an ACTIVE reseller can be suspended. Anything else returns 422. The row is never deleted, so the status history stays intact.

POST /dev/v1/resellers//reinstate

Returns a SUSPENDED reseller to ACTIVE. Only a SUSPENDED reseller can be reinstated.
Reinstating sends no webhook. There is no reseller:reinstated event. Shoppex only sends reseller:suspended on the way out.

GET /dev/v1/reseller-program

The row is created lazily. The first read on a shop that never opened the Resellers page returns a disabled program in MANUAL mode rather than a 404.

PATCH /dev/v1/reseller-program

Partial update. Every field is optional.
enrollment_mode: "OPEN" without a default_tier_id returns 422. Open enrollment turns customers into resellers without review, so the tier they land in has to be decided up front. An unknown default_tier_id returns 404 RESELLER_TIER_NOT_FOUND.

GET /dev/v1/reseller-tiers

Read-only, ordered by sort_order.
auto_advance_revenue and auto_advance_orders are the thresholds that promote a reseller into this tier automatically after an order completes. Either being null means it is not part of the condition. auto_advance_requires_both: false means hitting either threshold is enough.

Idempotency

All three write routes accept the standard Idempotency-Key header described in Errors. It is optional here, unlike on the reseller-facing order endpoint where it is mandatory.