Provisioning clients
Partner endpoints for creating, reading, and updating merchant accounts. All calls require a Bearer pmn_partner_... key issued by PayMeNow.
Create a merchant
POST https://paymenow.dev/api/partner/clients
Authorization: Bearer pmn_partner_...
Content-Type: application/json
{
"email": "owner@merchant.com",
"name": "Acme Co",
"fee_percent": 5
}
Response:
{
"client_id": "e2a0...",
"api_key": "pmn_live_...",
"secret_key": "pmn_sec_...",
"webhook_secret": "pmn_whsec_...",
"dashboard_url": "https://paymenow.dev/dashboard/"
}
| Field | Required | Notes |
|---|---|---|
email |
yes | Owner email. Must be unique across PayMeNow. |
name |
no | Display name. |
fee_percent |
no | Clamped to the fee range your partner account is configured with. Omit to use the maximum. |
Store api_key (public, used in embeds) and secret_key (server-side only, used from your backend) on your side keyed to the user who owns the merchant.
webhook_secret is for verifying normalized PayMeNow webhooks. Automatic outbound webhook delivery is not currently enabled; use the merchant dashboard/API for payment status.
Idempotency
Posting the same email under the same partner twice returns the existing record (same client_id and api_key). Safe to retry.
Posting an email that already exists under a different partner or as a self-serve PayMeNow signup returns 409 Conflict. You cannot capture merchants who already have an account.
Read a merchant
GET /api/partner/clients/{client_id}
Authorization: Bearer pmn_partner_...
Response:
{
"client_id": "e2a0...",
"email": "owner@merchant.com",
"name": "Acme Co",
"fee_percent": 5,
"onboarded": false,
"created_at": "2026-10-02T10:00:00Z"
}
Returns 404 for any client that was not provisioned by your partner account.
Update metadata
PATCH /api/partner/clients/{client_id}
Authorization: Bearer pmn_partner_...
Content-Type: application/json
{ "name": "Acme Corporation" }
Only metadata is updatable by partners. fee_percent, email changes, and other sensitive fields require merchant action or PayMeNow support.
Rendering the embed
Once you have the api_key, drop the standard embed on your user's site:
<div id="paymenow-form"
data-api-key="pmn_live_..."
data-product-id="550e8400-e29b-41d4-a716-446655440000">
</div>
<script src="https://paymenow.dev/embed/paymenow.js"></script>
See the client Getting started doc for all embed modes.
Letting the owner log in
PayMeNow's dashboard accepts any merchant email via OTP login. Point partner-provisioned users at /dashboard/, they enter their email, receive a code, and sign in. On first sign-in they must accept the Terms of Service. Payments for the merchant are rejected with 403 and code terms_not_accepted until they do. From there they can:
- See their payment history and balance
- Create / edit products
- Connect a Stripe account to receive payouts
Your platform does not need to manage any of that.