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 inINVITED 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 anACTIVE
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 aSUSPENDED 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
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 bysort_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 standardIdempotency-Key header described in
Errors. It is optional here, unlike on the reseller-facing order
endpoint where it is mandatory.