Build with NeroPay
Build hosted payments, connected accounts, money movement, NeroDisburse, Terminal, NeroCard, NeroTrade, NeroPOS, NeroWeb, bookings, identity, compliance, proof workflows, support tickets and webhooks from one v2 API.
Quick start
Use the live v2 base URL for production. Sandbox endpoints are dry-run and do not create live payment, terminal, payout or local records.
Merchant mode
Use a merchant secret key to operate directly on that merchant account. Identity, compliance, proof, payments, support and resources are available for direct merchant integrations.
Platform mode
Use the platform key. Send NeroPay-Account to operate on a connected merchant. Keep your own customer-facing dashboard while NeroPay manages regulated flows.
Ready-to-Use Plugins
Use official NeroPay plugins when you want a faster launch without building every checkout, invoice, webhook and order status workflow manually.
NeroPay for WooCommerce
Accept card and wallet payments directly in WooCommerce, receive real-time status updates and support refunds from the store workflow. Download link is inside the section.
Open WooCommerce section →NeroPay for Wix
Install NeroPay from the official Wix marketplace, configure public keys and redirect URLs, then test with sandbox checkout.
Open Wix section →NeroPay for Odoo
Connect NeroPay to Odoo eCommerce, Website and Invoicing apps using the Odoo payment provider flow. Odoo 16, 17, 18 and 19 app links are inside.
Open Odoo section →NeroPay for Perfex CRM
Enable invoice payments, IPN callbacks and reconciliation inside Perfex CRM without building a custom gateway. Module download is inside.
Open Perfex CRM section →NeroPay for Zapier
Create payment links and automate payment workflows between NeroPay and thousands of apps without code through Zapier.
Open Zapier section →NeroPay for OpenCart 3
Download directly from NeroPay. Marketplace not required. Hosted checkout; staging acceptance required.
Installation and download →NeroPay for PrestaShop
Download directly from NeroPay. Marketplace not required. Hosted checkout; staging acceptance required.
Installation and download →NeroPay for WHMCS
Download directly from NeroPay. Marketplace not required. Hosted checkout; staging acceptance required.
Installation and download →NeroPay for Magento 2 / Adobe Commerce
Download directly from NeroPay. Marketplace not required. Hosted checkout; staging acceptance required.
Installation and download →NeroPay for WooCommerce
Use the WooCommerce plugin to add secure NeroPay checkout to a WordPress store without building the hosted-payment, order-status and webhook flow from scratch.
Download the WooCommerce ZIP package and upload it from WordPress Admin → Plugins → Add New, or upload it manually by FTP.
Key features
- Quick setup from the WordPress plugin area.
- Secure processing through NeroPay APIs.
- Real-time payment status updates through webhooks.
- Refund support from the WooCommerce workflow where enabled.
Best for
Retail stores that need a standard checkout integration, payment confirmation, order reconciliation and optional advanced API checks.
| Setting | Type | Required | Description |
|---|---|---|---|
| public_key | string | Required | Identifies the merchant account. |
| secret_key | string | Required | Server-side key used by the plugin for secure API actions. |
| webhook_url | string | Required | Receives payment success, failure or pending updates. |
| currency | enum | Required | Store currency such as GBP or EUR. |
NeroPay for Wix
Use the Wix integration for a fast marketplace-style setup. Configure keys, redirect URLs and IPN URL, then send customers to NeroPay checkout.
Install NeroPay from the official Wix marketplace link, then configure Public Key, success URL, cancel URL and IPN URL.
| Field | Type | Required | Description |
|---|---|---|---|
| public_key | string | Required | NeroPay public key configured in the Wix app. |
| success_url | string | Required | Page shown after successful payment. |
| cancel_url | string | Required | Page shown when checkout is cancelled. |
| ipn_url | string | Required | Endpoint that receives payment confirmation. |
NeroPay for Odoo
Choose the module matching your Odoo major version. The Odoo 19 native provider supports hosted online checkout and customer invoice payments.
Odoo 19 requirements
- Odoo 19.0 with custom Python add-on support: self-hosted or Odoo.sh.
- Not installable on Odoo Online saas-19.4.
- HTTPS, Python requests, the API v2 secret and exact receiving account ID.
Odoo 19 scope
- Website / eCommerce and customer invoice hosted payments.
- Verified payment status and scheduled recovery.
- No POS terminal, automatic subscription debit, initiated refunds or settlement reconciliation.
NeroPay for Perfex CRM
Enable NeroPay as a payment gateway inside Perfex CRM so clients can pay invoices online and Perfex can update invoice status from IPN callbacks.
Download the module ZIP, extract it into the Perfex modules directory, then enable NeroPay Payment Gateway from Setup → Payments.
Features
- Online invoice payments.
- GBP and EUR support where enabled.
- Instant Payment Notification updates.
- Success and failure redirects.
- API credentials managed inside Perfex CRM.
Prerequisites
- Running Perfex CRM instance.
- NeroPay merchant account with API credentials.
- Admin access to Perfex CRM.
NeroPay for Zapier
Automate payment workflows between NeroPay and 5,000+ apps without code. Merchants can trigger workflows when a payment is received or create payment links from tools such as Sheets and CRMs.
Use Zapier to create payment links, log transactions, notify teams and sync payment events with CRMs, spreadsheets and 5,000+ apps.
| Action field | Type | Required | Description |
|---|---|---|---|
| public_key | string | Required | NeroPay Public API key. |
| identifier | string | Required | Unique ID for the payment. |
| currency | enum | Required | Currency code such as GBP, EUR or IDR. |
| amount | decimal | Required | Payment amount. |
| details | string | Required | Description or order details. |
| ipn_url | string | Required | Instant payment notification URL. |
| customer_phone | string | Optional | Customer phone number. |
| customer_address | string | Optional | Billing address. |
NeroPay for OpenCart 3
Hosted checkout with server-side payment verification and missed-notification recovery. Marketplace installation is not required.
OpenCart 3.0.3.x / 3.0.4.x; default store; PHP 7.4–8.3 as supported by the store.
NeroPay for PrestaShop
Hosted checkout with server-side payment verification and missed-notification recovery. Marketplace installation is not required.
PrestaShop 8.x / 9.x API target; single shop; single-package carts; platform-compatible PHP 7.4–8.3.
NeroPay for WHMCS
Hosted checkout with server-side payment verification and missed-notification recovery. Marketplace installation is not required.
Self-hosted WHMCS 8.x / 9.x gateway API target; PHP 7.4–8.3 as supported by the installed WHMCS version.
NeroPay for Magento 2 / Adobe Commerce
Hosted checkout with server-side payment verification and missed-notification recovery. Marketplace installation is not required.
Magento Open Source / Adobe Commerce 2.4.x API target; standard Magento checkout; PHP 8.1–8.3 subject to the platform version.
Authentication
/v2/subscriptions* uses a signature that binds the method, path, retry key, account and exact JSON bytes. Follow the subscription signing examples; the legacy timestamp.body examples below do not apply to these routes./v2/neroconnect/management/*.API v2 uses bearer authentication. Unsafe methods also require a timestamped HMAC signature and an idempotency key.
| Header | Type | Required | Description |
|---|---|---|---|
| Authorization | string | Required | Bearer {secret_key}. |
| Accept | string | Required | Always application/json. |
| Content-Type | string | Required | Use application/json for JSON writes or multipart/form-data for file upload endpoints. |
| X-NeroPay-Timestamp | unix timestamp | Required | Required for POST/PATCH/PUT/DELETE. |
| X-NeroPay-Signature | string | Required | HMAC SHA-256 of timestamp.raw_body using the secret key. |
| Idempotency-Key | string | Required | Required for writes that create or mutate state. |
Headers
Headers control JSON responses, connected account scoping, public/client key context and retry safety.
| Header | Type | Required | Description |
|---|---|---|---|
| NeroPay-Account | string | Optional | Connected account ID such as NPVesdTGASO23_547878. Platforms use it to act on a connected merchant. |
| X-NeroPay-Client-Key | string | Optional | Dashboard-visible account client key. If supplied, it must match the authenticated merchant or the NeroPay-Account connected account id. |
| X-NeroPay-Public-Key | string | Optional | Public key from API credentials. |
| Idempotency-Key | string | Required | Unique per business operation. Reuse only for exact retries. |
Connected account scoping works with payments, balances, identity, compliance, proof, support and resource APIs where enabled.
Pagination
List endpoints use page-based pagination when the underlying controller returns a collection.
| Query | Type | Default | Description |
|---|---|---|---|
| page | integer | 1 | Page number. |
| per_page | integer | 25 | Number of records per page. |
| q/search | string | — | Search by supported columns. |
| status | enum | — | Filter by status where supported. |
| from / to | date/datetime | — | Filter by created date where supported. |
| sort | string | -id | Use leading minus for descending order where supported. |
Pagination appears inside meta.pagination. Some single-object APIs return only data.
Errors
Errors return a consistent JSON object with an application code and human-readable message. Provider terminology is normalised to NeroPay-safe wording before it is returned.
| HTTP | Code | Meaning |
|---|---|---|
| 400 | bad_request | Malformed request. |
| 400 | missing_idempotency_key | A required Idempotency-Key header is missing. |
| 401 | unauthenticated | Missing or invalid API key. |
| 401 | invalid_signature | Write request signature verification failed. |
| 403 | forbidden | The authenticated account cannot access the resource. |
| 404 | endpoint_not_found / not_found | Route or object was not found. |
| 405 | resource_read_only | Resource exists but the requested write method is not enabled. |
| 409 | idempotency_conflict | The same idempotency key was reused with a different body. |
| 409 | connected_account_duplicate | A connected account with the same email or username already exists. |
| 409 | duplicate_resource | A resource with the same unique fields already exists for this account. |
| 422 | validation_error | Invalid fields. |
| 429 | rate_limited | Too many requests. |
| 500 | resource_scope_misconfigured | The resource is not safely account-scoped on this installation. |
Authentication and account scope errors
| HTTP | Code | Meaning |
|---|---|---|
| 401 | missing_credentials | No secret key was supplied. |
| 401 | invalid_credentials | The secret key was not recognised. |
| 401 | account_key_mismatch | The supplied public key, client key or account id does not match the authenticated account context. |
| 401 | invalid_signature | The HMAC signature is missing, malformed or invalid. |
| 403 | account_not_allowed | The authenticated account cannot access the supplied connected account. |
| 403 | account_inactive | The merchant account is not active. |
| 403 | neroconnect_not_enabled | NeroConnect platform access is not enabled for this account. |
| 404 | account_not_found | The connected account id was not found for this platform. |
| 422 | invalid_account_id | Use the full NeroPay account id format, for example NPVesdTGASO23_547878. |
Connected account errors
| HTTP | Code | Meaning |
|---|---|---|
| 409 | connected_account_duplicate | A connected account with the same email or username already exists. |
| 422 | connected_account_create_failed | The connected account could not be created. |
| 422 | invalid_idempotency_key | The supplied idempotency key has an invalid format. |
| 409 | duplicate_request | A request with the same idempotency key is still being processed. |
Payment and transaction errors
| HTTP | Code | Meaning |
|---|---|---|
| 403 | account_banned | The account cannot process the requested operation. |
| 403 | payments_paused | The account cannot accept payments right now. |
| 422 | currency_not_supported | The requested currency is not enabled or supported. |
| 422 | invalid_connect_application_fee | The platform fee is invalid or exceeds the transaction amount. |
| 422 | not_cancelable | The transaction can no longer be cancelled. |
| 422 | not_refundable | The transaction is not eligible for refund. |
| 422 | invalid_refund_amount | The refund amount must be greater than zero. |
| 422 | refund_exceeds_transaction | The requested refund exceeds the original transaction amount. |
| 422 | insufficient_balance | The wallet balance is not enough to complete the operation. |
| 422 | provider_reference_missing | The provider payment reference is missing. |
| 422 | cancel_failed / refund_failed | The cancellation or refund could not be processed. |
NeroTrade errors
| HTTP | Code | Meaning |
|---|---|---|
| 402 | nerotrade_subscription_required | NeroTrade is not active for this account. Activate the NeroTrade plan before calling NeroTrade endpoints. |
| 404 | endpoint_not_found | The requested NeroTrade API path under https://eu.neropay.app/v2/nerotrade was not found. |
| 404 | unknown_nerotrade_resource | The requested NeroTrade resource name is not recognised. |
| 404 | resource_unavailable | The requested NeroTrade table or resource is not available on this installation. |
| 404 | not_found | The requested NeroTrade record was not found for this merchant. |
| 404 | customer_not_found | The trade account supplied for an invoice, delivery, payment or statement could not be found. |
| 404 | invoice_not_found | The invoice supplied for a payment could not be found. |
| 405 | use_products | Inventory records should be created as products first, then stock can be updated through the inventory endpoint. |
| 422 | empty_payload | No writable NeroTrade fields were supplied for an update request. |
| 422 | validation_error | A required field is missing or a supplied field is invalid. |
| 503 | nerotrade_schema_missing | NeroTrade database tables are not installed or the NeroTrade SQL update has not been applied. |
Terminal errors
| HTTP | Code | Meaning |
|---|---|---|
| 404 | location_not_found | The location was not found for this account. |
| 422 | location_required | A location id is required. |
| 422 | location_bridge_missing | The location is not ready for terminal reader registration. |
| 409 | reader_already_registered | The location already has a linked reader. |
| 422 | reader_limit_reached | The account has reached its reader limit. |
| 422 | invalid_registration_code | The reader registration code is missing or invalid. |
| 404 | reader_not_found | The reader does not belong to this account. |
| 422 | reader_register_failed | The reader could not be registered. |
| 422 | terminal_payment_failed | The terminal payment could not be created. |
| 422 | reader_cancel_failed | The reader action could not be cancelled. |
| 500 | provider_not_configured | The NeroPay payment bridge is not configured. |
Payout and NeroDisburse errors
| HTTP | Code | Meaning |
|---|---|---|
| 403 | payouts_paused | Transfers are paused for this account. |
| 403 | kyc_required | KYC verification is required before transfers. |
| 404 | bank_account_not_found | The bank account was not found for this merchant. |
| 422 | bank_account_required | A bank account id is required. |
| 422 | bank_account_disabled | The bank account is disabled. |
| 409 | duplicate_bank_account | The bank account is already linked to this merchant. |
| 422 | bank_account_create_failed | The bank account could not be created. |
| 404 | payout_not_found | The payout was not found for this account. |
Idempotency
Use an idempotency key for each write operation that creates or changes financial state. All write requests must also include a valid HMAC signature.
Good
order_1001_payment_attempt_1 reused only when retrying the same body.
Avoid
Do not reuse one key for different payments, payouts, refunds or proof submissions.
Account API
Retrieve the authenticated merchant account, create connected merchants and manage core NeroConnect onboarding state.
/accountReturns the authenticated merchant or the connected merchant when NeroPay-Account is supplied.
/connected-accountsLists connected merchants for a NeroConnect platform.
GET response attributes
| Attribute | Type | Required | Description |
|---|---|---|---|
| account_id | string | Read-only | Public API account ID. |
| business_company_name | string | Optional | Company or trading name. |
| string | Required | Primary merchant email. | |
| status | enum | Read-only | active, pending, banned or review state. |
| kyc_status | enum | Read-only | pending, verified or rejected. |
| neroconnect_email_sms_handle | enum | Optional | neropay or platform. Controls merchant-facing notification delegation. |
| neroconnect | object | Read-only | Returned for NeroConnect platform responses. Includes fee payer, platform safety limit, merchant pricing and default connect application fee context. |
| neroconnect.fee_payer | enum | Read-only | connected_account or platform. Controls where NeroPay processing fees are charged for connected account payments. |
| neroconnect.platform_safety_limit | object|null | Read-only | Returned when the fee payer is platform balance. null when the connected account pays NeroPay processing fees. |
| neroconnect.merchant_pricing | object | Read-only | Shows API, card and keyed/manual fee rates that apply to the connected merchant. In platform balance mode, platforms may manage merchant-specific pricing in the dashboard. |
/connected-accountsCreates a connected merchant. Terms acceptance, authorised legal name and the supported-country fields are required before the account is created.
POST /connected-accounts request attributes
| Field | Type | Required | Description |
|---|---|---|---|
business_company_name | string | Required | Company or trading name for the connected merchant. |
firstname | string | Required | Authorised representative first name. |
lastname | string | Required | Authorised representative last name. |
email | Required | Primary email for the connected merchant. | |
country_code | enum | Required | Supported NeroPay country code such as GB. Must be selected from the supported-country list, not typed freely. |
mobile_code | string | Required | Dial code for the selected country, for example 44 for GB. Should be supplied from the supported-country list. |
mobile | string | Required | Representative or merchant contact mobile number. |
business_type | enum | Required | Business structure such as company, individual or sole_trader where supported. |
nationality | enum | Required | Representative nationality country code from the supported-country list. |
company_registration_number | string | Required for companies | Company registration number where the business type requires it. |
representative_job_title | string | Required | Role/title of the authorised representative, for example Director. |
rep_is_director | boolean | Required | Confirms whether the representative is a company director. |
rep_is_executive | boolean | Required | Confirms whether the representative is an executive/control person. |
rep_is_owner | boolean | Required | Confirms whether the representative is an owner. |
rep_ownership_percent | number | Required when owner | Ownership percentage, for example 100. |
company_declaration | boolean | Required | Confirms the company declaration has been accepted. |
address | string | Required | Registered or trading address line. |
city | string | Required | City/town. |
postcode | string | Required | Postcode. |
dob | date | Required | Representative date of birth in YYYY-MM-DD format. |
industry | string | Required | Industry/MCC-style code accepted by NeroPay onboarding. |
merchant_website_or_product_description | text | Required | Website URL or clear description of the products/services sold. |
terms_accepted | boolean | Required | Must be true. API-created connected accounts are not created without terms acceptance. |
terms_accepted_at | datetime | Required | Time the connected merchant/authorised person accepted the terms. |
terms_ip | ip | Required | IP address captured when terms were accepted. |
legal_name | string | Required | Authorised legal name used to generate the stored electronic signature when a PNG signature is not supplied. |
signature_png_base64 | string|null | Optional | Base64 PNG signature. If omitted, NeroPay stores a generated typed-signature image from legal_name. |
neroconnect_email_sms_handle | enum | Optional | neropay or platform. Controls who handles merchant-facing email/SMS communication. |
metadata | object | Optional | Platform reference data, external IDs or onboarding notes. |
terms_accepted is not true, or the legal acceptance data is missing, the account is not created.rep_is_owner is true, rep_ownership_percent is required and must be between 25 and 100. Use company_has_other_owners and the optional owners[] array only for additional natural-person owners or directors; do not duplicate the authorised representative. Each owners[].email must be unique within the array and different from the connected account's primary email. Supported owner attributes are first_name, last_name, email, dob (YYYY-MM-DD), percent_ownership, is_owner, is_director and is_executive./connected-accounts/{account_id}Retrieves one connected merchant.
/connected-accounts/{account_id}Updates connected account fields and can trigger account.update webhooks.
PATCH /connected-accounts request attributes
| Field | Type | Required | Description |
|---|---|---|---|
business_company_name | string | Optional | Updates the connected merchant company/trading name. |
mobile | string | Optional | Updates the connected merchant mobile number where allowed. |
neroconnect_email_sms_handle | enum | Optional | neropay or platform. |
neroconnect_status | enum | Optional | Dashboard/API operational status such as active, paused or review where enabled. |
metadata | object | Optional | Platform reference data or internal notes. |
NeroConnect connected accounts
Platforms can create merchants, view balances, manage default platform fees and operate by sending the connected account header.
| Concept | Type | Description |
|---|---|---|
| Connected account ID | string | Format is unique_account_id + underscore + merchant_id. |
| NeroPay-Account header | string | Scopes API calls to a connected merchant. |
| Notification handling | enum | neropay means NeroPay sends email/SMS; platform means platform handles merchant-facing notifications from webhooks. |
| KYC, bank & compliance | workflow | Must be completed after create account. Use the Identity API to create verification links, ensure a business bank account is added, and use Compliance Proof API plus webhooks for proof/document requests. |
Fee payer and pricing context
| Mode | NeroPay processing fee payer | Platform safety limit | Notes |
|---|---|---|---|
connected_account | The connected merchant pays NeroPay processing fees. | Not shown. platform_safety_limit returns null. | This is the default mode. Platform balance is not debited for NeroPay processing fees. |
platform | The platform balance pays NeroPay processing fees. | Shown in the API response and dashboard. | The connected merchant sees NeroPay processing fee as zero. If the platform balance or outstanding debt reaches the safety threshold, restricted platform actions may be blocked until the balance is restored. |
connect_application_fee. The fee payer setting controls who pays NeroPay processing fees. connect_application_fee is your platform's own application fee and can still be supplied per payment or configured as a dashboard default.POST /connected-accounts is idempotent when an Idempotency-Key is supplied. Reusing the same key with the same payload returns the original result. Reusing the same key with a different payload returns 409 idempotency_conflict. A platform cannot create another connected account with an email or username that already exists; duplicate requests return 409 connected_account_duplicate.NeroConnect settings, reports and account operations
API-integrated platforms use their existing API v2 credentials. These endpoints expose platform defaults, connected account records and aggregate reporting without granting access to unrelated merchants or NeroPay-controlled pricing.
/neroconnect/settingsReturns notification handling, merchant-facing pricing defaults, reward programme configuration, payout-limit defaults and read-only NeroPay cost context.
/neroconnect/settingsUpdates allow-listed platform defaults. Partial updates are supported.
/neroconnect/accountsLists only connected accounts assigned to the authenticated NeroConnect platform.
/neroconnect/accounts/{account_id}Returns one assigned connected account and its selected, NeroPay hard-cap and effective payout limits.
/neroconnect/reports/overviewReturns account counts and transaction totals for the platform’s own connected merchants.
PATCH /neroconnect/settings attributes
| Field | Type | Required | Description |
|---|---|---|---|
notification_handle | enum | Optional | neropay or platform. |
pricing_defaults.{channel}.fixed | decimal | Optional | Fixed merchant-facing default. Channels: api, card, manual_keyed, application_fee, sms, card_origin, extra_payment_method, instant_payout, transaction_refund. |
pricing_defaults.{channel}.percent | decimal | Optional | Percentage default, 0–100. Available for API, card, manual keyed, application fee, card origin, extra payment method and instant payout channels. |
rewards.enabled | boolean | Optional | Shows or hides the platform reward programme for connected accounts. |
rewards.name | string | Optional | Public programme name, 1–120 characters. |
payout_limit_defaults.* | decimal/integer | Optional | Supported keys: standard_min, standard_max, instant_min, instant_max, weekly_standard_max, weekly_instant_max, daily_transfer_count, nerodisburse_daily_max. Send null to clear one platform default. |
Legacy connect_application_fee_defaults.fixed and .percent remain supported aliases for pricing_defaults.application_fee.
Partner commissions & cash-order billing
Charge a service fee per sale, track its allocation, and bill completed cash orders without a monthly subscription. Commerce endpoints use /v2/neroconnect/commerce.
connect_application_fee on hosted payments or terminal payments. For a GBP 10.00 payment and GBP 0.50 commission, send amount: 10.00 and connect_application_fee: 0.50. Processing costs and any parent-platform share follow your existing agreement. Do not create another transfer or report that card order as cash usage.Choose the right operation
| Need | Use |
|---|---|
| Commission on a card sale | Existing payment creation with connect_application_fee; automatic existing settlement. |
| Track commission | GET /commissions or GET /commissions/{transaction_id}. |
| Cash-order service fee | Set signup pricing once, then POST /usage-events after merchant registration. |
| Move an agreed amount between parent and partner | Existing /v2/neroconnect/management/partners/{partnerId}/funds. This is separate from charging a connected shop for an order. |
Authentication and signed writes
Use live server-side credentials over HTTPS. Select one connected shop with NeroPay-Account. Account, destination, fee, provider identifiers and credential overrides in JSON are rejected. The platform may access only its own linked shops. A shop can read its own records, stop future cash fees, and request collection of fees already due. Use the platform account (omit NeroPay-Account) to configure signup pricing.
Every write requires JSON, an 8–100 character Idempotency-Key, X-NeroPay-Timestamp within five minutes and X-NeroPay-Signature. Commerce uses the following newline-separated HMAC message; it differs from legacy payment signing:
timestamp + "\n" + METHOD + "\n" + exact_path + "\n"
+ idempotency_key + "\n" + exact_NeroPay_Account_header + "\n" + raw_json_body
Sign with HMAC-SHA256 using the authenticated secret, as lowercase hexadecimal. Include the full path, e.g. /v2/neroconnect/commerce/usage-events. Use an empty account-header line when configuring pricing on the platform account. Write query parameters are rejected. Send exactly the body that was signed.
Retry the same operation with the same key and body, and a fresh timestamp/signature. Saved responses return Idempotency-Replayed: true. Reusing a key for a different path, shop or body returns 409. An order ID is also unique across pricing versions and retry keys. Keep the same completed timestamp on retries.
1. Set the cash-order signup price
POST /pricing uses the platform credentials with no connected-account header. It sets prices displayed to new merchants on the existing branded registration page. It does not send a contract or move money. All fields below are required:
| Field | Meaning |
|---|---|
currency | GBP. |
fixed_minor | Integer pence per completed cash order, 0–100000. |
percent_bps | Integer basis points, 0–5000; 500 means 5%. |
max_order_fee_minor | Per-order cap, 1–100000 pence; must cover the fixed fee. |
daily_cap_minor | Maximum new fees recorded per shop per application-calendar day, 1–1000000 pence. Applies across agreement versions; cancellation does not replenish the cap. |
collection_interval | daily or weekly. A recorded order becomes due after one or seven days. |
terms_reference | Your immutable terms/version reference, 1–100 ASCII letters, digits, dots, colons, hyphens or underscores. |
Fee = fixed fee + percentage rounded to the nearest penny, capped by the agreed per-order maximum. The resulting fee must be positive and less than the order amount. At least one of fixed fee or percentage must be non-zero.
2. Registration activates pricing automatically
The merchant sees the fixed fee, percentage, per-order maximum, daily limit and collection schedule on the existing branded signup form. Submitting that registration records the displayed price and balance-collection authorisation automatically. There is no separate contract email, acceptance page or API acceptance step.
GET /pricing with the platform credentials and no account header returns the current signup default. With a connected merchant account header it returns that merchant's active pricing. Changing signup defaults affects future registrations only. A changed price invalidates an already-open signup form; the merchant must reload to see the current price.
The existing parent/EPOS partner acceptance recorded at /neroconnect/{platform}/partner/register is reused for parent allocation. It is separate from the shop's own registration. Cash fees are collected from the connected shop's eligible balance. Existing accounts without recorded cash pricing are not silently activated; usage returns 403. Existing compatibility agreement endpoints remain available for integrations already using them, but are not part of this signup flow.
nc_commerce_agreements is internal versioned pricing/registration evidence. It retains the price and parent allocation snapshot that applied to each order; it does not initiate document sending. Previously registered shops retain their accepted price. Revoking a pricing record stops new orders, while accrued fees remain due.
3. Record completed cash usage
POST /usage-events is available to the linked platform. Required fields: unique order_id, integer amount_minor (1–10000000 pence), currency: GBP, payment_method: cash, and completed_at as UTC YYYY-MM-DDTHH:MM:SSZ. The active pricing recorded at signup is selected automatically. agreement_id is optional for existing integrations. The order must be completed after the pricing activation, within the past 30 days, and no more than five minutes ahead.
The response contains the server-calculated fee, state: accrued, and due_at. This is a service-fee receivable, not a customer card payment or proof that cash was physically collected. Send only completed orders your merchant has authorised you to report. GET /usage-events lists them.
POST /usage-events/{id}/cancel with {} cancels an order fee before collection has been reserved. Once assigned to a collection it returns 409; reconcile that collection before making a fee adjustment. Card refunds continue to use the existing transaction refund endpoint.
4. Collection and allocation
The existing NeroConnect web cron groups due fees under their registered pricing version. Each collection contains at most 200 orders and GBP 10,000 in fees; at least GBP 1.00 is required. POST /collections with {} requests preparation of a due collection and returns 202. It cannot override the amount, recipient or due date. If none qualifies, the response has state: not_due.
Automatic collection currently requires eligible UK GBP connected payment accounts, verified active merchants, legally effective merchant authorisation, and sufficient unrestricted local and provider balance. It is a payment-balance debit, not a bank-account Direct Debit. Cash-only shops without a funded eligible payment balance remain pending; this API does not charge their customer or invent funds.
Collection costs follow the platform's existing transfer tariff and are deducted from its fee income. Parent allocation is applied before the partner net credit. GET /collections and GET /collections/{id} return the latest state:
| State | Meaning |
|---|---|
pending | Due fees grouped; waiting for the scheduler or eligible funds. |
reserved | Local balance reserved; provider collection awaits confirmation. |
collected | Provider confirmed collection; allocation is still pending. |
settled | Required transfers confirmed and partner income recorded. This does not mean a bank payout has arrived. |
review | An earlier outcome needs reconciliation; no fresh debit is created. |
The optional pending_reason explains waits such as insufficient_available_balance, account_not_eligible, balance_or_account_restriction, allocation_pending or reconciliation_required. A lost response retains its original provider operation. An unresolved operation beyond its safe retry window stops for reconciliation. Never send replacement orders or funding requests to bypass a pending collection. Reading a collection does not retry money movement.
Card commission reporting and events
Commission IDs are the existing numeric transaction IDs. application_fee_minor is the saved requested commission; recorded_fee_minor requires the fee ledger; transferred_net_minor is returned only when the exact net allocation is known. A null amount means unconfirmed or unavailable, not zero.
allocation_state is pending, recorded, transferred, adjustment_pending, reversed, not_earned or review. Refunding the customer does not itself prove a commission transfer was reversed. Existing refund and dispute handling remains authoritative.
Subscribe in your existing webhook settings to commerce.commission.updated and commerce.collection.settled. Events use the existing webhook secret and timestamp.body HMAC verification. Delivery is retried through the existing notification outbox; deduplicate by event ID. Public HTTPS destinations are validated and DNS-pinned on every attempt, with redirects and private networks blocked.
Commission events reflect a bounded cron sweep of payments from the past 30 days. For older payments or immediate reconciliation, retrieve the commission directly. Collection events go only to the original merchant and platform; commission events go to the original platform.
Dashboard visibility
In Transactions, confirmed cash commission income appears in the receiving platform's own ledger. Open transaction details to see the shop, fee total, your collected income, collection state and included order references. A reserved merchant debit remains clearly marked with its collection state. Pending usage without a ledger movement is available through the usage/collection APIs rather than appearing as received income.
In NeroConnect API Logs, choose API requests to inspect commerce request references, HTTP results, replay status and returned operation identifiers. Registered commerce webhook attempts remain in Webhook deliveries. Requests never log credentials or signatures. Only scoped account records and authorised staff financial details are visible.
Pagination, errors and limits
Paginated list endpoints (excluding GET /pricing) accept limit (1–50, default 25) and after from the prior next_cursor. Cursors are opaque except numeric commission IDs. Results are ordered by ID, not by date. Read requests have no body. All other query/body fields are rejected.
Limits: 64 KB request body, 2048-character request URI, 60 writes per minute per principal and target, 120 reads per minute, plus the existing shared IP throttle. Handle 429 using Retry-After. Common errors: 401 invalid signature/credentials; 403 account, consent or policy restriction; 404 scoped record not found; 409 conflicting order/key or reserved collection; 422 invalid fields/cap/date; 503 schema/provider service unavailable.
These commerce endpoints are live-only. Test keys cannot enter them. Validate your integration and use a small agreed live amount before enabling automatic cash-order billing. Existing payment sandbox endpoints remain separate.
Card sale: GBP 10, commission GBP 0.50
POST /v2/terminal/payments
Authorization: Bearer PLATFORM_SECRET
NeroPay-Account: NPexample002_2
Content-Type: application/json
{
"amount": 10.00,
"currency": "GBP",
"reader_id": "YOUR_MERCHANT_READER_ID",
"reference": "CARD-1001",
"connect_application_fee": 0.50
}
Use the existing Terminal API signing rules for this existing endpoint. For hosted checkout use the same fee parameter with the required hosted payment fields.
Signup pricing: 50p per cash order
POST /v2/neroconnect/commerce/pricing
Authorization: Bearer PLATFORM_SECRET
{
"currency": "GBP",
"fixed_minor": 50,
"percent_bps": 0,
"max_order_fee_minor": 50,
"daily_cap_minor": 5000,
"collection_interval": "weekly",
"terms_reference": "EPOS-CASH-2026-01"
}
Read the registered merchant price
GET /v2/neroconnect/commerce/pricing
Authorization: Bearer PLATFORM_SECRET
NeroPay-Account: NPexample002_2
The merchant registration has already activated this pricing. No acceptance request is needed.
Completed cash order
POST /v2/neroconnect/commerce/usage-events
NeroPay-Account: NPexample002_2
{
"order_id": "CASH-1001",
"amount_minor": 1000,
"currency": "GBP",
"payment_method": "cash",
"completed_at": "2026-10-16T12:30:00Z"
}
Use the actual completion time. One GBP 10.00 cash order records a 50p service fee under this registered price; it does not trigger a GBP 10.00 card charge.
Node.js: sign a commerce write
import { createHmac, randomUUID } from 'node:crypto';
const secret = process.env.NEROPAY_SECRET;
const path = '/v2/neroconnect/commerce/usage-events';
const account = 'NPexample002_2';
const key = randomUUID(); // Save with this order; reuse on retries.
const body = JSON.stringify(order);
const timestamp = String(Math.floor(Date.now() / 1000));
const message = [timestamp, 'POST', path, key, account, body].join('\n');
const signature = createHmac('sha256', secret).update(message).digest('hex');
const response = await fetch('https://eu.neropay.app' + path, {
method: 'POST',
headers: {
Authorization: `Bearer ${secret}`,
'Content-Type': 'application/json',
'NeroPay-Account': account,
'Idempotency-Key': key,
'X-NeroPay-Timestamp': timestamp,
'X-NeroPay-Signature': signature
},
body
});
const result = await response.json();
if (!response.ok) throw new Error(result.error?.message || 'Request failed');
Collection response
{
"success": true,
"data": {
"id": "COLLECTION_ID",
"currency": "GBP",
"fee_minor": 100,
"order_count": 2,
"state": "pending",
"pending_reason": "awaiting_schedule",
"collected": false,
"allocated": false,
"created_at": "2026-10-23T12:30:00+00:00",
"settled_at": null,
"partner_net_minor": 99
}
}
The example assumes a 1% collection tariff and no parent share. Your actual net follows your account tariff and accepted partner terms. partner_net_minor is shown only to the platform; while pending, it is the frozen expected allocation.
Management authentication
Shared authentication, signing and retry rules for the NeroConnect Partner API and Sales Agent API. Both use the /v2/neroconnect/management prefix.
Signed writes and retry rules
Every POST, PUT and PATCH requires Bearer authentication, Content-Type: application/json, an Idempotency-Key of 8–100 letters, digits or ._:-, and timestamp/signature headers. Write bodies must be JSON objects, at most 64 KB, with no query parameters or uploads. Unknown fields are rejected. GET uses Bearer authentication and allow-listed query filters.
For these management endpoints only, sign the following UTF-8 bytes with HMAC-SHA256 using your secret key, returning lowercase hexadecimal. Use a Unix timestamp within five minutes. Do not reformat the JSON after signing. The exact path includes /v2; do not include a host, query or trailing slash. Existing API endpoints retain their existing signature format.
timestamp + "\n" + UPPERCASE_METHOD + "\n" + PATH
+ "\n" + IDEMPOTENCY_KEY + "\n" + RAW_JSON_BODYA repeated HTTP retry key for the same method/path/platform returns 409 duplicate_request for 24 hours, not a cached success response. Inspect the current resource before retrying with a new HTTP key. For a move reuse the original preview_id; for funding reuse the original request_id. These durable operation IDs prevent a second move or second debit even when the HTTP key changes. Invalid submissions also consume their HTTP retry key.
Error handling
Responses use {"success": true, "data": ...} with pagination meta where applicable, or {"success": false, "error": {"code": ..., "message": ...}}. Expect 401 for credentials/signatures, 403 for restricted management, 404 for unavailable/foreign resources, 409 for duplicate keys or changed controls, 413 for body size, 422 for invalid/stale fields, 429 for throttling, and 503 for unavailable setup. Treat 5xx and timeouts as an unknown result; inspect the same durable operation ID before doing anything else. Public failures do not expose SQL, credentials, stack traces or upstream exception messages.
NeroConnect Sales Agent API
Manage your platform’s sales-agent profiles, merchant assignments and commission reports. Agent panel logins do not grant management API credentials.
Sales agents
/sales-agentsOwn platform profiles. Optional limit (1–100) and page (1–10000).
/sales-agentsCreate a profile for an existing active team membership belonging to this platform. Fields: integer staff_id, name (max 150), decimal-string commission_percent (0–100, at most two decimal places), boolean active. Email matching never grants authority.
/sales-agents/{agentId}Send name, commission_percent, active and the last read integer revision. Do not send staff_id on updates. Existing historical commission periods are preserved.
/accounts/{merchantId}/sales-agentAssign an own connected merchant: agent_id (integer or null to unassign), override_percent (decimal string or null for the profile default), and expected_assignment (current assignment ID, or 0 if unassigned). All three fields are required.
/sales-agents/{agentId}/accountsOnly accounts currently assigned to this own-platform agent, with assignment IDs and rates. Optional limit, page.
/sales-agents/{agentId}/commission-reportOptional inclusive from/to in YYYY-MM-DD, default last seven days. Calculates a percentage of the platform's recorded net income, not the merchant's gross sales; child income uses its retained share after parent allocation. Amounts are integer minor units, grouped by currency. Unreconciled income remains pending. This report does not automatically pay agents.
NeroConnect Partner API
Manage platform partners, connected account moves, partner pricing and funded transfers. Use the main platform’s server credentials for parent operations.
Connected account moves
/account-movesEligible family platforms and source accounts. Optional integer source_id (defaults to the authenticated parent), q (max 100), page, channel (all, terminal, ecommerce, mixed).
/account-moves/previewRequired integer source_id, different integer destination_id and 1–20 distinct integer account_ids. Returns preview_id, expires_in: 300 and an ownership/pricing preview. No mutation at preview time.
/account-moves/commitRequired UUID preview_id, api_key_acknowledged: true and ownership_acknowledged: true. Signed API confirmation replaces browser password entry. The preview must belong to this platform and API actor; browser/staff previews cannot be consumed by the API. Changed ownership, pricing, agreements, balances or expired previews require a new preview.
Partner controls
/partnersParent-owned partners only. Optional limit, page, state (pending, active, suspended).
/partners/{partnerId}Safe agreement terms/policies and opaque pricing_version/management_version. Read immediately before saving. Does not return secret keys, identity documents or provider account identifiers.
/partners/{partnerId}/pricingDirect Save, not Send proposal. Required pricing_version and model (rate or revenue_share); revenue_share requires decimal-string share_percent. Optional rates and products as described below. An accepted initial agreement is required; pricing never activates a partner or creates consent. New rates are effective-dated; historical income is unchanged.
/partners/{partnerId}/policiesRequired current management_version plus a complete policies object. This replaces the permitted controls; it cannot bypass NeroPay's own restrictions.
/partners/{partnerId}/suspendRequired current management_version. Suspends an own partner without changing balances, historical commissions or KYC.
/partner-settingsParent signup defaults, revision and existing signup status.
/partner-settingsRequired expected_revision, pricing-model input, and complete policies. Updates future defaults only. Existing signup enablement and legal URLs are retained; existing agreements are not rewritten.
/partner-agreementA second-tier platform reads its own safe agreement. No sending, accepting, activating or replacing a legal agreement is exposed by this management API.
Pricing and policy inputs
Send monetary/percentage inputs as decimal strings, not floats or internal minor-unit fields. Fixed partner charges and product prices use GBP. Responses use integer minor units and basis points (100 bps = 1%). Currency totals are never combined without conversion.
rates is keyed by api, card, keyed, origin, extra_method, sms, cellular, instant_payout, refund, monthly_account or monthly_terminal; values accept fixed and percent. Percentages are 0–100. Monthly account/terminal charges cannot carry a percentage. Omitted categories become zero in the saved replacement pricing. products maps server-recognised catalogue slugs to GBP decimal strings; unknown slugs are rejected.
A complete policies object requires booleans accounts, pricing, branding, invoices, dashboard, store, reports, api, funds, view_as, settings, hide_share_entries, integer max_accounts (0–100000) and GBP decimal-string max_transfer. Responses return this limit as max_transfer_minor; convert it when constructing an input.
Funded partner movements
/partners/{partnerId}/fundsParent-only. Required direction (send or pull), positive GBP decimal-string amount (max seven whole digits, two decimals), and stable UUID request_id. Requires an active, accepted agreement, funds policy, verified active parties and the agreed transfer cap. No arbitrary destination, provider account, currency, fee or negative amount is accepted.
/funding/{fundsId}Read the 64-character opaque ID returned by the funding response. Only this parent's discretionary funding rows are visible; internal recovery and store allocation rows are excluded.
Funding returns HTTP 200 only when state=settled and confirmed=true; otherwise HTTP 202 means reserved/awaiting confirmation or review, not paid. Poll the funding ID. Do not submit a new UUID after a timeout: retry with the same request_id and unchanged details (a newly signed HTTP retry key is allowed). Reservations survive uncertain responses and are reconciled by the existing worker. A changed request amount/direction cannot reuse an existing UUID.
NeroPay Store API checkout links
Create a secure NeroPay Store checkout link for terminal, EPOS, scanner, scale and accessory orders. The API creates a pending hardware order and returns a hosted checkout URL; card details are collected only on NeroPay-hosted checkout.
/neropay-store/productsLists available NeroPay Store hardware product slugs and prices.
/neropay-store/checkout-linksCreates a hosted checkout link for the authenticated merchant or a connected account.
/neropay-store/orders/{id}Reads a NeroPay Store order created for the authenticated account context.
NeroPay-Account or account_id only for connected accounts assigned to your platform.GET /neropay-store/products response attributes
| Field | Type | Description |
|---|---|---|
slug | string | Stable catalogue slug used for ordering. |
product_code | string | Ordering code for API integrations. This is currently the same value as slug. |
code | string | Short alias for product_code. |
name | string | Product name displayed on the hosted checkout. |
price | decimal | Server-side NeroPay Store catalogue price. Resellers cannot override this in API requests. |
category | string | Hardware, terminal, EPOS, scale, printer or accessory grouping. |
GET /neropay-store/products for the live catalogue. Send the returned product_code in items[].product_code. Current public codes are shown below.| product_code | Name | Category | Base price | Optional checkout options |
|---|---|---|---|---|
pro-plus | Card Terminal PRO+ | terminal | £295.00 | None |
ccd-tablet | Card Terminal CCD | terminal | £135.00 | options.device: no_device, fire8, ipadair11 |
epos | NeroPay EPOS Kit | epos | £799.95 | None |
nerokiosk | NeroPay Self-Service Kiosk | kiosk | £800.00 | options.size: 21_5, 23_6, 32; optional floor_standing, ads=ad_free |
nerokds | NeroKDS | kds | £450.00 | options.size: 21_5, 24 |
pro-plus-charging-dock | PRO+ Charging Dock | accessory | £60.00 | None |
ccd-charging-dock | CCD Charging Dock | accessory | £60.00 | None |
charger | Additional Charger | accessory | £20.00 | None |
caller-id-unit | NeroPay Caller ID Unit | accessory | £110.00 | None |
neroscale1 | NeroPay Manual Scale | accessory | £75.00 | None |
neroscalepro | NeroPay Barcode Scale Pro | accessory | £375.00 | None |
neroscan1 | NeroPay Wireless 1D/2D Barcode Scanner | accessory | £65.00 | None |
neroscanpro | NeroPay Desktop Barcode Scanner Pro | accessory | £95.00 | None |
neromini | NeroPay Mini Bluetooth Barcode Scanner | accessory | £45.00 | None |
receipt-printer-80mm | 80mm Thermal Receipt Printer | accessory | £155.00 | options.connection: usb, lan, wifi, bluetooth |
cash-drawer-rj11 | Cash Drawer Base with RJ11 Connector | accessory | £55.00 | None |
thermal-paper-rolls | Thermal Paper Rolls | accessory | £20.00 | options.pack: 5, 10, 20; options.roll_size: 58x58, 80x80 |
POST /neropay-store/checkout-links attributes
| Field | Type | Required | Description |
|---|---|---|---|
account_id | string | Platform only | Connected merchant account. You may also send NeroPay-Account. |
items[].product_code | string | Required* | Product code returned by GET /neropay-store/products. You may send items[].slug or items[].code instead. |
items[].slug | string | Alias | Catalogue slug returned by the products endpoint. |
items[].quantity | integer | Optional | Quantity, 1 to 99. Defaults to 1. |
billing | object | Required | Billing contact and billing address. Required keys: name, email, phone, line1, city, postcode, country. Optional keys: line2, county. |
shipping | object | Required | Delivery contact and shipping address. Required keys: name, phone, line1, city, postcode, country. Optional keys: email, line2, county. |
reference | string | Optional | Your reseller/order reference stored in metadata. |
billing and shipping are supplied. NeroPay Store API v2 does not fall back to the merchant profile address for hardware checkout links.GET /neropay-store/orders/{id} only returns an order when the order belongs to the authenticated merchant or the connected merchant supplied with NeroPay-Account/account_id. It does not list all orders or expose another merchant’s orders.Payments
Recommended for online checkout, online ordering and website payments. Create a NeroPay-hosted checkout URL and redirect the customer there. Card details are collected by NeroPay-hosted checkout and are never submitted through your API payload.
/hosted-paymentsCreates a hosted checkout URL for an order or invoice.
/payment-linksCreates a simple LinkPay checkout link when you only need a payment URL.
/terminal/paymentsSends an in-person card-present payment action to a terminal reader.
POST payment request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| identifier | string | Required | Your unique order, invoice or checkout reference. |
| amount | decimal | Required | Payment amount in major units, e.g. 15.99. |
| currency | enum | Required | Currency such as GBP or EUR. |
| details | text | Required | Customer-facing or internal checkout description. |
| ipn_url | url | Required | Receives hosted-payment outcome updates, including a declined attempt and a later success. The initial API response is not proof of payment. |
| success_url | url | Required | Where the customer is returned after a successful payment. |
| cancel_url | url | Required | Where the customer is returned after cancellation. |
| customer_name | string | Required | Customer name shown on the checkout record. |
| customer_email | Required | Customer email shown on the checkout record. | |
| customer_phone | string | Optional | Customer phone number, if collected. |
| account_id | string | Platform only | Connected merchant account for NeroConnect routing. You may also send the NeroPay-Account header. |
| connect_application_fee | decimal | Optional | Platform fee charged for a connected account payment. |
| metadata | object | Optional | Additional key/value data returned in responses and webhooks where supported. |
NeroPay-Account or account_id with that connected merchant account on every request./v2/hosted-payments for online checkout or /v2/payment-links for a simple payment link.Hosted-payment result lifecycle
Request rejected immediately
The API returns HTTP 4xx/5xx with success: false and an error object. Do not create or confirm the order as paid.
A payment attempt is declined
NeroPay may post status=failed with an error object to the payment's ipn_url. This describes that attempt: the customer may retry the same checkout and subsequently pay successfully.
Failed IPN attributes
| Field | Type | Description |
|---|---|---|
| status | enum | failed for an unsuccessful payment attempt. A later success notification may follow for the same checkout. |
| identifier | string | Your original order or invoice identifier. |
| signature | string | Uppercase HMAC-SHA256 of amount + identifier using the merchant secret API key. |
| error.code | string | Stable machine-readable category, such as card_declined or payment_failed. |
| error.message | string | Provider-neutral support message safe to display or log. |
| error.decline_code | string | Optional more specific decline reason, such as insufficient_funds. |
| data | object | Payment reference, status, amount, customer, currency and a repeated error object for existing IPN consumers. |
application/x-www-form-urlencoded for compatibility with existing integrations. The example is shown as the decoded object. Use identifier or data.payment_trx to find the order, not to discard every later update. Process each outcome safely and fulfil the order only once after confirmed success.transaction.succeeded and transaction.failed. This is separate from the per-payment ipn_url.For example, an attempt may be declined for insufficient_funds, then succeed when the customer retries using another payment method. Reopen the original NeroPay checkout URL and keep the same order identifier. Where the existing payment remains retryable, NeroPay reuses its PaymentIntent internally. Do not create another checkout or change the identifier simply because an attempt failed, a request timed out or a callback has not arrived.
If you repeat a creation request, keep the same merchant account, identifier, amount, currency and callback URL, and reuse the original Idempotency-Key for that same request. Retrieve the payment's current status if the response is uncertain. A cancelled, expired or conflicting payment needs verification before a replacement is created; never assume that money has not moved.
Payment listener and order reconciliation
| Incoming update | Order handling |
|---|---|
| Initial API request accepted / pending | Save the reference and checkout URL. Do not mark the order as paid or print a paid order. |
| Declined attempt / failed | Record the attempt and show an appropriate retry message. Keep the listener active for a later successful payment on the same order. |
| Confirmed success after a failure | Update the same order to paid, and queue fulfilment or printing once. Do not discard success because the order already has a failed record. |
| Duplicate delivery or an older failure after success | Acknowledge the delivery without repeating fulfilment. Never change an already-paid order back to failed because of a payment-attempt event. Refunds are separate events. |
X-NeroPay-Event-Id to identify a delivery stream and also protect fulfilment with a unique order-level guard. For legacy form IPNs, verify the documented signature and retrieve the current payment status through the authenticated API before fulfilment, as the legacy signature covers the amount and identifier rather than the complete outcome payload. Do not treat a browser redirect as payment confirmation.status=success or status=failed; registered JSON webhooks use transaction.succeeded or transaction.failed. These are separate delivery channels. Use one authoritative fulfilment path, or deduplicate across both channels using the same merchant/order reference.Payment Links / LinkPay
Create and inspect LinkPay checkout links. LinkPay records are separated from generic API payments.
/payment-linksLists LinkPay records.
/payment-linksCreates a payment link.
/payment-links/{id}Retrieves one payment link.
POST /payment-links request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| currency | enum | Required | Payment currency. |
| amount | decimal | Required | Amount in major units. |
| details | text | Required | Description shown to the buyer. |
| customer_name | string | Optional | Pre-filled customer name. |
| customer_email | string | Optional | Pre-filled customer email. |
| success_url | string | Optional | Redirect URL after success. |
| cancel_url | string | Optional | Redirect URL after cancellation. |
| ipn_url | string | Optional | Webhook/IPN URL for this payment link. |
Contracts API
Create merchant contracts, store contract rules, require full or deposit payments and send customers to a secure NeroPay contract review page.
/contractsLists contracts for the authenticated merchant or connected merchant when NeroPay-Account is supplied.
/contractsCreates a contract with customer details, formatted content, signature rules and optional full or upfront payment.
/contracts/{id}Retrieves one contract by internal ID or public contract reference where supported.
/contracts/{id}Updates contract fields, customer details, signature rules, status or payment settings.
/contracts/{id}Deletes an unpaid draft/sent contract where the merchant account is allowed to do so.
/contracts/{id}/payment-linkCreates a secure NeroPay checkout link for the required contract payment.
/contracts/{id}/formReturns the contract intake/customer form definition.
/contracts/{id}/form-submissionsLists customer form submissions for the scoped contract.
/contracts/{id}/form-submissionsStores a validated form submission against the scoped contract.
GET /contracts query attributes
| Field | Type | Required | Description |
|---|---|---|---|
| status | enum | Optional | Filter by draft, sent, signed, completed, cancelled or expired. |
| payment_status | enum | Optional | Filter by not_required, unpaid, partially_paid, paid or failed. |
| q | string | Optional | Search contract reference, title, customer name or customer email. |
| page | integer | Optional | Pagination page number. |
| per_page | integer | Optional | Items per page. Keep this sensible for dashboard performance. |
GET /contracts response attributes
| Field | Type | Description |
|---|---|---|
| id | integer | Internal contract ID. |
| contract_ref | string | Merchant-facing reference such as CTR-260612-ABC123. |
| public_url | url | Secure customer review/sign/payment page. |
| title, summary, content_html | string/html | Contract title, customer-facing summary and formatted contract content. |
| customer_* fields | string | Customer name, email, phone and address snapshot. |
| contract_amount | decimal | Total contract value. |
| payment_amount | decimal | Amount due now if online payment is required. |
| status | enum | Current lifecycle status. |
| payment_status | enum | Current payment status. |
| signature_required | boolean | Whether the customer must provide an electronic signature. |
| signed_at | datetime | Set when the customer signs/accepts the contract. |
| cc_emails | array | Optional CC recipients used for contract communications. |
| fee_items | array | Optional fee breakdown shown in the contract summary. |
| intake_form | object | Customer form definition, including enabled status and field list. |
| intake_form_submissions_count | integer | Number of saved form submissions for this contract. |
POST /contracts request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| title | string | Required | Contract title shown to the customer. |
| customer_name | string | Required | Customer or business name. |
| customer_email | Required | Customer email address used for send/resend. | |
| customer_phone | string | Optional | Customer phone number. |
| customer_address | string | Optional | Billing/service address snapshot. |
| currency | enum | Required | Currency code such as GBP or EUR. You may also send currency_id. |
| contract_amount | decimal | Optional | Total contract value. Required if payment_mode=full. |
| show_contract_amount | boolean | Optional | Controls whether the total amount is shown in the public summary. If payment is required, the amount due now is always shown. |
| payment_required | boolean | Optional | When true, the public contract page can show a Pay button. |
| payment_mode | enum | Optional | none, full, deposit or custom. full collects the contract amount; deposit/custom collects deposit_amount. |
| deposit_amount | decimal | Optional | Upfront amount due now when using deposit or custom. |
| signature_required | boolean | Optional | Require customer electronic signature before the contract is treated as signed. |
| customer_details_editable | boolean | Optional | Allow the customer to correct their name, email, phone or address before signing. |
| content_html | html | Required | Main contract body. Script tags and inline event handlers are removed server-side. |
| summary | string | Optional | Short customer-facing summary for the contract list and email. |
| cc_emails[] | email[] | Optional | Up to five CC recipients. Customer email is not duplicated. |
| fee_items[] | array | Optional | Up to eight fee rows with label, fee_type, amount and notes. |
| intake_form.enabled | boolean | Optional | Enable customer form before signing. |
| intake_form.fields[] | array | Optional | Up to 20 questions. Types: text, date, textarea, dropdown, radio, checkbox. |
| intake_form.fields[].condition | object | Optional | Optional show/hide rule using field, operator, value and action. |
| expires_at | datetime | Optional | Optional expiry date/time for the public review link. |
| send_email | boolean | Optional | Send the contract email immediately after saving. Resend is rate-limited. |
| account_id | string | Platform only | Connected merchant account for NeroConnect routing. You may also send the NeroPay-Account header. |
PATCH /contracts/{id} request attributes
| Field | Type | Description |
|---|---|---|
| title, summary, content_html | string/html | Update contract content while the contract is not completed/cancelled. |
| customer_name, customer_email, customer_phone, customer_address | string | Update customer details snapshot. |
| contract_amount, payment_required, payment_mode, deposit_amount | decimal/boolean/enum | Update payment rules. Paid contracts cannot be changed in a way that breaks payment history. |
| signature_required, customer_details_editable, show_contract_amount | boolean | Update customer signing and display rules. |
| status | enum | draft, sent, signed, completed, cancelled or expired. |
Contract form endpoints
| Endpoint | Purpose | Security |
|---|---|---|
GET /contracts/{id}/form | Read the public/customer form definition for a scoped contract. | Account-scoped; other merchants’ contracts return contract_not_found. |
GET /contracts/{id}/form-submissions | Read saved customer form submissions. | Account-scoped and never searchable across all merchants. |
POST /contracts/{id}/form-submissions | Save answers against the contract form using an answers object keyed by field key. | Requires signed write security and validates required/conditional fields server-side. |
meta_json. API v2 strips scripts/unsafe HTML, limits questions/options/submissions and rejects raw card, PIN, password or bank-account fields.POST /contracts/{id}/payment-link request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| success_url | url | Optional | Where the customer is returned after payment. Defaults to the public contract page. |
| cancel_url | url | Optional | Where the customer is returned after cancelling checkout. |
| metadata | object | Optional | Extra reference data stored against the payment request. |
POST /contracts/{id}/payment-link creates a NeroPay hosted checkout using the merchant account. This is separate from generic LinkPay links and is tied back to the contract payment status.NeroGYM overview
NeroGYM API v2 exposes gym operations in the same menu-led style as NeroTrade: settings, clients, plans, memberships, sessions, classes, staff, programmes, check-ins and payment records.
NeroPay-Account or account_id for an allowed connected merchant only. Write calls require HMAC signing and an Idempotency-Key./nerogym/overviewReturns dashboard-safe totals and recent activity for the scoped gym account.
GET /nerogym/overview query attributes
| Field | Type | Required | Description |
|---|---|---|---|
account_id | string | Platform only | Connected merchant account. You may also send NeroPay-Account. |
date_from / date_to | date | Optional | Optional reporting window for revenue, attendance and session counts. |
GET /nerogym/overview response attributes
| Field | Type | Description |
|---|---|---|
account_id | string | Scoped merchant account. |
settings_enabled | boolean | Whether NeroGYM is enabled for the merchant. |
stats.clients | integer | Total active/known clients. |
stats.memberships | integer | Active membership count. |
stats.sessions | integer | Sessions in the selected period. |
stats.classes | integer | Classes in the selected period. |
stats.checkins | integer | Check-ins in the selected period. |
stats.revenue | decimal | Payment records total for the selected period. |
recent_activity[] | array | Recent sessions, check-ins or payments with safe public fields. |
Settings
Read and update safe NeroGYM portal, billing and booking settings for a merchant.
/nerogym/settingsReads NeroGYM settings.
/nerogym/settingsUpdates supported settings only.
GET /nerogym/settings query attributes
| Field | Type | Required | Description |
|---|---|---|---|
account_id | string | Platform only | Connected merchant account. You may also send NeroPay-Account. |
GET /nerogym/settings response attributes
| Field | Type | Description |
|---|---|---|
enabled | boolean | NeroGYM feature status. |
portal_url | url | Merchant public NeroGYM portal URL. |
booking_enabled | boolean | Allows clients to book available sessions/classes online. |
member_portal_enabled | boolean | Allows member portal access. |
parq_required | boolean | Whether PAR-Q/health form is required during onboarding. |
currency | string | Currency used for plans and payment records. |
timezone | string | Timezone used for calendar/session rendering. |
PATCH /nerogym/settings request attributes
| Field | Type | Required | Description |
|---|---|---|---|
account_id | string | Platform only | Connected merchant account. You may also send NeroPay-Account. |
enabled | boolean | Optional | Enable or disable NeroGYM. |
booking_enabled | boolean | Optional | Enable online booking. |
member_portal_enabled | boolean | Optional | Enable member portal access. |
parq_required | boolean | Optional | Require health/PAR-Q form before training. |
timezone | string | Optional | IANA timezone, for example Europe/London. |
Clients
Create and manage gym clients. Client IDs are always scoped to the authenticated merchant.
/nerogym/clientsLists clients.
/nerogym/clients/{id}Retrieves one client.
/nerogym/clientsCreates a client.
/nerogym/clients/{id}Updates a client.
/nerogym/clients/{id}Deletes or deactivates a client where allowed.
GET /nerogym/clients query attributes
| Field | Type | Required | Description |
|---|---|---|---|
account_id | string | Platform only | Connected merchant account. |
q | string | Optional | Search name, email or phone. |
status | enum | Optional | Filter by active, inactive, blocked or local configured status. |
page / per_page | integer | Optional | Pagination controls. |
GET /nerogym/clients response attributes
| Field | Type | Description |
|---|---|---|
id | integer | Client ID. |
name | string | Client full name. |
email | Client email address. | |
phone | string | Client phone number. |
status | enum | Current client status. |
notes | text | Internal notes where available. |
created_at, updated_at | datetime | Record timestamps. |
POST /nerogym/clients request attributes
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Required | Client full name. |
email | Optional | Unique email for this merchant where provided. | |
phone | string | Optional | Client phone number. |
status | enum | Optional | Defaults to active. |
notes | text | Optional | Internal client note. |
PATCH /nerogym/clients/{id} request attributes
| Field | Type | Description |
|---|---|---|
name, email, phone, status, notes | mixed | Only supplied fields are updated. Client must belong to the scoped merchant. |
DELETE /nerogym/clients/{id} response attributes
| Field | Type | Description |
|---|---|---|
deleted | boolean | True when the record was deleted/deactivated. |
Plans
Create and maintain membership packages, one-off session packs and public plan terms.
/nerogym/plansLists plans.
/nerogym/plans/{id}Retrieves one plan.
/nerogym/plansCreates a plan.
/nerogym/plans/{id}Updates a plan.
/nerogym/plans/{id}Deletes/deactivates a plan where no active dependencies block removal.
GET /nerogym/plans query attributes
| Field | Type | Required | Description |
|---|---|---|---|
q | string | Optional | Search plan name. |
status | enum | Optional | Filter active/inactive plans. |
page / per_page | integer | Optional | Pagination controls. |
GET /nerogym/plans response attributes
| Field | Type | Description |
|---|---|---|
id | integer | Plan ID. |
name | string | Plan name. |
price | decimal | Plan price. |
billing_cycle | enum | monthly, weekly, one_off or local cycle. |
session_limit | integer/null | Included session limit if configured. |
general_terms | html/text | Customer-facing plan terms. |
status | enum | Plan status. |
POST /nerogym/plans request attributes
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Required | Plan name. |
price | decimal | Required | Plan price, server validated as a non-negative amount. |
billing_cycle | enum | Required | monthly, weekly, one_off or supported cycle. |
session_limit | integer | Optional | Included session allowance. |
general_terms | text/html | Optional | Plan terms shown to customers before checkout/acceptance. |
status | enum | Optional | Defaults to active. |
PATCH /nerogym/plans/{id} request attributes
| Field | Type | Description |
|---|---|---|
name, price, billing_cycle, session_limit, general_terms, status | mixed | Only supplied fields are updated. Plan must belong to the scoped merchant. |
Memberships
Link clients to plans and manage membership lifecycle. Cross-merchant client_id or plan_id values are rejected.
/nerogym/membershipsLists memberships.
/nerogym/memberships/{id}Retrieves one membership.
/nerogym/membershipsCreates a membership.
/nerogym/memberships/{id}Updates a membership.
/nerogym/memberships/{id}Cancels/deletes a membership where allowed.
GET /nerogym/memberships query attributes
| Field | Type | Required | Description |
|---|---|---|---|
client_id | integer | Optional | Filter by client belonging to the scoped merchant. |
plan_id | integer | Optional | Filter by plan belonging to the scoped merchant. |
status | enum | Optional | active, paused, cancelled, expired or local status. |
page / per_page | integer | Optional | Pagination controls. |
GET /nerogym/memberships response attributes
| Field | Type | Description |
|---|---|---|
id | integer | Membership ID. |
client_id, client | integer/object | Linked client ID and safe client summary. |
plan_id, plan | integer/object | Linked plan ID and safe plan summary. |
status | enum | Membership status. |
starts_at, ends_at | date | Membership date range. |
next_payment_at | date/null | Next expected payment date when used. |
POST /nerogym/memberships request attributes
| Field | Type | Required | Description |
|---|---|---|---|
client_id | integer | Required | Client ID from the same scoped merchant. |
plan_id | integer | Required | Plan ID from the same scoped merchant. |
status | enum | Optional | Defaults to active. |
starts_at | date | Required | Membership start date. |
ends_at | date | Optional | Membership end date. |
next_payment_at | date | Optional | Next expected billing/payment date. |
PATCH /nerogym/memberships/{id} request attributes
| Field | Type | Description |
|---|---|---|
plan_id, status, starts_at, ends_at, next_payment_at | mixed | Only supplied fields are updated. Linked IDs must belong to the same merchant. |
Sessions & classes
Manage one-to-one sessions and group classes. Staff and client references are validated against the scoped merchant.
/nerogym/sessionsLists PT sessions.
/nerogym/sessionsCreates a PT session.
/nerogym/sessions/{id}Updates a PT session.
/nerogym/sessions/{id}Deletes/cancels a session where allowed.
/nerogym/classesLists group classes.
/nerogym/classesCreates a group class.
/nerogym/classes/{id}Updates a group class.
/nerogym/classes/{id}Deletes/cancels a class where allowed.
GET /nerogym/sessions or /classes query attributes
| Field | Type | Required | Description |
|---|---|---|---|
client_id | integer | Sessions optional | Filter sessions by client. ID must belong to the scoped merchant. |
staff_id | integer | Optional | Filter by trainer/staff member. |
date_from / date_to | date | Optional | Calendar window filter. |
status | enum | Optional | scheduled, completed, cancelled or local status. |
GET response attributes
| Field | Type | Description |
|---|---|---|
id | integer | Session/class ID. |
name | string | Class name or generated session title. |
client_id | integer/null | Client for PT sessions. |
staff_id | integer/null | Assigned trainer/staff member. |
starts_at | datetime | Start date/time. |
duration_minutes | integer | Duration in minutes. |
capacity | integer/null | Class capacity where applicable. |
status | enum | Current status. |
POST /nerogym/sessions request attributes
| Field | Type | Required | Description |
|---|---|---|---|
client_id | integer | Required | Client ID from the scoped merchant. |
staff_id | integer | Optional | Trainer/staff ID from the scoped merchant. |
starts_at | datetime | Required | Session start date/time. |
duration_minutes | integer | Optional | Defaults to merchant/session setting. |
status | enum | Optional | Defaults to scheduled. |
POST /nerogym/classes request attributes
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Required | Class name. |
staff_id | integer | Optional | Trainer/staff ID from the scoped merchant. |
starts_at | datetime | Required | Class start date/time. |
duration_minutes | integer | Optional | Class duration. |
capacity | integer | Optional | Max attendees. |
status | enum | Optional | Defaults to scheduled/active. |
PATCH /nerogym/sessions/{id} or /classes/{id} request attributes
| Field | Type | Description |
|---|---|---|
client_id, staff_id, name, starts_at, duration_minutes, capacity, status | mixed | Only supplied fields are updated. Linked IDs must belong to the same merchant. |
Staff & programmes
Manage trainers/staff records and client training programmes. The API accepts both programmes and programs as resource aliases.
/nerogym/staffLists gym staff.
/nerogym/staffCreates gym staff.
/nerogym/staff/{id}Updates gym staff.
/nerogym/staff/{id}Deletes/deactivates gym staff where allowed.
/nerogym/programmesLists training programmes.
/nerogym/programmesCreates a programme.
/nerogym/programmes/{id}Updates a programme.
/nerogym/programmes/{id}Deletes/deactivates a programme where allowed.
GET query attributes
| Field | Type | Required | Description |
|---|---|---|---|
q | string | Optional | Search staff/programme name and supported text fields. |
client_id | integer | Programmes optional | Filter programmes by client. |
status | enum | Optional | Filter active/inactive/status values. |
page / per_page | integer | Optional | Pagination controls. |
GET response attributes
| Field | Type | Description |
|---|---|---|
id | integer | Record ID. |
name | string | Staff/programme name. |
email, phone | string | Staff contact details where applicable. |
role | string | Staff role where applicable. |
client_id | integer/null | Programme client where applicable. |
starts_at, ends_at | date | Programme date range where applicable. |
status, is_active | enum/boolean | Current active/status value. |
POST /nerogym/staff request attributes
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Required | Staff full name. |
email | Optional | Staff email address. | |
phone | string | Optional | Staff phone number. |
role | string | Optional | Trainer, coach, manager or local role. |
is_active | boolean | Optional | Defaults to true. |
POST /nerogym/programmes request attributes
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Required | Programme name. |
client_id | integer | Optional | Client ID from the scoped merchant. |
description | text | Optional | Programme details. |
starts_at, ends_at | date | Optional | Programme start/end dates. |
status | enum | Optional | Programme status. |
PATCH request attributes
| Field | Type | Description |
|---|---|---|
name, email, phone, role, is_active, client_id, description, starts_at, ends_at, status | mixed | Only supplied fields are updated. Linked IDs must belong to the same merchant. |
Check-ins & payments
Record attendance and gym payment ledger events. Check-in/payment audit records are intentionally protected from API delete.
/nerogym/checkinsLists check-ins.
/nerogym/checkinsCreates a check-in.
/nerogym/checkins/{id}Updates a safe check-in field where allowed.
/nerogym/paymentsLists gym payment records.
/nerogym/paymentsCreates a manual gym payment record. Raw card details are not accepted.
/nerogym/payments/{id}Updates safe payment metadata/status only.
GET query attributes
| Field | Type | Required | Description |
|---|---|---|---|
client_id | integer | Optional | Filter by client from the scoped merchant. |
membership_id | integer | Optional | Filter by membership from the scoped merchant. |
date_from / date_to | date | Optional | Filter by checked-in or paid date. |
status | enum | Payments optional | Filter payment status. |
page / per_page | integer | Optional | Pagination controls. |
GET response attributes
| Field | Type | Description |
|---|---|---|
id | integer | Record ID. |
client_id, membership_id | integer/null | Linked client and membership IDs. |
checked_in_at | datetime | Check-in timestamp for check-in records. |
source | enum | Check-in source such as manual, qr or api. |
amount, currency | decimal/string | Payment amount and currency for payment records. |
method | enum | Payment method such as cash, bank, card, link or manual. |
paid_at | datetime | Payment timestamp. |
status | enum | Payment status where applicable. |
POST /nerogym/checkins request attributes
| Field | Type | Required | Description |
|---|---|---|---|
client_id | integer | Required | Client ID from the scoped merchant. |
membership_id | integer | Optional | Membership ID from the scoped merchant. |
checked_in_at | datetime | Optional | Defaults to now. |
source | enum | Optional | Defaults to api. |
POST /nerogym/payments request attributes
| Field | Type | Required | Description |
|---|---|---|---|
client_id | integer | Required | Client ID from the scoped merchant. |
membership_id | integer | Optional | Membership ID from the scoped merchant. |
amount | decimal | Required | Manual payment amount. |
currency | string | Optional | Defaults to merchant currency. |
method | enum | Required | cash, bank, card, link or manual. Raw card data is rejected. |
paid_at | datetime | Optional | Defaults to now. |
status | enum | Optional | Defaults to paid/recorded. |
reference | string | Optional | Your integration payment reference. |
PATCH request attributes
| Field | Type | Description |
|---|---|---|
checked_in_at, source, status, reference, notes | mixed | Only safe metadata/status fields are updated. Audit deletes are not exposed in API v2. |
Invoices API
Create professional merchant invoices with customer details, VAT lines, discounts, due dates and a secure NeroPay payment page.
/invoicesLists invoices for the merchant or connected merchant account.
/invoicesCreates a professional invoice and returns the public payment/review URL.
/invoices/{id}Retrieves one invoice with line items.
/invoices/{id}Updates an unpaid invoice. Paid/refunded invoices are locked.
/invoices/{id}Deletes a draft/unpaid invoice where no payment has been recorded.
GET /invoices query attributes
| Field | Type | Required | Description |
|---|---|---|---|
| status | enum | Optional | Filter by draft, unpaid, paid, cancelled, refunded or your configured invoice status. |
| q | string | Optional | Search invoice number, customer name, email or reference. |
| date_from / date_to | date | Optional | Limit by invoice creation date or issue date. |
| page / per_page | integer | Optional | Pagination controls. |
GET /invoices response attributes
| Field | Type | Description |
|---|---|---|
| id | integer | Internal invoice ID. |
| invoice_number | string | Merchant/customer-facing invoice number. |
| public_url | url | Public invoice review and payment page. |
| invoice_to, email, address | string | Customer billing details. |
| items[] | array | Invoice line items with name, quantity, unit amount, VAT and row total. |
| subtotal_amount, vat_amount, discount_amount, shipping_amount, total_amount | decimal | Calculated invoice totals. |
| payment_required, partial_payment_allowed, deposit_amount | boolean/decimal | Payment collection settings. |
| status, paid_at | enum/datetime | Current invoice status and payment timestamp when available. |
POST /invoices request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| invoice_to | string | Required | Customer or company name. |
| Required | Customer email address. | ||
| address | string | Required | Customer billing address. |
| invoice_title | string | Optional | Short title/subject for the invoice. |
| reference | string | Optional | Your internal reference. |
| po_number | string | Optional | Customer purchase order number. |
| currency | string | Optional | Currency code such as GBP. You may send currency_id instead. |
| items[] | array | Required | Each item requires name and unit_amount. qty, description and vat_rate are optional. |
| discount_amount | decimal | Optional | Flat invoice discount. |
| shipping_amount | decimal | Optional | Shipping, delivery or service amount added to the invoice. |
| due_date | date | Optional | Invoice due date. |
| payment_required | boolean | Optional | When true, the public invoice includes NeroPay checkout. |
| partial_payment_allowed | boolean | Optional | Allows the customer to pay a deposit/partial amount first. |
| deposit_amount | decimal | Optional | Deposit or upfront amount when partial payments are allowed. |
| invoice_note | text | Optional | Customer-facing invoice note. |
| footer_note | text | Optional | Optional footer shown on the invoice. |
| send_email | boolean | Optional | Send the invoice email after creation. |
| account_id | string | Platform only | Connected merchant account for NeroConnect routing. |
PATCH /invoices/{id} request attributes
| Field | Type | Description |
|---|---|---|
| invoice_to, email, address, invoice_title, reference, po_number | string | Update customer and reference details. |
| items[] | array | Replace line items and recalculate totals. Paid/refunded invoices are locked. |
| discount_amount, shipping_amount, due_date | decimal/date | Update invoice totals and due date. |
| payment_required, partial_payment_allowed, deposit_amount | boolean/decimal | Update payment collection rules before payment is recorded. |
| status | enum | Update status only where allowed by the invoice lifecycle. |
Subscriptions & recurring pricing
Use the same products, prices, discounts and usage ledger as Merchant → Subscriptions. Create monthly or annual prices, quantity tiers and agreed future price changes, then send the customer to hosted review and card authorisation.
Signed writes and account access
Every request uses HTTPS and a live Bearer secret. GET/HEAD use the Bearer credential; POST/PATCH/PUT also require a current timestamp, an Idempotency-Key and the bound signature below. For a permitted NeroConnect account, send its exact NeroPay-Account header. Body/query account aliases are rejected. Each record must belong to that selected account and the existing partner API policy must permit access.
Use the uppercase HTTP method and path including /v2, without a query string or trailing slash. Use an empty account line when the header is omitted. The timestamp is Unix seconds within five minutes. The signature is a 64-character hexadecimal digest. Encode once, sign those exact UTF-8 bytes, then send them unchanged.
This subscription signature differs from the older timestamp.body signature. It binds the method, endpoint, retry key and selected account, so a signature cannot be moved to a different operation. The Node.js and PHP examples remain complete server-side examples when the page’s language selector changes.
Retries and limits
- Persist one 8–100 character key per logical write (letters, digits, dot, underscore, colon, hyphen). Reuse the same key and data with a fresh timestamp/signature after a timeout; do not automatically generate a new key.
- A completed request replays its original status and body with
Idempotency-Replayed: true. The scope is authenticated merchant, selected account, HTTP method and path. A changed payload under the same key is rejected. A replay is a saved result; GET the subscription for its latest status. - Request references remain in the database ledger. An unconfirmed request older than 23 hours requires a billing review and returns 409; it is not blindly sent again. Invalid attempts can reserve their key; use a new key after correcting a validation-only error.
- 20 writes and 120 reads per minute per authenticated account and selected account, plus IP/global API limits. A 429 response includes
Retry-After: 60. - JSON object only for writes, maximum 64 KB/depth 16; no query parameters, uploads, raw cards, credentials, custom provider URLs or unknown fields. GET filters are explicitly allow-listed; pages contain at most 100 records.
Endpoints
/subscriptionsList this account’s subscription snapshots, with pagination.
/subscriptionsCreate an agreement with billing phases, an existing price, or a simple new price. Returns a hosted customer review link; no automatic activation or email/SMS.
/subscriptions/{id}Read one owned subscription and its agreed phases.
/subscriptions/{id}Change name/email only before an advanced agreement has been reviewed. Billing status and agreed pricing are not writable.
/subscriptions/{id}/syncRefresh verified billing status. Does not authorise a card or activate an unsigned agreement.
/subscriptions/{id}/cancelConfirm immediate cancellation through the billing workflow. No automatic refund, invoice settlement or proration.
/subscriptions/productsList product IDs and names. This is the recurring catalogue, separate from /products (NeroPOS).
/subscriptions/productsCreate a product with up to six prices, or add prices to an owned product_id. Existing prices/agreements stay unchanged.
/subscriptions/pricesList full pricing rules. Optional product_id and active=0/1 filters.
/subscriptions/prices/{priceId}/archiveArchive an owned price for new agreements. Send {}. Existing agreements keep their price.
/subscriptions/discountsList owned discount codes and availability.
/subscriptions/discountsCreate a percentage/amount code with duration, product, expiry and redemption limits.
/subscriptions/discounts/{discountId}Enable/disable a code using {"active":true/false}; discountId is the id returned by creation/listing.
/subscriptions/{id}/usageList that subscription’s usage ledger. accepted means recorded for processing, not paid.
/subscriptions/{id}/usageRecord measured usage for the current open billing period. Returns HTTP 202.
Products and prices
| Field | Type | Rules |
|---|---|---|
| product_name | string | Required; 1–190 characters. For additional prices, product_id must belong to the selected account. |
| prices | array | 1–6 price objects. Fixed, per_unit, volume, graduated or metered. |
| prices[].model | enum | flat: one fixed amount; per_unit: amount × quantity; volume: total quantity chooses one tier; graduated: each band is priced separately; metered: measured units billed in arrears. |
| prices[].label / unit | string | Required; label up to 80 characters, unit up to 40. |
| prices[].currency | enum | GBP, EUR or USD. Amounts are major currency units, not pennies/cents. |
| prices[].interval / interval_count | enum / integer | day (1–365), week (1–52), month (1–12), year (1). Required; billing periods cannot exceed one year. |
| prices[].amount | decimal | Required for flat/per_unit/metered. 0–9,999,999; flat has up to two decimal places, other unit rates up to four. Decimal strings are recommended. |
| prices[].tiers | array | Required for volume/graduated: 2–8 ordered tiers with up_to, amount and optional flat_amount. Increasing integer limits up to 1,000,000,000; final up_to is "inf". Flat tier fees support two decimal places. |
| prices[].metered | boolean | Optional for volume/graduated: true uses measured usage in arrears. The metered model is always measured usage. |
Create an agreement
| Field | Type | Rules |
|---|---|---|
| customer_name / customer_email | string / email | Required; maximum 190 characters each. |
| phases | array | 1–6 phases, all using active prices from this account, the same product, currency and billing period. Do not mix measured usage with quantity pricing. |
| phases[].price_id | string | Required; use an ID returned by /subscriptions/prices or product creation. |
| phases[].quantity | integer | Required; 1–1,000,000. Fixed and measured-usage prices use quantity 1; licensed prices multiply by the agreed quantity. |
| phases[].cycles | integer / null | Introductory phases: 1–36 billing periods. Final phase: null or omitted, continuing until cancellation. |
| start_date | YYYY-MM-DD | Optional: today or a future date less than one year away, using the application’s configured timezone. Omit for activation after customer authorisation. |
| offer_code | string | Optional; 3–24 letters/digits. Code eligibility is checked again when the customer reviews the agreement. |
| Simple creation | alternative | Instead of phases, send an existing price_id with optional quantity, or product_name/amount/currency/interval with optional interval_count/quantity. Do not mix these forms. Both return the same hosted consent flow. |
For “£10 now, £20 from next month”, create two monthly prices on one product, then use cycles=1 on the £10 phase and cycles=null on the £20 phase. “Now” means after customer authorisation, unless a future start date was agreed. The rules are fixed in the agreement; catalogue changes do not silently change an existing customer’s terms.
Discount codes
| Field | Type | Rules |
|---|---|---|
| code | string | Required; 3–24 letters/digits, normalised to uppercase. Code terms cannot be overwritten; create a new code for new terms. |
| type / value | enum / decimal | percent: greater than 0 and at most 100. amount: positive major currency amount with two decimals, at most 9,999,999. |
| currency | enum | Required: GBP/EUR/USD. For amount discounts it must match the agreement currency. |
| cycles | integer | Required: 1–36 monthly bills, or 0 for ongoing. These codes apply only to interval=month, interval_count=1 agreements. |
| product_id | string / null | Optional; restrict to one product belonging to this account. |
| max_redemptions | integer / null | Optional; 1–1,000,000, enforced when the offer is redeemed. |
| expires_at | YYYY-MM-DD / null | Optional; today or later, valid through the end of that day in the application’s configured timezone. |
| Presets | examples | First month free: percent/100/cycles=1. Three months free: percent/100/cycles=3. First month half price: percent/50/cycles=1. |
Disabling a code prevents new uses. Existing agreements keep their agreed discount. When limited cycles end, the agreed undiscounted phase price resumes automatically. Use offer_code on creation, or let the customer enter an eligible code during review.
Usage events
| Field | Type | Rules |
|---|---|---|
| quantity | integer | Required; 1–1,000,000,000 measured units. The API never accepts a caller-supplied charge amount. |
| reference | string | Required; 3–80 letters, digits, dot, underscore or hyphen. Unique business-event reference across this merchant. Retrying the same event does not bill twice, including with a new HTTP key. |
| used_at | ISO 8601 timestamp | Required with timezone, e.g. 2026-10-15T12:00:00+00:00. Within the past 34 days and the current open billing period; future/closed-period events are rejected. |
| Eligibility | rule | Only active, unpaused subscriptions whose current price uses measured usage. Negative adjustments and retroactive closed-period billing are not supported. |
Read results and lifecycle
List endpoints return {success, data: [...], meta: {current_page, per_page, total, last_page}}. Use page (1–10,000) and per_page (1–100). Subscriptions accept q (up to 190 characters) and a supported status; prices accept product_id and active=0/1.
Subscription results expose nested customer, current price and period fields, checkout_url, portal_url, invoice_status, and, for advanced agreements, the agreed phases, start date and offer code. Tiered/metered billing cannot be represented by the top-level amount alone; use pricing rules and the final invoice. A subscription’s active status is not proof that its latest invoice was paid.
The customer must review the agreement, authorise their card and confirm activation in the hosted flow. API creation and sync do not bypass that flow. Checkout/portal URLs contain private customer tokens; give them only to that customer and do not put them in public logs or analytics. Subscription status is read from the billing workflow; it cannot be set to paid/active/canceled with PATCH.
Compatibility with the previous subscription API
GET/list paths and simple amount/price creation remain available. New requests always use the advanced hosted agreement flow. Writes now require the bound signature. PATCH/PUT permit only customer_name/customer_email on a new, unreviewed agreement. Existing legacy records remain readable but are not silently migrated. Use POST /{id}/cancel with {"confirm":true} for cancellation; DELETE is not supported.
Use start_date, billing phases and discount codes instead of legacy trial_days, first_charge_date or bill_day_of_month. Unsupported fields such as body account routing, metadata, customer_phone, caller-supplied status, provider IDs and return URLs are rejected rather than silently ignored. Update older clients before switching these routes to this contract.
HTTP results
| Status | Meaning | Action |
|---|---|---|
| 200 / 201 / 202 | Success | Read/update, creation, or accepted usage respectively. |
| 400 / 401 | Request / authentication | Missing retry key, HTTPS/signature/timestamp/key failure. |
| 403 / 404 | Access / ownership | Account access denied or resource not found in the selected account. |
| 409 | Conflict | Different data for a used key, an immutable/consented agreement, or an old unconfirmed write requiring review. |
| 413 / 415 / 422 | Input | Size, content type, unknown fields, invalid pricing/offer/usage or lifecycle constraints. |
| 429 | Rate limit | Retry after the documented delay, preserving the operation key. |
| 503 | Unconfirmed / unavailable | The outcome is not confirmed. Check the response reference; retry only the same logical operation/key. Provider exceptions and secrets are not returned. |
Transactions
List, retrieve, refund and cancel transactions. High-risk transactions can expose proof and reserve state, so check transaction state before treating funds as fully available.
/transactionsLegacy alias for creating hosted/API transaction where enabled.
POST /hosted-payments or POST /payment-links. The transaction table below describes transaction records returned by list/retrieve/refund/cancel flows./transactionsLists transactions.
/transactions/{id}Retrieves one transaction.
/transactions/{id}/refundRefunds a transaction.
/transactions/{id}/cancelCancels a pending transaction.
Transaction response attributes
| Field | Type | Description |
|---|---|---|
| id | integer | Internal transaction ID. |
| account_id | string | Merchant or connected account ID. |
| reference | string | NeroPay or merchant reference. |
| np_main_trx | string | Processor/payment identifier where available. |
| status | enum | pending, succeeded, failed, cancelled, refunded. |
| is_reserve | boolean | Whether funds are currently held in reserve. |
| reserve_amount | decimal | Amount held from available balance. |
| proof_status | enum | requested, submitted, approved, rejected or null. |
Transaction Proof API
Submit proof files and buyer/shipping details when a transaction is flagged by high-value or risk logic. This API is available for merchants and connected accounts.
/transactions/{id}/proofReturns proof request and transaction reserve state.
/transactions/{id}/proofSubmits proof details and invoice/shipping file.
POST proof upload request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| invoice_file | file | Optional | JPG, PNG, PDF or WEBP. Required when staff/platform requested an invoice file. |
| courier_company | string | Optional | Shipping courier. |
| tracking_number | string | Optional | Tracking number. |
| buyer_firstname | string | Optional | Buyer first name. |
| buyer_lastname | string | Optional | Buyer last name. |
| buyer_phone | string | Optional | Buyer phone number. |
| buyer_email | string | Optional | Buyer email. |
| merchant_notes | text | Optional | Merchant notes for the review team. |
transaction.proof_submitted. Staff approval/rejection publishes transaction.proof_approved or transaction.proof_rejected. Approved reserve releases can publish balance.reserve_released.Balances
Read available, pending, instant, standard, reserve and NeroBusiness balances. Reserve balance is important for high-risk and proof-held funds.
/balancesReturns wallet balances.
/balanceAlias of /balances.
Balance response attributes
| Field | Type | Description |
|---|---|---|
wallets[].currency | object | Wallet currency id, ISO code and display symbol. |
wallets[].available | decimal | Current main wallet balance. |
wallets[].pending_funds | decimal | Funds still subject to settlement timing. |
wallets[].standard_available | decimal | Main wallet balance after pending settlement funds are excluded. |
wallets[].instant_available | decimal | Current instant availability reported for the wallet. |
wallets[].reserve_balance | decimal | Funds held in reserve due to proof, risk or compliance controls. |
wallets[].nerobusiness_balance | decimal | Latest locally recorded available balance for the merchant's NeroBusiness Financial Account in this wallet currency. |
nerocard / issuing | object | Read-only card programme summaries where available. |
NeroPay-Account. Never accept a client-supplied balance as proof of funds and never attempt to change balances through generic resource endpoints; use the documented money-movement endpoints and reconcile completed operations.Wallet Transactions
Audit wallet movement separately from payment transactions. Use this for balance ledger reconciliation.
/wallet-transactionsLists wallet balance transactions.
/wallet-transactions/{id}Retrieves one wallet ledger row.
Wallet ledger response attributes
| Field | Type | Description |
|---|---|---|
| txn_id | string | Ledger transaction ID. |
| type | enum | credit/debit/hold/release depending on implementation. |
| amount | decimal | Amount moved. |
| balance_before | decimal | Balance before movement where available. |
| balance_after | decimal | Balance after movement where available. |
| notes | text | Internal or merchant-facing notes. |
Payouts & Schedule
Create and inspect payout requests and manage payout schedule. Payout creation can trigger proof/risk checks and Perfex review tasks.
/payoutsLists payouts.
/payoutsCreates a payout request.
/payouts/requestLegacy alias for create payout.
/payouts/{id}Retrieves one payout.
/payout-scheduleGets payout schedule.
/payout-scheduleUpdates payout schedule.
/transfer-scheduleLegacy alias of payout schedule.
/transfer-scheduleLegacy alias of update payout schedule.
POST/PATCH payout request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| amount | decimal | Required | Payout amount. |
| currency | enum | Required | Currency. |
| transfer_speed | enum | Optional | instant or standard. |
| bank_account_id | string | Optional | Destination bank reference. |
| reference | string | Optional | Statement or internal reference. |
Disputes
List and inspect payment disputes, submit final counter evidence or explicitly accept a claim. Responses use NeroPay case IDs and never expose processor account IDs, provider object IDs, storage paths or internal ledger fields.
/disputesLists account-scoped cases. Filters: status, action_required, q and per_page (maximum 50).
/disputes/{case_id}Retrieves one case such as DISPUTE-1057.
/disputes/{case_id}/counterSubmits final counter-dispute evidence to NeroPay.
/disputes/{case_id}/acceptAccepts the claim. This action is final and cannot be reversed.
NeroPay-Account: {connected_account_id}. NeroPay verifies that the account belongs to the authenticated platform. Supplying another merchant ID returns not found/forbidden rather than cross-account data.Idempotency-Key, a timestamp no more than five minutes old and X-NeroPay-Signature = HMAC-SHA256(timestamp + "." + exact_raw_body, secret_key). They are additionally limited to six attempts per minute. Reusing an idempotency key returns 409 duplicate_request.Counter evidence attributes
| Field | Type | Required | Description |
|---|---|---|---|
product_description | string | Required | What was sold or delivered; maximum 20,000 characters. |
evidence_statement | string | Required | Clear explanation supporting the counter dispute; maximum 20,000 characters. |
service_date | date | Optional | ISO date, for example 2026-09-01. |
shipping_tracking_number | string | Optional | Carrier tracking reference; maximum 255 characters. |
proof_file | file | Optional | PDF, JPG or PNG, maximum 4.5 MB. Use multipart/form-data and sign the exact multipart body. |
confirm_submission | boolean | Required | Must be true. Evidence is submitted as final. |
For accept requests, send {"confirm_accept":true}. Original cardholder claim artefacts remain available only in the authenticated dashboard secure viewer; API v2 does not proxy or publish provider-hosted claim documents.
Loans
Loans and financing records are grouped under Money Movement and are read-only through API v2.
/loansLists loan/financing records.
/loans/{id}Retrieves one loan record.
Loan response attributes
| Field | Type | Description |
|---|---|---|
| offer_id | string | Financing offer identifier. |
| status | enum | offer, active, paid, declined etc. |
| campaign_type | string | Campaign/category. |
| financing_type | string | Financing type. |
| created_at | datetime | Record creation time. |
NeroDisburse Bank Accounts
Bank accounts are documented under NeroDisburse. API responses never expose full account numbers, sort codes, IBANs or routing numbers.
/bank-accountsLists safe payout bank references.
/bank-accountsAdds a payout bank account through the NeroDisburse bridge.
/nerodisburse/bank-accountsLists NeroDisburse bank accounts.
/nerodisburse/bank-accountsCreates a NeroDisburse bank account.
POST bank-account request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| account_name | string | Required | Display name for the destination. |
| bank_name | string | Optional | Bank name. |
| sort_code | string | Optional | GB sort code for GB bank accounts. |
| account_number | string | Optional | GB account number for GB bank accounts. |
| iban | string | Optional | IBAN for supported international accounts. |
| currency | enum | Required | Currency. |
| use_for | enum | Optional | supplier, payout, merchant etc. |
| is_default | boolean | Optional | Set as default destination. |
NeroDisburse Payouts
Create supplier or connected disbursement payouts using saved bank accounts.
/nerodisburse/payoutsLists NeroDisburse payouts.
/nerodisburse/payoutsCreates pending NeroDisburse payout.
/nerodisburse/payouts/{id}Retrieves one NeroDisburse payout.
POST payout request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| amount | decimal | Required | Amount. |
| currency | enum | Required | Currency. |
| transfer_speed | enum | Optional | instant or standard. |
| bank_account_id | string | Required | Saved bank account reference. |
| reference | string | Optional | Payout reference. |
| note | text | Optional | Supplier payout note. |
NeroDisburse Payments
Create disbursement payment records where enabled by the NeroDisburse controller.
/nerodisburse/paymentsCreates a NeroDisburse payment/disbursement request.
Use this endpoint where your integration needs NeroDisburse payment creation rather than a standard payout request. Risk and payout availability rules still apply.
Terminal Payments
Send in-person payment actions to a registered terminal reader.
/terminal/paymentsCreates and sends a terminal payment action.
/terminal/readers/{reader_id}/cancel-actionCancels the current reader action.
POST terminal payment request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| amount | decimal | Required | Amount. |
| currency | enum | Required | Currency. |
| reader_id | string | Required | Terminal reader ID. |
| location_id | string | Required | Terminal location ID. |
| description | text | Optional | Payment description. |
| reference | string | Optional | Reference shown in transaction history. |
Terminal Locations
Create, list and manage terminal locations. Location creation uses the terminal bridge route.
/locationsLists terminal/NeroPOS locations.
/locationsLegacy alias to create terminal location.
/terminal/locationsLists terminal locations.
/terminal/locationsCreates a terminal location.
/locations/{id}Retrieves one location.
/locations/{id}Updates a location.
/locations/{id}Deletes where enabled.
POST/PATCH location request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| display_name | string | Required | Location display name. |
| line1 | string | Required | Address line 1. |
| city | string | Required | City. |
| postal_code | string | Required | Postal code. |
| country | enum | Required | ISO country code. |
| is_default | boolean | Optional | Set default location. |
| tipping_enabled | boolean | Optional | Enable tipping for terminal/POS flows. |
Terminal Readers
Register, list and remove terminal readers.
/readersLists readers.
/readersLegacy alias to register reader.
/terminal/readersLists terminal readers.
/terminal/readersRegisters a reader.
/terminal/readers/{id}Deletes/unlinks a reader.
POST reader registration request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| label | string | Required | Reader label. |
| location_id | string | Required | Location ID. |
| registration_code | string | Required | Pairing/registration code from device. |
| reader_serial_number | string | Read-only | Device serial where available. |
| reader_status | enum | Read-only | online/offline/unknown. |
Devices
Read-only terminal/device records for fleet visibility.
/devicesLists device rows.
/devices/{id}Retrieves one device.
Device response attributes
| Field | Type | Description |
|---|---|---|
| device_id | string | Internal device ID. |
| reader_id | string | Linked reader ID. |
| reader_serial | string | Serial number. |
| reader_label | string | Display label. |
| status | enum | Device status. |
NeroCard Cards
NeroCard card records are read-only in API v2 and are separate from payment cards.
/nerocardsLists NeroCard cards.
/nerocards/{id}Retrieves one NeroCard card.
Card response attributes
| Field | Type | Description |
|---|---|---|
| cardholder_name | string | Cardholder name. |
| brand | string | Card brand. |
| last4 | string | Last four digits. |
| status | enum | active, inactive, cancelled, blocked etc. |
| card_pin | hidden | Never returned. |
NeroCard Cardholders
Read NeroCard cardholder records.
/nerocardholdersLists cardholders.
/nerocardholders/{id}Retrieves one cardholder.
Cardholder response attributes
| Field | Type | Description |
|---|---|---|
| name | string | Cardholder name. |
| string | Email. | |
| phone | string | Phone. |
| neropay_cardholder_id | string | NeroPay cardholder identifier when present. |
| created_at | datetime | Creation time. |
NeroCard Transactions
Read NeroCard issuing transactions separately from wallet and payment transactions.
/nerocard-transactionsLists issuing/NeroCard transactions.
/nerocard-transactions/{id}Retrieves one NeroCard transaction.
NeroCard transaction response attributes
| Field | Type | Description |
|---|---|---|
| neropay_issuing_transaction_id | string | NeroPay issuing transaction ID. |
| merchant_name | string | Merchant name on the card transaction. |
| amount | decimal | Transaction amount. |
| merchant_amount | decimal | Original merchant amount where different. |
| platform_fee_amount | decimal | Platform fee amount if applied. |
| net_amount | decimal | Net ledger amount. |
| status | enum | pending, posted, reversed etc. |
| type | enum | purchase, refund, adjustment etc. |
NeroTrade API
NeroTrade API v2 lets eligible merchants create, retrieve, list and update wholesale trade records from their own systems.
402 nerotrade_subscription_required when the plan is not active for the merchant.Records covered
Trade accounts, product categories, products, inventory stock fields, drivers, deliveries, invoices, collections, statement views, campaign records, route plans and driver check-ins.
Response envelope
Successful calls return { success: true, data: ... }. List calls also include pagination meta. Failed calls return { success: false, error: { code, message } }.
/nerotrade/dashboardReturns NeroTrade summary, subscription status, stock alerts and operational totals.
/nerotrade/{resource}Lists supported NeroTrade records for the authenticated merchant.
/nerotrade/{resource}Creates a supported NeroTrade record where the resource supports creation.
/nerotrade/{resource}/{id}Retrieves one supported NeroTrade record.
/nerotrade/{resource}/{id}Updates one supported NeroTrade record.
NeroTrade Trade Accounts
Create and maintain wholesale customer accounts, credit terms, collection preferences and account risk status.
/nerotrade/trade-accountsLists trade accounts. Alias: /nerotrade/customers.
/nerotrade/trade-accountsCreates a trade account.
/nerotrade/trade-accounts/{id}Retrieves one trade account.
/nerotrade/trade-accounts/{id}Updates account details, limits, terms, collection method or supply status.
POST/PATCH trade account request attributes
| Field | Type | Description |
|---|---|---|
| business_name | string | Required on create. Trade customer business name. |
| contact_name | string | Main contact name. |
| string | Billing or account email. | |
| phone | string | Contact phone number. |
| billing_address | string | Billing address. |
| delivery_address | string | Default delivery address. |
| payment_terms | enum | cod, 7_days, 14_days, 30_days, weekly or monthly. |
| credit_limit | decimal | Approved trade account credit limit. |
| opening_balance | decimal | Optional opening balance on create. |
| collection_method | enum | Collection preference such as payment_link or bank_transfer. |
| risk_status | string | Internal account risk label, for example good or watch. |
| stop_supply | boolean | Stops supply for the account when true. |
NeroTrade Products & Pricing
Manage trade product categories, SKUs, wholesale pricing, VAT settings and stock-tracked product records.
/nerotrade/product-categoriesLists trade product categories. Alias: /nerotrade/categories.
/nerotrade/product-categoriesCreates a product category.
/nerotrade/product-categories/{id}Updates a product category.
/nerotrade/productsLists trade products and pricing.
/nerotrade/productsCreates a trade product.
/nerotrade/products/{id}Retrieves one trade product.
/nerotrade/products/{id}Updates product details, stock settings or pricing.
POST/PATCH product and pricing request attributes
| Field | Type | Description |
|---|---|---|
| name | string | Required product name. |
| base_unit | string | Required unit such as pcs, box, case or pallet. |
| unit_price | decimal | Required default trade unit price. |
| category_id | integer | Linked NeroTrade product category. |
| category_name | string | Creates or links a category by name when supplied. |
| sku | string | Stock keeping unit. |
| description | string | Product description. |
| vat_rate | decimal | VAT rate applied to the product. |
| vat_included | boolean | Whether price includes VAT. |
| track_stock | boolean | Enables inventory tracking for the product. |
| stock_qty | decimal | Current available stock. |
| reorder_level | decimal | Manual reorder threshold. |
| preferred_supplier | string | Supplier reference. |
NeroTrade Inventory
Read stock-tracked products and update stock quantity, reorder level, supplier and active status.
/nerotrade/inventoryLists products where stock tracking is enabled.
/nerotrade/inventory/{id}Retrieves one stock-tracked product.
/nerotrade/inventory/{id}Updates stock quantity, reorder level, preferred supplier or active status.
track_stock enabled. Stock fields can then be updated through the inventory endpoint.PATCH inventory request attributes
| Field | Type | Description |
|---|---|---|
| track_stock | boolean | Enables stock tracking. |
| stock_qty | decimal | Current stock quantity. |
| reorder_level | decimal | Manual reorder threshold. |
| preferred_supplier | string | Supplier reference. |
| active | boolean | Whether the product is active. |
NeroTrade Drivers & Deliveries
Manage driver records and delivery note workflows for trade orders. Delivery creation supports line items and can optionally create a linked invoice.
/nerotrade/driversLists delivery drivers.
/nerotrade/driversCreates a driver record.
/nerotrade/drivers/{id}Retrieves one driver record.
/nerotrade/drivers/{id}Updates driver details or active status.
/nerotrade/deliveriesLists deliveries and delivery notes.
/nerotrade/deliveriesCreates a delivery record.
/nerotrade/deliveries/{id}Retrieves one delivery record with items.
/nerotrade/deliveries/{id}Updates delivery status, driver, proof name, notes or line items.
POST/PATCH driver and delivery request attributes
| Field | Type | Description |
|---|---|---|
| customer_id | integer | Required linked trade account. |
| driver_id | integer | Assigned driver. |
| delivery_number | string | Optional delivery reference. Generated if omitted. |
| status | enum | scheduled, delivered, invoiced, failed or cancelled. |
| delivered_at | datetime | Delivery timestamp. |
| proof_name | string | Recipient name for proof of delivery. |
| create_invoice | boolean | Creates an invoice from the delivery items when true. |
| items | array | Line items with item_name, quantity, unit, unit_price, vat_rate and optional product_id. |
NeroTrade Invoices & Collections
Create trade invoices, record payment collections and keep outstanding trade account balances in sync.
/nerotrade/invoicesLists trade invoices.
/nerotrade/invoicesCreates a trade invoice with line items.
/nerotrade/invoices/{id}Retrieves one trade invoice with items and payments.
/nerotrade/invoices/{id}Updates invoice status, dates, terms, collection method, notes or items.
/nerotrade/collectionsLists collection/payment records. Alias: /nerotrade/payments.
/nerotrade/collectionsCreates a collection/payment record.
/nerotrade/collections/{id}Updates collection amount, method, invoice link, paid date or reference.
POST/PATCH invoice and collection request attributes
| Field | Type | Description |
|---|---|---|
| customer_id | integer | Required linked trade account. |
| invoice_number | string | Optional merchant invoice reference. Generated if omitted. |
| status | enum | sent, part_paid, paid, overdue or collection_failed. |
| issue_date | date | Invoice issue date. |
| due_date | date | Invoice due date. Calculated from terms if omitted. |
| payment_terms | enum | cod, 7_days, 14_days, 30_days, weekly or monthly. |
| collection_method | string | Collection preference. |
| items | array | Line items with item_name, quantity, unit, unit_price, vat_rate and optional product_id. |
| amount | decimal | Required collection amount. |
| method | string | Required payment method for collections. |
| reference | string | External collection reference. |
| paid_at | datetime | Payment received timestamp. |
NeroTrade Statements
Read statement-style account summaries, outstanding balances, invoices and payments for trade accounts.
/nerotrade/statementsLists trade accounts in statement format. Use outstanding_only=1 to return accounts with balance due.
/nerotrade/statements/{customer_id}Retrieves one trade account statement with invoices and payments.
Statement response attributes
| Query / Field | Type | Description |
|---|---|---|
| outstanding_only | boolean | Only return trade accounts with outstanding balances. |
| limit | integer | Number of records to return. Maximum 100 for the list endpoint and 200 for invoice/payment lines. |
| customer | object | Trade account details. |
| summary | object | Current balance, overdue balance, invoice count and payment count. |
| invoices | array | Recent invoices for the trade account. |
| payments | array | Recent payment/collection records. |
NeroTrade Sales & Marketing
Manage campaign records linked to trade accounts for merchant-supplied sales and marketing workflows.
/nerotrade/campaignsLists sales and marketing campaign records.
/nerotrade/campaignsCreates a campaign record.
/nerotrade/campaigns/{id}Retrieves one campaign record.
/nerotrade/campaigns/{id}Updates campaign details, schedule or status.
POST/PATCH campaign request attributes
| Field | Type | Description |
|---|---|---|
| name | string | Required campaign name. |
| campaign_type | string | Required campaign type, for example promotion or retention. |
| channel | enum | Required channel such as email, sms, phone, field_sales or manual. |
| target_segment | string | Target segment. Defaults to all_trade_accounts. |
| status | enum | draft, scheduled, active, completed or cancelled. |
| message | string | Merchant-supplied campaign message or note. |
| scheduled_at | datetime | Optional scheduled time. |
NeroTrade Routes & Tracking
Create delivery route plans and update driver check-in records.
/nerotrade/route-plansLists planned routes. Alias: /nerotrade/routes.
/nerotrade/route-plansCreates a route plan.
/nerotrade/route-plans/{id}Retrieves one route plan.
/nerotrade/route-plans/{id}Updates route name, date, status, driver, vehicle or notes.
/nerotrade/driver-checkinsLists driver tracking/check-in records.
/nerotrade/driver-checkinsCreates a driver check-in record.
/nerotrade/driver-checkins/{id}Updates a driver check-in record.
POST/PATCH route request attributes
| Field | Type | Description |
|---|---|---|
| route_name | string | Required route name. |
| driver_id | integer | Assigned driver. |
| route_date | date | Route date. Defaults to today when omitted. |
| status | enum | planned, in_progress, completed or cancelled. |
| vehicle_registration | string | Vehicle registration. |
| start_area | string | Route start area. |
| end_area | string | Route end area. |
| estimated_stops | integer | Estimated stop count. |
| estimated_value | decimal | Estimated route value. |
| checkin_type | enum | Required check-in type such as start_route, delivery_stop, issue or end_route. |
| latitude / longitude | decimal | Optional GPS coordinates. |
Customers
Create and manage NeroPOS/NeroPay customer records.
/customersLists customers.
/customersCreates a customer.
/customers/{id}Retrieves one customer.
/customers/{id}Updates a customer.
POST/PATCH customer request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Required | Customer name. |
| string | Optional | Email. | |
| phone | string | Optional | Phone. |
| postcode | string | Optional | Postcode. |
| address1/address2 | string | Optional | Address lines. |
| city | string | Optional | City. |
| instructions | text | Optional | Delivery or customer notes. |
Categories & Products
Keep product catalogue data in sync for NeroPOS and NeroWeb menus.
/categoriesLists categories.
/categoriesCreates category.
/categories/{id}Updates category.
/categories/{id}Deletes category where enabled.
/productsLists products.
/productsCreates product.
/products/{id}Updates product.
/products/{id}Deletes product where enabled.
POST/PATCH category and product request attributes
| Product field | Type | Required | Description |
|---|---|---|---|
| category_id | integer | Optional | Category ID. |
| name | string | Required | Product name. |
| sku | string | Optional | SKU. |
| price | decimal | Required | Product price. |
| vat_rate | decimal | Optional | VAT rate. |
| image_url | string | Optional | Image URL. |
| stock_qty | integer | Optional | Stock quantity. |
| description | text | Optional | Product description. |
Product Options & Rules
Manage product-specific options and global option groups for POS and online ordering.
/product-option-groupsLists product option groups.
/product-option-groupsCreates product option group.
/product-optionsLists product options.
/product-optionsCreates product option.
/global-option-groupsLists global option groups.
/global-option-groupsCreates global option group.
/global-option-itemsLists global option items.
/global-option-itemsCreates global option item.
/global-option-assignmentsLists assignments.
/global-option-assignmentsCreates assignment.
/product-option-rulesAlias for assignments/rules.
POST/PATCH option request attributes
| Field | Type | Description |
|---|---|---|
| name | string | Option or group name. |
| required | boolean | Require selection. |
| min_select / max_select | integer | Selection limits. |
| price_delta | decimal | Price change for selected item. |
| rules_json | object | Rule configuration. |
| scope / scope_id | enum/integer | Where a global option applies. |
Tables & Areas
Manage table maps, areas and table status for dine-in flows.
/table-areasLists table areas.
/table-areasCreates table area.
/tablesLists tables.
/tablesCreates table.
/tables/{id}Updates table.
/tables/{id}Deletes table where enabled.
POST/PATCH table and area request attributes
| Field | Type | Description |
|---|---|---|
| area_id | integer | Area ID. |
| name / label | string | Display name. |
| seats | integer | Seat count. |
| status | enum | available, occupied, reserved etc. |
| x,y,w,h,rotation | decimal/integer | Table-map coordinates. |
Cashiers, Registers & Staff
Manage POS cashiers, registers, POS staff and team members.
/cashiersLists cashiers.
/cashiersCreates cashier.
/registersLists registers.
/registersCreates register.
/pos-staffsLists POS staff.
/pos-staffsCreates POS staff.
/team-membersLists merchant team members.
/team-membersCreates team member.
POST/PATCH staff request attributes
| Field | Type | Description |
|---|---|---|
| name | string | Staff/cashier name. |
| email / username | string | Login identifier. |
| password / new_password | string | Accepted on create/update but never returned. |
| role | enum | Role/register type. |
| permissions | object/array | Permission payload. |
| location_ids / till_ids | array | Allowed locations or tills. |
Invoices
Create and manage merchant invoices and invoice line items.
/invoicesLists invoices.
/invoicesCreates invoice.
/invoices/{id}Retrieves invoice.
/invoices/{id}Updates invoice.
/invoice-itemsLists invoice items.
/invoice-itemsCreates invoice item.
POST/PATCH invoice request attributes
| Field | Type | Description |
|---|---|---|
| invoice_number | string | Invoice number. |
| invoice_to | string | Recipient name. |
| invoice_email | string | Recipient email. |
| currency_id | integer | Currency ID. |
| sub_total / total_amount | decimal | Amounts. |
| items_json | object/array | Line items payload. |
| due_date | date | Due date. |
| status | enum | draft, sent, paid etc. |
NeroPOS Orders
NeroPOS order APIs are separate from NeroWeb orders and generic store orders.
/neropos-ordersLists NeroPOS orders.
/neropos-ordersCreates NeroPOS order.
/neropos-orders/{id}Retrieves order.
/neropos-orders/{id}Updates order.
/neropos-order-itemsLists order items.
/neropos-order-itemsCreates order item.
/ordersGeneric orders resource.
/store-ordersRead-only NeroPay Store orders.
POST/PATCH order request attributes
| Field | Type | Description |
|---|---|---|
| order_number / order_ref | string | Order reference. |
| status | enum | Order status. |
| fulfilment_type | enum | dine_in, takeaway, delivery etc. |
| payment_method / payment_status | enum | Payment fields. |
| customer_* | string | Customer details. |
| subtotal, total, tip_fee | decimal | Money fields. |
| location_id / table_id / staff_id | integer | Operational links. |
| meta_json | object | Extra order metadata. |
NeroPOS Payment Settings
Manage POS payment, tax, service fee, cashiers, tables and receipt defaults.
/payment-settingsLists POS payment settings.
/payment-settingsCreates settings where no row exists.
/payment-settings/{id}Retrieves settings.
/payment-settings/{id}Updates settings.
POST/PATCH payment settings request attributes
| Field | Type | Description |
|---|---|---|
| default_tax_fee | decimal | Default tax fee. |
| default_service_fee | decimal | Default service fee. |
| default_tip_fee | decimal | Default tip fee. |
| pos_mode / default_channel | enum | POS operating mode. |
| enable_tables / enable_cashiers | boolean | Feature toggles. |
| receipt_footer / receipt_logo_url | text/string | Receipt branding. Use receipt_logo_url for the logo image URL. |
| min_card_charge | decimal | Minimum card charge. |
NeroWeb Settings
Configure online ordering storefront settings separately from POS resources.
/neroweb-settingsLists NeroWeb settings.
/neroweb-settingsCreates settings.
/neroweb-settings/{id}Retrieves settings.
/neroweb-settings/{id}Updates settings.
POST/PATCH NeroWeb settings request attributes
| Field | Type | Description |
|---|---|---|
| store_name | string | Online store name. |
| slug | string | Store slug. |
| is_active | boolean | Enable store. |
| disable_delivery / disable_collect | boolean | Fulfilment toggles. |
| enable_card / enable_cash | boolean | Payment toggles. |
| working_hours_json | object | Working hours. |
| delivery_bands_json | object | Delivery pricing/areas. |
| theme_json | object | Brand/theme settings, including logo_url. |
NeroWeb Pages
Manage public pages used by the NeroWeb storefront builder.
/neroweb-pagesLists pages.
/neroweb-pagesCreates page.
/neroweb-pages/{id}Retrieves page.
/neroweb-pages/{id}Updates page.
/nerowebpagesLegacy alias for pages.
POST/PATCH NeroWeb page request attributes
| Field | Type | Description |
|---|---|---|
| title | string | Page title. |
| slug | string | URL slug. |
| page_type | enum | home, content, legal etc. |
| is_home / is_published / show_in_nav | boolean | Page flags. |
| nav_label / nav_order | string/integer | Navigation settings. |
| html_content / content / css_content | text | Page content. |
| builder_json | object | Builder state. |
| meta_title / meta_description | string/text | SEO metadata. |
NeroWeb Orders
NeroWeb orders are separate from NeroPOS orders and store orders.
/neroweb-ordersLists NeroWeb orders.
/neroweb-ordersCreates NeroWeb order.
/neroweb-orders/{id}Retrieves order.
/neroweb-orders/{id}Updates order.
/neroweb-order-itemsLists order items.
/neroweb-order-itemsCreates order item.
POST/PATCH NeroWeb order request attributes
| Field | Type | Description |
|---|---|---|
| order_ref | string | Order reference. |
| status | enum | Order status. |
| fulfilment_type | enum | delivery, collect etc. |
| payment_method / payment_status | enum | Payment fields. |
| subtotal_pence / total_pence | integer/decimal | Money fields. |
| customer_name / email / phone | string | Customer fields. |
| meta_json | object | Extra metadata. |
Booking Settings
Booking settings are separate from booking transactions and should appear under the Booking menu.
/booking-settingsLists booking settings.
/booking-settingsCreates booking settings.
/booking-settings/{id}Retrieves booking settings.
/booking-settings/{id}Updates booking settings.
POST/PATCH booking settings request attributes
| Field | Type | Description |
|---|---|---|
| booking_company_name | string | Booking brand/company name. |
| booking_type | enum | Booking mode/type. |
| weekly_hours | object | Weekly opening hours. |
| auto_approve_booking | boolean | Auto approve bookings. |
| slot_duration | integer | Minutes per slot. |
| max_bookings_per_slot / max_guests | integer | Capacity. |
| services | object/array | Bookable services. |
| holiday_days | array | Closed dates. |
| staff_enabled / staff | boolean/object | Staff booking assignment. |
Bookings
Create and manage booking transactions.
/bookingsLists bookings.
/bookingsCreates booking.
/bookings/{id}Retrieves booking.
/bookings/{id}Updates booking.
POST/PATCH booking request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| booking_date | date | Required | Booking date. |
| booking_time | time | Required | Booking time. |
| guest_count | integer | Optional | Guests. |
| service | string | Optional | Service name. |
| amount | decimal | Optional | Booking amount. |
| staff_id / staff_name | integer/string | Optional | Staff assignment. |
| location_id | integer | Optional | Location. |
| customer_name / phone / email | string | Required | Customer details. |
| customer_note | text | Optional | Customer note. |
| status | enum | Optional | pending, confirmed, cancelled etc. |
KYC / Identity API
Identity API is not only for NeroConnect. Direct merchants can also use it to create verification links and read verification sessions.
/identity/verification-linksCreates a document verification link.
/identity/verification-sessionsLists verification sessions.
/identity/verification-sessions/{id}Retrieves one verification session.
POST identity verification-link request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| type | enum | Optional | document or supported verification type. |
| return_url | string | Optional | Where the user should return after verification. |
| first_name / last_name | string | Optional | Prefill name if known. |
| country | enum | Optional | ISO country code. |
| metadata | object | Optional | Developer metadata. |
short_url or verification_url in your own dashboard.Compliance API
Compliance APIs let merchants or platforms read file and information requests, then submit requested document evidence back to NeroPay.
/compliance/requestsLists compliance requests, including each request's response_type.
/compliance/requests/{id}Retrieves one compliance request.
/compliance/requests/{id}/documentsUploads evidence for a request whose response_type is file.
Compliance request response attributes
| Field | Type | Description |
|---|---|---|
| response_type | enum | file or text. Text requests appear as Information needed in the merchant dashboard. |
| docs_number | integer | Maximum required file slots for file requests. |
| has_text_response | boolean | Whether the merchant has submitted the requested information. |
| text_submitted_at | datetime|null | ISO 8601 submission time for a text response, when present. |
| has_file_1 / has_file_2 / has_file_3 | boolean | Whether each available upload slot contains a file. |
POST compliance document attributes
| Field | Type | Required | Description |
|---|---|---|---|
| file_1 | file | Required* | First requested file. At least one of file_1, file_2 or file_3 is required. |
| file_2 / file_3 | file | Optional | Additional files when the request allows multiple upload slots. |
| note | text | Optional | Submission note, maximum 2,000 characters. |
text_response_required. Live account-requirement updates create a NeroForce review task automatically; document requirements also create a file request, while value requirements appear as Information needed. Locally disabled merchant accounts are logged and skipped. Webhooks notify document requested/submitted/approved/rejected.Support Tickets
White-label support APIs allow a platform to create tickets for NeroPay staff while keeping the platform as the customer-facing brand.
/support/ticketsLists tickets.
/support/ticketsCreates ticket.
/support/tickets/{id}Retrieves ticket.
POST support ticket request attributes
| Field | Type | Required | Description |
|---|---|---|---|
| subject | string | Required | Ticket subject. |
| message | text | Required | Initial message. |
| priority | enum | Optional | low, normal, high, urgent. |
| category | string | Optional | Support category. |
| attachments[] | file | Optional | Optional files where supported. Max 2mb. PNG, JPG, WEBP or PDF |
support.ticket_updated and support.message_created webhooks and display the answer in your own UI.Webhooks
Use webhooks for payment outcomes, account updates, KYC, compliance, proof, reserve release and support events.
/webhooksLists configured endpoints.
/webhook-deliveriesLists delivery attempts.
transaction.succeededtransaction.failedtransaction.proof_requestedtransaction.proof_submittedtransaction.proof_approvedtransaction.proof_rejectedpayout.proof_requestedtransfer.proof_requestedbalance.reserve_releasedcompliance.document_requestedcompliance.document_submittedcompliance.document_approvedcompliance.document_rejectedkyc.pendingkyc.verifiedkyc.rejectedaccount.updateaccount.updatedconnected_account.createdconnected_account.updatedsupport.ticket_createdsupport.ticket_updatedsupport.message_createdWebhook response attributes
| Field | Type | Description |
|---|---|---|
| id | string | Webhook event ID. |
| type | enum | Event type. |
| created_at | datetime | Event creation time. |
| account | object | Merchant or connected account payload. |
| data | object | Event-specific payload. Failed transaction events include data.error.code, data.error.message and optional data.error.decline_code. |
| signature | string | Use your endpoint signing secret where configured. |
transaction.failed to receive asynchronous terminal or hosted-payment failures. Treat delivery as an event notification: acknowledge the webhook with HTTP 2xx, then use data.status and data.error for the payment result.Sandbox environment
The Developer sandbox uses separate test keys and isolated simulated payments. It is not a full live-API replica.
Use the 10-2026 selector above to open the dedicated Sandbox reference, including supported endpoints, request fields, checkout outcomes, callbacks and limits. Balances, payouts, transfers, refunds, terminals and generic resource writes are unavailable in sandbox.
Resource Reference
API v2 exposes explicit controller endpoints plus direct resource aliases. Resources are grouped by product area in this documentation; they are not all hidden under NeroPOS.
Core
Payments
Money Movement
NeroDisburse
Terminal
NeroCard
NeroTrade
NeroPOS
NeroWeb
Bookings
Risk & Ops
/v2/disputes, /v2/bank-accounts, /v2/neroweb-orders, /v2/nerocard-transactions, /v2/nerotrade/trade-accounts and /v2/bookings should not return route-not-found when the v2 route patch is deployed and route cache is cleared.