All admin endpoints below require:
- JWT with
role = SUPER_ADMIN IpAllowlistGuard— caller IP must be in the operator allowlistGeoBlockGuard— caller geo must be permitted
403.Partnership-PSP preset
Each merchant payload includes apartnership field. The provisioner reads the partnership
registry and applies the matching preset:
| Partnership | PSPs wired | Default MoR |
|---|---|---|
shopsadiq-telr-gcc | Telr | Shopsadiq |
mcredit-bonum-mn | Bonum | MCredit |
stripe-direct-us | Stripe | Merchant |
paypal-direct-eu | PayPal | Merchant |
aggregator-shopsadiq | Stripe + PayPal + Telr | Shopsadiq |
aggregator-droplinked | Stripe + PayPal | Droplinked |
partnership is omitted, the provisioner falls back to the region default
(documented in the PSP × MoR cohort taxonomy).
POST /admin/aggregate-merchant-provisioner/single
Provisions one merchant.Authentication
| Guard | Requirement |
|---|---|
| JWT | Required, role = SUPER_ADMIN |
| IP allowlist | Caller IP in ADMIN_IP_ALLOWLIST |
| Geo | Country in ADMIN_GEO_ALLOWLIST |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Merchant primary email; becomes the JWT sub for the owner |
shopName | string | Yes | Storefront name; subdomain auto-generated from this |
region | enum (US | EU | GCC | MN | OTHER) | Yes | Drives PSP defaults and FX rounding |
partnership | string | No | Partnership preset key; falls back to region default |
kybCohort | string | No | One of the 8 cohort enums; defaults to A-Connect |
contact.fullName | string | Yes | Real name of the merchant contact |
contact.phone | string | No | E.164 phone |
options.skipKybVerification | boolean | No | Defaults false; only set true for internal test merchants |
options.seedDemoProducts | boolean | No | Defaults false; seeds 3 demo SKUs for walkthrough demos |
Response — 201 Created
Error responses
| Status | When |
|---|---|
400 | Missing/invalid field; unknown partnership key; unknown kybCohort |
403 | JWT / IP / geo guard failed |
409 | A merchant already exists at this email or subdomain |
Example
POST /admin/aggregate-merchant-provisioner/bulk
Provisions an array of merchants. Each entry is attempted independently — a failure on one does not abort the batch. The response partitions results intosuccessful and
failed.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
merchants | array (1-100) | Yes | Array of single-provisioner payloads |
Response — 207 Multi-Status
Error responses
| Status | When |
|---|---|
400 | Array empty, > 100 entries, or every entry is structurally invalid |
403 | JWT / IP / geo guard failed |
207 Multi-Status whenever at least one entry succeeds and at
least one fails; 201 when all succeed; 400 when all fail validation.
GET /admin/aggregate-merchant-provisioner/preview
Dry-run: validates payloads and resolves partnership presets, but does not write. Useful for “what would happen if I bulk-provisioned this CSV?” before committing. Accepts the same body shape as the bulk endpoint, sent viaGET with the payload in the
request body (Mintlify renders this — the backend reads JSON from the request body on this
route specifically).
Response — 200 OK
Example
Operational notes
- Idempotency: the provisioner is not idempotent. Re-submitting the same email
returns
409. Use the preview endpoint to scrub a CSV before running bulk. - Email invitations: the owner-user invitation email is sent synchronously on
successful provision. If your operator workflow sends a custom welcome email, set
options.skipInvitationEmail(boolean, defaultfalse). - Cohort routing: the
kybCohortfield flows downstream into the lending eligibility, cost-comparator, and affiliate-commission projections. Choose intentionally.
Related
- Bonum admin — per-merchant Bonum config (set after provisioning when partnership =
mcredit-bonum-mn). - Telr admin — Telr reconcile for partnerships that wire Telr.
- Network Health KPIs — track verified-shops + GMV growth after bulk provisioning.