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 surface — 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 would be 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 emits no webhook. There is no reseller:reinstated event — only reseller:suspended on the way out.

GET /dev/v1/reseller-program

The row is created lazily, so 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.

Next Steps

Merchant guide

Set the program up in the dashboard.

Reseller API

What your resellers can automate.