Developers
Dashboard ↗
API documentation
NeroPay API v2

Build with NeroPay

View Markdown ↗

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.

/v2Live base path
HMACSigned writes
ProductsPayment, POS, Web, Card, Trade, Disburse
Risk-readyKYC, compliance, proof, reserve

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.

https://eu.neropay.app/v2

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.

Recommended platform flow: create connected account, create identity verification link, listen for KYC/compliance/proof webhooks, handle support tickets and only release marketplace UX once account and reserve states are safe.
Updated 16 Sep 2026

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 →
Direct install · RC1

NeroPay for OpenCart 3

Download directly from NeroPay. Marketplace not required. Hosted checkout; staging acceptance required.

Installation and download →
Direct install · RC1

NeroPay for PrestaShop

Download directly from NeroPay. Marketplace not required. Hosted checkout; staging acceptance required.

Installation and download →
Direct install · RC1

NeroPay for WHMCS

Download directly from NeroPay. Marketplace not required. Hosted checkout; staging acceptance required.

Installation and download →
Direct install · RC1

NeroPay for Magento 2 / Adobe Commerce

Download directly from NeroPay. Marketplace not required. Hosted checkout; staging acceptance required.

Installation and download →
Plugins are recommended for standard store, invoice and no-code workflows. Use the API Reference when you need full platform control, connected accounts, custom onboarding, identity, compliance, proof and support flows.

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.

Plugin package

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.

1. Install and activateUpload the NeroPay WooCommerce plugin through WordPress Admin or FTP, then activate it from Plugins.
2. Configure credentialsOpen WooCommerce → Settings → Payments → NeroPay and enter your API key, merchant details and secret key.
3. Confirm webhooksKeep the webhook/IPN URL reachable so WooCommerce can move orders from pending to paid after NeroPay confirms payment.
SettingTypeRequiredDescription
public_keystringRequiredIdentifies the merchant account.
secret_keystringRequiredServer-side key used by the plugin for secure API actions.
webhook_urlstringRequiredReceives payment success, failure or pending updates.
currencyenumRequiredStore 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.

Marketplace installation

Install NeroPay from the official Wix marketplace link, then configure Public Key, success URL, cancel URL and IPN URL.

1. Install from the marketplaceInstall the official NeroPay app, then connect it to your NeroPay merchant account.
2. Add API keysCopy the Public Key and Secret Key from the NeroPay dashboard. Keep secret keys out of browser code.
3. Configure URLsSet success, cancel and IPN URLs so payment status can return to the store.
4. Test in sandboxUse sandbox mode before switching to live keys and live checkout.
FieldTypeRequiredDescription
public_keystringRequiredNeroPay public key configured in the Wix app.
success_urlstringRequiredPage shown after successful payment.
cancel_urlstringRequiredPage shown when checkout is cancelled.
ipn_urlstringRequiredEndpoint that receives payment confirmation.
For custom Wix backend flows, create hosted payments server-side. Browser-only flows should never expose the secret key.

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.
1. Install matching versionAdd neropay_payment to the add-ons path, install dependencies, restart Odoo and update the Apps list.
2. Configure providerOpen Accounting → Configuration → Payment Providers → NeroPay. Set credentials, receiving account and clearing journal.
3. Test and enableOdoo 19 is a release candidate. Perform native installation and authorised live acceptance testing before production use. Its Test state remains intentionally blocked in this plugin release; do not assume compatibility with the Developer sandbox.
Odoo 16–18 are separate existing packages. Do not install an Odoo 19 module into an older version or assume all versions have identical capabilities.

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.

Perfex module package

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.
1. Upload moduleExtract the NeroPay payment module and upload it to the Perfex modules directory.
2. Enable gatewayGo to Setup → Payments → Payment Gateways and enable the NeroPay gateway.
3. Configure credentialsEnter public and secret API keys and define supported currencies.
4. Verify IPNPerfex should listen at {your_perfex_url}/neropay_gateway/ipn and mark invoices paid after verification.
If invoices do not update, confirm the IPN URL, secret key and server logs before retrying payment creation.

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.

No-code automation

Use Zapier to create payment links, log transactions, notify teams and sync payment events with CRMs, spreadsheets and 5,000+ apps.

1. Connect accountLog in to NeroPay, copy your Public API Key and paste it into the Zapier connection window.
2. Choose modeSelect Sandbox or Live mode depending on whether the workflow should test or process real payment links.
3. Create actionUse the Create Payment Request action to return a checkout URL instantly.
4. Automate follow-upSend payment notifications to Slack, log rows in Sheets, update CRM records or create invoices automatically.
Action fieldTypeRequiredDescription
public_keystringRequiredNeroPay Public API key.
identifierstringRequiredUnique ID for the payment.
currencyenumRequiredCurrency code such as GBP, EUR or IDR.
amountdecimalRequiredPayment amount.
detailsstringRequiredDescription or order details.
ipn_urlstringRequiredInstant payment notification URL.
customer_phonestringOptionalCustomer phone number.
customer_addressstringOptionalBilling address.
Direct install · Pilot release RC1

NeroPay for OpenCart 3

Hosted checkout with server-side payment verification and missed-notification recovery. Marketplace installation is not required.

Target environment

OpenCart 3.0.3.x / 3.0.4.x; default store; PHP 7.4–8.3 as supported by the store.

1. InstallBack up the store, then open Extensions → Installer and upload the .ocmod.zip package.
2. ConfigureOpen Extensions → Extensions → Payments. Install NeroPay API v2, then open Edit.
3. ReviewEnter the receiving account ID and API v2 secret. Choose an unpaid Pending status and a paid Processing / Complete status.
4. VerifyConfigure the recovery schedule shown on the settings page. Enable real payments only after acceptance testing.
Scope: Not an OpenCart 4 package. Default store only; recurring profiles are not supported. Custom one-page checkout modules need separate testing.
Validation status: local API-contract and payment-lifecycle checks are included in the release validation, but these packages have not completed full installation and live payment acceptance tests on native stores. Use staging first; this is not a production-certification claim.
Direct install · Pilot release RC1

NeroPay for PrestaShop

Hosted checkout with server-side payment verification and missed-notification recovery. Marketplace installation is not required.

Target environment

PrestaShop 8.x / 9.x API target; single shop; single-package carts; platform-compatible PHP 7.4–8.3.

1. InstallBack up the shop. Open Modules → Module Manager → Upload a module, then select this ZIP.
2. ConfigureConfigure NeroPay API v2 in Module Manager. Enter the receiving account ID and API v2 secret.
3. ReviewReview payment currency, customer-group, country and carrier restrictions. Configure the recovery schedule displayed by the module.
4. VerifyComplete acceptance tests before enabling real payments. Checkout creates an unpaid order before redirecting.
Scope: Single-shop only. Split-shipment / multi-package carts are blocked. The module is configured in Module Manager even if it is not listed in the marketplace payment catalogue.
Validation status: local API-contract and payment-lifecycle checks are included in the release validation, but these packages have not completed full installation and live payment acceptance tests on native stores. Use staging first; this is not a production-certification claim.
Direct install · Pilot release RC1

NeroPay for WHMCS

Hosted checkout with server-side payment verification and missed-notification recovery. Marketplace installation is not required.

Target environment

Self-hosted WHMCS 8.x / 9.x gateway API target; PHP 7.4–8.3 as supported by the installed WHMCS version.

1. InstallExtract the ZIP and upload its modules and includes directories into the WHMCS installation root. Preserve existing files.
2. ConfigureOpen System Settings → Payment Gateways and activate NeroPay API v2.
3. ReviewEnter the receiving account ID and API v2 secret. Do not enable WHMCS gateway currency conversion for this release.
4. VerifyKeep the standard WHMCS cron running. Customers must sign in as the invoice owner; an unpaid invoice must use NeroPay as its payment method.
Scope: Pays the current invoice balance. No stored-card capture, automatic recurring debit or automatic refund operation. Invoice changes after checkout creation require manual review; the connector will not create a second link.
Validation status: local API-contract and payment-lifecycle checks are included in the release validation, but these packages have not completed full installation and live payment acceptance tests on native stores. Use staging first; this is not a production-certification claim.
Direct install · Pilot release RC1

NeroPay for Magento 2 / Adobe Commerce

Hosted checkout with server-side payment verification and missed-notification recovery. Marketplace installation is not required.

Target environment

Magento Open Source / Adobe Commerce 2.4.x API target; standard Magento checkout; PHP 8.1–8.3 subject to the platform version.

1. InstallBack up the site and database, then extract app/code/NeroPay/Payments into the Magento root in a development/staging environment.
2. ConfigureRun the Magento module enable and setup commands below as the Magento filesystem owner, not as root.
3. ReviewOpen Stores → Configuration → Sales → Payment Methods → NeroPay API v2. Enter the receiving account ID and API v2 secret.
4. VerifyKeep Magento cron running. Order currency must equal the website base currency, and must be GBP, EUR or USD.
Scope: Standard Knockout/Luma-style checkout only. Hyvä Checkout, PWA/GraphQL, express checkout and custom checkout implementations are not included. No vault, automatic refunds or recurring billing.
Validation status: local API-contract and payment-lifecycle checks are included in the release validation, but these packages have not completed full installation and live payment acceptance tests on native stores. Use staging first; this is not a production-certification claim.

Authentication

Subscription writes: /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.
New management writes: NeroConnect Management & Partners uses a method/path/idempotency-bound HMAC message, not the legacy timestamp.body format. Follow that section's signing and durable retry examples when calling /v2/neroconnect/management/*.

API v2 uses bearer authentication. Unsafe methods also require a timestamped HMAC signature and an idempotency key.

HeaderTypeRequiredDescription
AuthorizationstringRequiredBearer {secret_key}.
AcceptstringRequiredAlways application/json.
Content-TypestringRequiredUse application/json for JSON writes or multipart/form-data for file upload endpoints.
X-NeroPay-Timestampunix timestampRequiredRequired for POST/PATCH/PUT/DELETE.
X-NeroPay-SignaturestringRequiredHMAC SHA-256 of timestamp.raw_body using the secret key.
Idempotency-KeystringRequiredRequired for writes that create or mutate state.
Never expose secret keys in browser code. Use server-side calls for signed writes.

Headers

Headers control JSON responses, connected account scoping, public/client key context and retry safety.

HeaderTypeRequiredDescription
NeroPay-AccountstringOptionalConnected account ID such as NPVesdTGASO23_547878. Platforms use it to act on a connected merchant.
X-NeroPay-Client-KeystringOptionalDashboard-visible account client key. If supplied, it must match the authenticated merchant or the NeroPay-Account connected account id.
X-NeroPay-Public-KeystringOptionalPublic key from API credentials.
Idempotency-KeystringRequiredUnique 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.

QueryTypeDefaultDescription
pageinteger1Page number.
per_pageinteger25Number of records per page.
q/searchstring—Search by supported columns.
statusenum—Filter by status where supported.
from / todate/datetime—Filter by created date where supported.
sortstring-idUse 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.

HTTPCodeMeaning
400bad_requestMalformed request.
400missing_idempotency_keyA required Idempotency-Key header is missing.
401unauthenticatedMissing or invalid API key.
401invalid_signatureWrite request signature verification failed.
403forbiddenThe authenticated account cannot access the resource.
404endpoint_not_found / not_foundRoute or object was not found.
405resource_read_onlyResource exists but the requested write method is not enabled.
409idempotency_conflictThe same idempotency key was reused with a different body.
409connected_account_duplicateA connected account with the same email or username already exists.
409duplicate_resourceA resource with the same unique fields already exists for this account.
422validation_errorInvalid fields.
429rate_limitedToo many requests.
500resource_scope_misconfiguredThe resource is not safely account-scoped on this installation.

Authentication and account scope errors

HTTPCodeMeaning
401missing_credentialsNo secret key was supplied.
401invalid_credentialsThe secret key was not recognised.
401account_key_mismatchThe supplied public key, client key or account id does not match the authenticated account context.
401invalid_signatureThe HMAC signature is missing, malformed or invalid.
403account_not_allowedThe authenticated account cannot access the supplied connected account.
403account_inactiveThe merchant account is not active.
403neroconnect_not_enabledNeroConnect platform access is not enabled for this account.
404account_not_foundThe connected account id was not found for this platform.
422invalid_account_idUse the full NeroPay account id format, for example NPVesdTGASO23_547878.

Connected account errors

HTTPCodeMeaning
409connected_account_duplicateA connected account with the same email or username already exists.
422connected_account_create_failedThe connected account could not be created.
422invalid_idempotency_keyThe supplied idempotency key has an invalid format.
409duplicate_requestA request with the same idempotency key is still being processed.

Payment and transaction errors

HTTPCodeMeaning
403account_bannedThe account cannot process the requested operation.
403payments_pausedThe account cannot accept payments right now.
422currency_not_supportedThe requested currency is not enabled or supported.
422invalid_connect_application_feeThe platform fee is invalid or exceeds the transaction amount.
422not_cancelableThe transaction can no longer be cancelled.
422not_refundableThe transaction is not eligible for refund.
422invalid_refund_amountThe refund amount must be greater than zero.
422refund_exceeds_transactionThe requested refund exceeds the original transaction amount.
422insufficient_balanceThe wallet balance is not enough to complete the operation.
422provider_reference_missingThe provider payment reference is missing.
422cancel_failed / refund_failedThe cancellation or refund could not be processed.

NeroTrade errors

HTTPCodeMeaning
402nerotrade_subscription_requiredNeroTrade is not active for this account. Activate the NeroTrade plan before calling NeroTrade endpoints.
404endpoint_not_foundThe requested NeroTrade API path under https://eu.neropay.app/v2/nerotrade was not found.
404unknown_nerotrade_resourceThe requested NeroTrade resource name is not recognised.
404resource_unavailableThe requested NeroTrade table or resource is not available on this installation.
404not_foundThe requested NeroTrade record was not found for this merchant.
404customer_not_foundThe trade account supplied for an invoice, delivery, payment or statement could not be found.
404invoice_not_foundThe invoice supplied for a payment could not be found.
405use_productsInventory records should be created as products first, then stock can be updated through the inventory endpoint.
422empty_payloadNo writable NeroTrade fields were supplied for an update request.
422validation_errorA required field is missing or a supplied field is invalid.
503nerotrade_schema_missingNeroTrade database tables are not installed or the NeroTrade SQL update has not been applied.

Terminal errors

HTTPCodeMeaning
404location_not_foundThe location was not found for this account.
422location_requiredA location id is required.
422location_bridge_missingThe location is not ready for terminal reader registration.
409reader_already_registeredThe location already has a linked reader.
422reader_limit_reachedThe account has reached its reader limit.
422invalid_registration_codeThe reader registration code is missing or invalid.
404reader_not_foundThe reader does not belong to this account.
422reader_register_failedThe reader could not be registered.
422terminal_payment_failedThe terminal payment could not be created.
422reader_cancel_failedThe reader action could not be cancelled.
500provider_not_configuredThe NeroPay payment bridge is not configured.

Payout and NeroDisburse errors

HTTPCodeMeaning
403payouts_pausedTransfers are paused for this account.
403kyc_requiredKYC verification is required before transfers.
404bank_account_not_foundThe bank account was not found for this merchant.
422bank_account_requiredA bank account id is required.
422bank_account_disabledThe bank account is disabled.
409duplicate_bank_accountThe bank account is already linked to this merchant.
422bank_account_create_failedThe bank account could not be created.
404payout_not_foundThe payout was not found for this account.

Idempotency

Subscriptions: completed writes replay their saved response. Preserve the same key and data after an uncertain result, and refresh the signature. See subscription retries and limits for key scope and review requirements.

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.

GET/account

Returns the authenticated merchant or the connected merchant when NeroPay-Account is supplied.

GET/connected-accounts

Lists connected merchants for a NeroConnect platform.

GET response attributes

AttributeTypeRequiredDescription
account_idstringRead-onlyPublic API account ID.
business_company_namestringOptionalCompany or trading name.
emailstringRequiredPrimary merchant email.
statusenumRead-onlyactive, pending, banned or review state.
kyc_statusenumRead-onlypending, verified or rejected.
neroconnect_email_sms_handleenumOptionalneropay or platform. Controls merchant-facing notification delegation.
neroconnectobjectRead-onlyReturned for NeroConnect platform responses. Includes fee payer, platform safety limit, merchant pricing and default connect application fee context.
neroconnect.fee_payerenumRead-onlyconnected_account or platform. Controls where NeroPay processing fees are charged for connected account payments.
neroconnect.platform_safety_limitobject|nullRead-onlyReturned when the fee payer is platform balance. null when the connected account pays NeroPay processing fees.
neroconnect.merchant_pricingobjectRead-onlyShows 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.
POST/connected-accounts

Creates 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

FieldTypeRequiredDescription
business_company_namestringRequiredCompany or trading name for the connected merchant.
firstnamestringRequiredAuthorised representative first name.
lastnamestringRequiredAuthorised representative last name.
emailemailRequiredPrimary email for the connected merchant.
country_codeenumRequiredSupported NeroPay country code such as GB. Must be selected from the supported-country list, not typed freely.
mobile_codestringRequiredDial code for the selected country, for example 44 for GB. Should be supplied from the supported-country list.
mobilestringRequiredRepresentative or merchant contact mobile number.
business_typeenumRequiredBusiness structure such as company, individual or sole_trader where supported.
nationalityenumRequiredRepresentative nationality country code from the supported-country list.
company_registration_numberstringRequired for companiesCompany registration number where the business type requires it.
representative_job_titlestringRequiredRole/title of the authorised representative, for example Director.
rep_is_directorbooleanRequiredConfirms whether the representative is a company director.
rep_is_executivebooleanRequiredConfirms whether the representative is an executive/control person.
rep_is_ownerbooleanRequiredConfirms whether the representative is an owner.
rep_ownership_percentnumberRequired when ownerOwnership percentage, for example 100.
company_declarationbooleanRequiredConfirms the company declaration has been accepted.
addressstringRequiredRegistered or trading address line.
citystringRequiredCity/town.
postcodestringRequiredPostcode.
dobdateRequiredRepresentative date of birth in YYYY-MM-DD format.
industrystringRequiredIndustry/MCC-style code accepted by NeroPay onboarding.
merchant_website_or_product_descriptiontextRequiredWebsite URL or clear description of the products/services sold.
terms_acceptedbooleanRequiredMust be true. API-created connected accounts are not created without terms acceptance.
terms_accepted_atdatetimeRequiredTime the connected merchant/authorised person accepted the terms.
terms_ipipRequiredIP address captured when terms were accepted.
legal_namestringRequiredAuthorised legal name used to generate the stored electronic signature when a PNG signature is not supplied.
signature_png_base64string|nullOptionalBase64 PNG signature. If omitted, NeroPay stores a generated typed-signature image from legal_name.
neroconnect_email_sms_handleenumOptionalneropay or platform. Controls who handles merchant-facing email/SMS communication.
metadataobjectOptionalPlatform reference data, external IDs or onboarding notes.
Activation reminder: creating a connected account does not complete onboarding. After creation, create an Identity verification link through the NeroPay API, ensure the merchant adds a business bank account, monitor KYC/compliance webhooks and use the Compliance Proof API for proof or document requests before treating the account as fully ready.
Legal acceptance is required: API-created connected accounts must include terms acceptance and an authorised legal name or signature. If terms_accepted is not true, or the legal acceptance data is missing, the account is not created.
Owner and director validation: when 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.
GET/connected-accounts/{account_id}

Retrieves one connected merchant.

PATCH/connected-accounts/{account_id}

Updates connected account fields and can trigger account.update webhooks.

PATCH /connected-accounts request attributes

FieldTypeRequiredDescription
business_company_namestringOptionalUpdates the connected merchant company/trading name.
mobilestringOptionalUpdates the connected merchant mobile number where allowed.
neroconnect_email_sms_handleenumOptionalneropay or platform.
neroconnect_statusenumOptionalDashboard/API operational status such as active, paused or review where enabled.
metadataobjectOptionalPlatform 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.

ConceptTypeDescription
Connected account IDstringFormat is unique_account_id + underscore + merchant_id.
NeroPay-Account headerstringScopes API calls to a connected merchant.
Notification handlingenumneropay means NeroPay sends email/SMS; platform means platform handles merchant-facing notifications from webhooks.
KYC, bank & complianceworkflowMust 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.
Activation reminder: connected accounts should not be treated as fully ready until KYC identity verification, business bank account setup, compliance requests and reserve/proof checks are clear. Partners can create identity verification links through the NeroPay API and should use the compliance proof endpoints whenever NeroPay requests supporting evidence.

Fee payer and pricing context

ModeNeroPay processing fee payerPlatform safety limitNotes
connected_accountThe 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.
platformThe 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.
Important: NeroPay fee payer is separate from 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.
Response compatibility: This is an additive v2 response update. Existing requests do not need a new required parameter. Integrations should safely ignore unknown fields.
Duplicate protection: 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.

GET/neroconnect/settings

Returns notification handling, merchant-facing pricing defaults, reward programme configuration, payout-limit defaults and read-only NeroPay cost context.

PATCH/neroconnect/settings

Updates allow-listed platform defaults. Partial updates are supported.

GET/neroconnect/accounts

Lists only connected accounts assigned to the authenticated NeroConnect platform.

GET/neroconnect/accounts/{account_id}

Returns one assigned connected account and its selected, NeroPay hard-cap and effective payout limits.

GET/neroconnect/reports/overview

Returns account counts and transaction totals for the platform’s own connected merchants.

Security boundary: platform API keys cannot query arbitrary merchant IDs. Account ownership is resolved server-side. NeroPay processing costs and fee-payer responsibility are read-only. Payout defaults can only tighten connected-account behaviour; the effective values never exceed the limits set by NeroPay Admin for that merchant.
Reward scope: API v2 can enable the connected-account reward programme and set its public name. Reward catalogue create, edit, pause and remove operations remain dashboard-only to keep the public write surface small.

PATCH /neroconnect/settings attributes

FieldTypeRequiredDescription
notification_handleenumOptionalneropay or platform.
pricing_defaults.{channel}.fixeddecimalOptionalFixed merchant-facing default. Channels: api, card, manual_keyed, application_fee, sms, card_origin, extra_payment_method, instant_payout, transaction_refund.
pricing_defaults.{channel}.percentdecimalOptionalPercentage default, 0–100. Available for API, card, manual keyed, application fee, card origin, extra payment method and instant payout channels.
rewards.enabledbooleanOptionalShows or hides the platform reward programme for connected accounts.
rewards.namestringOptionalPublic programme name, 1–120 characters.
payout_limit_defaults.*decimal/integerOptionalSupported 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.

Card orders: continue using 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

NeedUse
Commission on a card saleExisting payment creation with connect_application_fee; automatic existing settlement.
Track commissionGET /commissions or GET /commissions/{transaction_id}.
Cash-order service feeSet signup pricing once, then POST /usage-events after merchant registration.
Move an agreed amount between parent and partnerExisting /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:

Example
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:

FieldMeaning
currencyGBP.
fixed_minorInteger pence per completed cash order, 0–100000.
percent_bpsInteger basis points, 0–5000; 500 means 5%.
max_order_fee_minorPer-order cap, 1–100000 pence; must cover the fixed fee.
daily_cap_minorMaximum new fees recorded per shop per application-calendar day, 1–1000000 pence. Applies across agreement versions; cancellation does not replenish the cap.
collection_intervaldaily or weekly. A recorded order becomes due after one or seven days.
terms_referenceYour 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.

Parent allocation: the existing partner registration acceptance is retained. Revenue-share terms continue to apply. For the Rate Model, the parent must configure a Cash order service fees rate through existing partner pricing controls; changing that pricing does not require a second partner signup.

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:

StateMeaning
pendingDue fees grouped; waiting for the scheduler or eligible funds.
reservedLocal balance reserved; provider collection awaits confirmation.
collectedProvider confirmed collection; allocation is still pending.
settledRequired transfers confirmed and partner income recorded. This does not mean a bank payout has arrived.
reviewAn 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.

Authority: use the authenticated platform's own secret API key on your server. Never give it to sales agents or put it in browser/mobile code. Agent logins remain restricted panel memberships, not management API credentials. Parent controls and account moves require a main platform with NeroConnect Partner enabled; a second-tier partner cannot manage its parent, siblings or create a further tier. Child platforms can manage their own agents only when their active agreement, API, account and report policies permit it.

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.

Management signature input
timestamp + "\n" + UPPERCASE_METHOD + "\n" + PATH
          + "\n" + IDEMPOTENCY_KEY + "\n" + RAW_JSON_BODY

A 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.

Limits and safety: 60 requests/minute per IP before authentication, plus 60 reads or 20 writes/minute per platform. Maximum list page size 100; commission reports cover at most 31 calendar days. Ownership, merchant status, parent policies, KYC requirements, debt restrictions and version tokens are checked server-side. No client field can change identity verification, activate a partner, override NeroPay tariffs or choose a settlement account.

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.

Base path: /v2/neroconnect/management · Authentication & signed requests ↗

Reporting and access: all agent resources belong to the authenticated platform. Commission reports do not trigger payouts. Child platforms need the active agreement and applicable API, account and report permissions.

Sales agents

GET/sales-agents

Own platform profiles. Optional limit (1–100) and page (1–10000).

POST/sales-agents

Create 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.

PATCH/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.

PUT/accounts/{merchantId}/sales-agent

Assign 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.

GET/sales-agents/{agentId}/accounts

Only accounts currently assigned to this own-platform agent, with assignment IDs and rates. Optional limit, page.

GET/sales-agents/{agentId}/commission-report

Optional 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.

Base path: /v2/neroconnect/management · Authentication & signed requests ↗

Connected account moves

GET/account-moves

Eligible family platforms and source accounts. Optional integer source_id (defaults to the authenticated parent), q (max 100), page, channel (all, terminal, ecommerce, mixed).

POST/account-moves/preview

Required 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.

POST/account-moves/commit

Required 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.

Move consequences: merchant identity and transaction history remain the same. Historical ownership and commissions are retained. No wallet balance is transferred. Future payments use the destination platform. Update merchant websites/integrations to its API key; the previous platform key loses access. Destination keys are never returned by this API.

Partner controls

GET/partners

Parent-owned partners only. Optional limit, page, state (pending, active, suspended).

GET/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.

PATCH/partners/{partnerId}/pricing

Direct 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.

PUT/partners/{partnerId}/policies

Required current management_version plus a complete policies object. This replaces the permitted controls; it cannot bypass NeroPay's own restrictions.

POST/partners/{partnerId}/suspend

Required current management_version. Suspends an own partner without changing balances, historical commissions or KYC.

GET/partner-settings

Parent signup defaults, revision and existing signup status.

PUT/partner-settings

Required 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.

GET/partner-agreement

A 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

POST/partners/{partnerId}/funds

Parent-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.

GET/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.

No unfunded payouts: funding uses registered parent/partner settlement accounts only, never the payment service's operating account. The source wallet is reserved without overdraft; unrestricted available settlement funds must be collected and confirmed before the recipient transfer. Existing debt, reconciliation and policy safeguards still apply. Fees follow the server's existing parent tariff: send debits amount + fee and credits amount; pull debits amount and credits amount − fee. No API endpoint creates a balance, overrides a tariff, withdraws to arbitrary bank accounts or pays sales-agent commission automatically.

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.

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.

GET/neropay-store/products

Lists available NeroPay Store hardware product slugs and prices.

POST/neropay-store/checkout-links

Creates a hosted checkout link for the authenticated merchant or a connected account.

GET/neropay-store/orders/{id}

Reads a NeroPay Store order created for the authenticated account context.

Abuse prevention: the API never accepts custom card data or arbitrary item prices. Product slugs and prices are resolved server-side from the NeroPay Store catalogue. Use NeroPay-Account or account_id only for connected accounts assigned to your platform.

GET /neropay-store/products response attributes

FieldTypeDescription
slugstringStable catalogue slug used for ordering.
product_codestringOrdering code for API integrations. This is currently the same value as slug.
codestringShort alias for product_code.
namestringProduct name displayed on the hosted checkout.
pricedecimalServer-side NeroPay Store catalogue price. Resellers cannot override this in API requests.
categorystringHardware, terminal, EPOS, scale, printer or accessory grouping.
Product codes: call GET /neropay-store/products for the live catalogue. Send the returned product_code in items[].product_code. Current public codes are shown below.
product_codeNameCategoryBase priceOptional checkout options
pro-plusCard Terminal PRO+terminal£295.00None
ccd-tabletCard Terminal CCDterminal£135.00options.device: no_device, fire8, ipadair11
eposNeroPay EPOS Kitepos£799.95None
nerokioskNeroPay Self-Service Kioskkiosk£800.00options.size: 21_5, 23_6, 32; optional floor_standing, ads=ad_free
nerokdsNeroKDSkds£450.00options.size: 21_5, 24
pro-plus-charging-dockPRO+ Charging Dockaccessory£60.00None
ccd-charging-dockCCD Charging Dockaccessory£60.00None
chargerAdditional Chargeraccessory£20.00None
caller-id-unitNeroPay Caller ID Unitaccessory£110.00None
neroscale1NeroPay Manual Scaleaccessory£75.00None
neroscaleproNeroPay Barcode Scale Proaccessory£375.00None
neroscan1NeroPay Wireless 1D/2D Barcode Scanneraccessory£65.00None
neroscanproNeroPay Desktop Barcode Scanner Proaccessory£95.00None
nerominiNeroPay Mini Bluetooth Barcode Scanneraccessory£45.00None
receipt-printer-80mm80mm Thermal Receipt Printeraccessory£155.00options.connection: usb, lan, wifi, bluetooth
cash-drawer-rj11Cash Drawer Base with RJ11 Connectoraccessory£55.00None
thermal-paper-rollsThermal Paper Rollsaccessory£20.00options.pack: 5, 10, 20; options.roll_size: 58x58, 80x80

POST /neropay-store/checkout-links attributes

FieldTypeRequiredDescription
account_idstringPlatform onlyConnected merchant account. You may also send NeroPay-Account.
items[].product_codestringRequired*Product code returned by GET /neropay-store/products. You may send items[].slug or items[].code instead.
items[].slugstringAliasCatalogue slug returned by the products endpoint.
items[].quantityintegerOptionalQuantity, 1 to 99. Defaults to 1.
billingobjectRequiredBilling contact and billing address. Required keys: name, email, phone, line1, city, postcode, country. Optional keys: line2, county.
shippingobjectRequiredDelivery contact and shipping address. Required keys: name, phone, line1, city, postcode, country. Optional keys: email, line2, county.
referencestringOptionalYour reseller/order reference stored in metadata.
Required address details: checkout-link requests are rejected unless both billing and shipping are supplied. NeroPay Store API v2 does not fall back to the merchant profile address for hardware checkout links.
Order scope: 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.

POST/hosted-payments

Creates a hosted checkout URL for an order or invoice.

POST/payment-links

Creates a simple LinkPay checkout link when you only need a payment URL.

POST/terminal/payments

Sends an in-person card-present payment action to a terminal reader.

POST payment request attributes

FieldTypeRequiredDescription
identifierstringRequiredYour unique order, invoice or checkout reference.
amountdecimalRequiredPayment amount in major units, e.g. 15.99.
currencyenumRequiredCurrency such as GBP or EUR.
detailstextRequiredCustomer-facing or internal checkout description.
ipn_urlurlRequiredReceives hosted-payment outcome updates, including a declined attempt and a later success. The initial API response is not proof of payment.
success_urlurlRequiredWhere the customer is returned after a successful payment.
cancel_urlurlRequiredWhere the customer is returned after cancellation.
customer_namestringRequiredCustomer name shown on the checkout record.
customer_emailemailRequiredCustomer email shown on the checkout record.
customer_phonestringOptionalCustomer phone number, if collected.
account_idstringPlatform onlyConnected merchant account for NeroConnect routing. You may also send the NeroPay-Account header.
connect_application_feedecimalOptionalPlatform fee charged for a connected account payment.
metadataobjectOptionalAdditional key/value data returned in responses and webhooks where supported.
Use hosted checkout by default: do not send card number, CVC, expiry date or cardholder payment details to the API. NeroPay-hosted checkout keeps sensitive card data outside your server.
NeroConnect routing: when a platform API key creates a checkout for a connected merchant, send NeroPay-Account or account_id with that connected merchant account on every request.
Hosted checkout is the recommended online payment flow: direct card payment creation is not part of the public API. Use /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

FieldTypeDescription
statusenumfailed for an unsuccessful payment attempt. A later success notification may follow for the same checkout.
identifierstringYour original order or invoice identifier.
signaturestringUppercase HMAC-SHA256 of amount + identifier using the merchant secret API key.
error.codestringStable machine-readable category, such as card_declined or payment_failed.
error.messagestringProvider-neutral support message safe to display or log.
error.decline_codestringOptional more specific decline reason, such as insufficient_funds.
dataobjectPayment reference, status, amount, customer, currency and a repeated error object for existing IPN consumers.
IPN transport: hosted-payment IPNs use 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.
Registered webhooks: platforms using the reusable Webhooks API must subscribe to both transaction.succeeded and transaction.failed. This is separate from the per-payment ipn_url.
A failed attempt is not necessarily the final order outcome.

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 updateOrder handling
Initial API request accepted / pendingSave the reference and checkout URL. Do not mark the order as paid or print a paid order.
Declined attempt / failedRecord 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 failureUpdate 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 successAcknowledge the delivery without repeating fulfilment. Never change an already-paid order back to failed because of a payment-attempt event. Refunds are separate events.
Delivery and verification: callbacks can be retried and can arrive out of order. Verify the applicable signature, save the event durably, then return HTTP 2xx promptly. Process printing and other slow work asynchronously. For registered JSON webhooks, verify the timestamp and HMAC against the unmodified body; use 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.
Important distinction: the per-payment form IPN uses 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.
Contracts

Contracts API

Create merchant contracts, store contract rules, require full or deposit payments and send customers to a secure NeroPay contract review page.

GET/contracts

Lists contracts for the authenticated merchant or connected merchant when NeroPay-Account is supplied.

POST/contracts

Creates a contract with customer details, formatted content, signature rules and optional full or upfront payment.

GET/contracts/{id}

Retrieves one contract by internal ID or public contract reference where supported.

PATCH/contracts/{id}

Updates contract fields, customer details, signature rules, status or payment settings.

DELETE/contracts/{id}

Deletes an unpaid draft/sent contract where the merchant account is allowed to do so.

POST/contracts/{id}/payment-link

Creates a secure NeroPay checkout link for the required contract payment.

GET/contracts/{id}/form

Returns the contract intake/customer form definition.

GET/contracts/{id}/form-submissions

Lists customer form submissions for the scoped contract.

POST/contracts/{id}/form-submissions

Stores a validated form submission against the scoped contract.

GET /contracts query attributes

FieldTypeRequiredDescription
statusenumOptionalFilter by draft, sent, signed, completed, cancelled or expired.
payment_statusenumOptionalFilter by not_required, unpaid, partially_paid, paid or failed.
qstringOptionalSearch contract reference, title, customer name or customer email.
pageintegerOptionalPagination page number.
per_pageintegerOptionalItems per page. Keep this sensible for dashboard performance.

GET /contracts response attributes

FieldTypeDescription
idintegerInternal contract ID.
contract_refstringMerchant-facing reference such as CTR-260612-ABC123.
public_urlurlSecure customer review/sign/payment page.
title, summary, content_htmlstring/htmlContract title, customer-facing summary and formatted contract content.
customer_* fieldsstringCustomer name, email, phone and address snapshot.
contract_amountdecimalTotal contract value.
payment_amountdecimalAmount due now if online payment is required.
statusenumCurrent lifecycle status.
payment_statusenumCurrent payment status.
signature_requiredbooleanWhether the customer must provide an electronic signature.
signed_atdatetimeSet when the customer signs/accepts the contract.
cc_emailsarrayOptional CC recipients used for contract communications.
fee_itemsarrayOptional fee breakdown shown in the contract summary.
intake_formobjectCustomer form definition, including enabled status and field list.
intake_form_submissions_countintegerNumber of saved form submissions for this contract.

POST /contracts request attributes

FieldTypeRequiredDescription
titlestringRequiredContract title shown to the customer.
customer_namestringRequiredCustomer or business name.
customer_emailemailRequiredCustomer email address used for send/resend.
customer_phonestringOptionalCustomer phone number.
customer_addressstringOptionalBilling/service address snapshot.
currencyenumRequiredCurrency code such as GBP or EUR. You may also send currency_id.
contract_amountdecimalOptionalTotal contract value. Required if payment_mode=full.
show_contract_amountbooleanOptionalControls whether the total amount is shown in the public summary. If payment is required, the amount due now is always shown.
payment_requiredbooleanOptionalWhen true, the public contract page can show a Pay button.
payment_modeenumOptionalnone, full, deposit or custom. full collects the contract amount; deposit/custom collects deposit_amount.
deposit_amountdecimalOptionalUpfront amount due now when using deposit or custom.
signature_requiredbooleanOptionalRequire customer electronic signature before the contract is treated as signed.
customer_details_editablebooleanOptionalAllow the customer to correct their name, email, phone or address before signing.
content_htmlhtmlRequiredMain contract body. Script tags and inline event handlers are removed server-side.
summarystringOptionalShort customer-facing summary for the contract list and email.
cc_emails[]email[]OptionalUp to five CC recipients. Customer email is not duplicated.
fee_items[]arrayOptionalUp to eight fee rows with label, fee_type, amount and notes.
intake_form.enabledbooleanOptionalEnable customer form before signing.
intake_form.fields[]arrayOptionalUp to 20 questions. Types: text, date, textarea, dropdown, radio, checkbox.
intake_form.fields[].conditionobjectOptionalOptional show/hide rule using field, operator, value and action.
expires_atdatetimeOptionalOptional expiry date/time for the public review link.
send_emailbooleanOptionalSend the contract email immediately after saving. Resend is rate-limited.
account_idstringPlatform onlyConnected merchant account for NeroConnect routing. You may also send the NeroPay-Account header.

PATCH /contracts/{id} request attributes

FieldTypeDescription
title, summary, content_htmlstring/htmlUpdate contract content while the contract is not completed/cancelled.
customer_name, customer_email, customer_phone, customer_addressstringUpdate customer details snapshot.
contract_amount, payment_required, payment_mode, deposit_amountdecimal/boolean/enumUpdate payment rules. Paid contracts cannot be changed in a way that breaks payment history.
signature_required, customer_details_editable, show_contract_amountbooleanUpdate customer signing and display rules.
statusenumdraft, sent, signed, completed, cancelled or expired.

Contract form endpoints

EndpointPurposeSecurity
GET /contracts/{id}/formRead the public/customer form definition for a scoped contract.Account-scoped; other merchants’ contracts return contract_not_found.
GET /contracts/{id}/form-submissionsRead saved customer form submissions.Account-scoped and never searchable across all merchants.
POST /contracts/{id}/form-submissionsSave answers against the contract form using an answers object keyed by field key.Requires signed write security and validates required/conditional fields server-side.
Contract form safety: form fields are stored inside the contract 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

FieldTypeRequiredDescription
success_urlurlOptionalWhere the customer is returned after payment. Defaults to the public contract page.
cancel_urlurlOptionalWhere the customer is returned after cancelling checkout.
metadataobjectOptionalExtra reference data stored against the payment request.
Payment routing: when a contract requires payment, 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.
HTML safety: send formatted HTML from your own editor, but never include scripts, external trackers or card data. The API sanitises unsafe HTML before it is shown to customers.
NeroGYM

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.

Security model: every request is scoped to the authenticated merchant. Platform/reseller keys must use NeroPay-Account or account_id for an allowed connected merchant only. Write calls require HMAC signing and an Idempotency-Key.
GET/nerogym/overview

Returns dashboard-safe totals and recent activity for the scoped gym account.

GET /nerogym/overview query attributes

FieldTypeRequiredDescription
account_idstringPlatform onlyConnected merchant account. You may also send NeroPay-Account.
date_from / date_todateOptionalOptional reporting window for revenue, attendance and session counts.

GET /nerogym/overview response attributes

FieldTypeDescription
account_idstringScoped merchant account.
settings_enabledbooleanWhether NeroGYM is enabled for the merchant.
stats.clientsintegerTotal active/known clients.
stats.membershipsintegerActive membership count.
stats.sessionsintegerSessions in the selected period.
stats.classesintegerClasses in the selected period.
stats.checkinsintegerCheck-ins in the selected period.
stats.revenuedecimalPayment records total for the selected period.
recent_activity[]arrayRecent sessions, check-ins or payments with safe public fields.
NeroGYM

Settings

Read and update safe NeroGYM portal, billing and booking settings for a merchant.

GET/nerogym/settings

Reads NeroGYM settings.

PATCH/nerogym/settings

Updates supported settings only.

GET /nerogym/settings query attributes

FieldTypeRequiredDescription
account_idstringPlatform onlyConnected merchant account. You may also send NeroPay-Account.

GET /nerogym/settings response attributes

FieldTypeDescription
enabledbooleanNeroGYM feature status.
portal_urlurlMerchant public NeroGYM portal URL.
booking_enabledbooleanAllows clients to book available sessions/classes online.
member_portal_enabledbooleanAllows member portal access.
parq_requiredbooleanWhether PAR-Q/health form is required during onboarding.
currencystringCurrency used for plans and payment records.
timezonestringTimezone used for calendar/session rendering.

PATCH /nerogym/settings request attributes

FieldTypeRequiredDescription
account_idstringPlatform onlyConnected merchant account. You may also send NeroPay-Account.
enabledbooleanOptionalEnable or disable NeroGYM.
booking_enabledbooleanOptionalEnable online booking.
member_portal_enabledbooleanOptionalEnable member portal access.
parq_requiredbooleanOptionalRequire health/PAR-Q form before training.
timezonestringOptionalIANA timezone, for example Europe/London.
NeroGYM

Clients

Create and manage gym clients. Client IDs are always scoped to the authenticated merchant.

GET/nerogym/clients

Lists clients.

GET/nerogym/clients/{id}

Retrieves one client.

POST/nerogym/clients

Creates a client.

PATCH/nerogym/clients/{id}

Updates a client.

DELETE/nerogym/clients/{id}

Deletes or deactivates a client where allowed.

GET /nerogym/clients query attributes

FieldTypeRequiredDescription
account_idstringPlatform onlyConnected merchant account.
qstringOptionalSearch name, email or phone.
statusenumOptionalFilter by active, inactive, blocked or local configured status.
page / per_pageintegerOptionalPagination controls.

GET /nerogym/clients response attributes

FieldTypeDescription
idintegerClient ID.
namestringClient full name.
emailemailClient email address.
phonestringClient phone number.
statusenumCurrent client status.
notestextInternal notes where available.
created_at, updated_atdatetimeRecord timestamps.

POST /nerogym/clients request attributes

FieldTypeRequiredDescription
namestringRequiredClient full name.
emailemailOptionalUnique email for this merchant where provided.
phonestringOptionalClient phone number.
statusenumOptionalDefaults to active.
notestextOptionalInternal client note.

PATCH /nerogym/clients/{id} request attributes

FieldTypeDescription
name, email, phone, status, notesmixedOnly supplied fields are updated. Client must belong to the scoped merchant.

DELETE /nerogym/clients/{id} response attributes

FieldTypeDescription
deletedbooleanTrue when the record was deleted/deactivated.
NeroGYM

Plans

Create and maintain membership packages, one-off session packs and public plan terms.

GET/nerogym/plans

Lists plans.

GET/nerogym/plans/{id}

Retrieves one plan.

POST/nerogym/plans

Creates a plan.

PATCH/nerogym/plans/{id}

Updates a plan.

DELETE/nerogym/plans/{id}

Deletes/deactivates a plan where no active dependencies block removal.

GET /nerogym/plans query attributes

FieldTypeRequiredDescription
qstringOptionalSearch plan name.
statusenumOptionalFilter active/inactive plans.
page / per_pageintegerOptionalPagination controls.

GET /nerogym/plans response attributes

FieldTypeDescription
idintegerPlan ID.
namestringPlan name.
pricedecimalPlan price.
billing_cycleenummonthly, weekly, one_off or local cycle.
session_limitinteger/nullIncluded session limit if configured.
general_termshtml/textCustomer-facing plan terms.
statusenumPlan status.

POST /nerogym/plans request attributes

FieldTypeRequiredDescription
namestringRequiredPlan name.
pricedecimalRequiredPlan price, server validated as a non-negative amount.
billing_cycleenumRequiredmonthly, weekly, one_off or supported cycle.
session_limitintegerOptionalIncluded session allowance.
general_termstext/htmlOptionalPlan terms shown to customers before checkout/acceptance.
statusenumOptionalDefaults to active.

PATCH /nerogym/plans/{id} request attributes

FieldTypeDescription
name, price, billing_cycle, session_limit, general_terms, statusmixedOnly supplied fields are updated. Plan must belong to the scoped merchant.
NeroGYM

Memberships

Link clients to plans and manage membership lifecycle. Cross-merchant client_id or plan_id values are rejected.

GET/nerogym/memberships

Lists memberships.

GET/nerogym/memberships/{id}

Retrieves one membership.

POST/nerogym/memberships

Creates a membership.

PATCH/nerogym/memberships/{id}

Updates a membership.

DELETE/nerogym/memberships/{id}

Cancels/deletes a membership where allowed.

GET /nerogym/memberships query attributes

FieldTypeRequiredDescription
client_idintegerOptionalFilter by client belonging to the scoped merchant.
plan_idintegerOptionalFilter by plan belonging to the scoped merchant.
statusenumOptionalactive, paused, cancelled, expired or local status.
page / per_pageintegerOptionalPagination controls.

GET /nerogym/memberships response attributes

FieldTypeDescription
idintegerMembership ID.
client_id, clientinteger/objectLinked client ID and safe client summary.
plan_id, planinteger/objectLinked plan ID and safe plan summary.
statusenumMembership status.
starts_at, ends_atdateMembership date range.
next_payment_atdate/nullNext expected payment date when used.

POST /nerogym/memberships request attributes

FieldTypeRequiredDescription
client_idintegerRequiredClient ID from the same scoped merchant.
plan_idintegerRequiredPlan ID from the same scoped merchant.
statusenumOptionalDefaults to active.
starts_atdateRequiredMembership start date.
ends_atdateOptionalMembership end date.
next_payment_atdateOptionalNext expected billing/payment date.

PATCH /nerogym/memberships/{id} request attributes

FieldTypeDescription
plan_id, status, starts_at, ends_at, next_payment_atmixedOnly supplied fields are updated. Linked IDs must belong to the same merchant.
NeroGYM

Sessions & classes

Manage one-to-one sessions and group classes. Staff and client references are validated against the scoped merchant.

GET/nerogym/sessions

Lists PT sessions.

POST/nerogym/sessions

Creates a PT session.

PATCH/nerogym/sessions/{id}

Updates a PT session.

DELETE/nerogym/sessions/{id}

Deletes/cancels a session where allowed.

GET/nerogym/classes

Lists group classes.

POST/nerogym/classes

Creates a group class.

PATCH/nerogym/classes/{id}

Updates a group class.

DELETE/nerogym/classes/{id}

Deletes/cancels a class where allowed.

GET /nerogym/sessions or /classes query attributes

FieldTypeRequiredDescription
client_idintegerSessions optionalFilter sessions by client. ID must belong to the scoped merchant.
staff_idintegerOptionalFilter by trainer/staff member.
date_from / date_todateOptionalCalendar window filter.
statusenumOptionalscheduled, completed, cancelled or local status.

GET response attributes

FieldTypeDescription
idintegerSession/class ID.
namestringClass name or generated session title.
client_idinteger/nullClient for PT sessions.
staff_idinteger/nullAssigned trainer/staff member.
starts_atdatetimeStart date/time.
duration_minutesintegerDuration in minutes.
capacityinteger/nullClass capacity where applicable.
statusenumCurrent status.

POST /nerogym/sessions request attributes

FieldTypeRequiredDescription
client_idintegerRequiredClient ID from the scoped merchant.
staff_idintegerOptionalTrainer/staff ID from the scoped merchant.
starts_atdatetimeRequiredSession start date/time.
duration_minutesintegerOptionalDefaults to merchant/session setting.
statusenumOptionalDefaults to scheduled.

POST /nerogym/classes request attributes

FieldTypeRequiredDescription
namestringRequiredClass name.
staff_idintegerOptionalTrainer/staff ID from the scoped merchant.
starts_atdatetimeRequiredClass start date/time.
duration_minutesintegerOptionalClass duration.
capacityintegerOptionalMax attendees.
statusenumOptionalDefaults to scheduled/active.

PATCH /nerogym/sessions/{id} or /classes/{id} request attributes

FieldTypeDescription
client_id, staff_id, name, starts_at, duration_minutes, capacity, statusmixedOnly supplied fields are updated. Linked IDs must belong to the same merchant.
NeroGYM

Staff & programmes

Manage trainers/staff records and client training programmes. The API accepts both programmes and programs as resource aliases.

GET/nerogym/staff

Lists gym staff.

POST/nerogym/staff

Creates gym staff.

PATCH/nerogym/staff/{id}

Updates gym staff.

DELETE/nerogym/staff/{id}

Deletes/deactivates gym staff where allowed.

GET/nerogym/programmes

Lists training programmes.

POST/nerogym/programmes

Creates a programme.

PATCH/nerogym/programmes/{id}

Updates a programme.

DELETE/nerogym/programmes/{id}

Deletes/deactivates a programme where allowed.

GET query attributes

FieldTypeRequiredDescription
qstringOptionalSearch staff/programme name and supported text fields.
client_idintegerProgrammes optionalFilter programmes by client.
statusenumOptionalFilter active/inactive/status values.
page / per_pageintegerOptionalPagination controls.

GET response attributes

FieldTypeDescription
idintegerRecord ID.
namestringStaff/programme name.
email, phonestringStaff contact details where applicable.
rolestringStaff role where applicable.
client_idinteger/nullProgramme client where applicable.
starts_at, ends_atdateProgramme date range where applicable.
status, is_activeenum/booleanCurrent active/status value.

POST /nerogym/staff request attributes

FieldTypeRequiredDescription
namestringRequiredStaff full name.
emailemailOptionalStaff email address.
phonestringOptionalStaff phone number.
rolestringOptionalTrainer, coach, manager or local role.
is_activebooleanOptionalDefaults to true.

POST /nerogym/programmes request attributes

FieldTypeRequiredDescription
namestringRequiredProgramme name.
client_idintegerOptionalClient ID from the scoped merchant.
descriptiontextOptionalProgramme details.
starts_at, ends_atdateOptionalProgramme start/end dates.
statusenumOptionalProgramme status.

PATCH request attributes

FieldTypeDescription
name, email, phone, role, is_active, client_id, description, starts_at, ends_at, statusmixedOnly supplied fields are updated. Linked IDs must belong to the same merchant.
NeroGYM

Check-ins & payments

Record attendance and gym payment ledger events. Check-in/payment audit records are intentionally protected from API delete.

GET/nerogym/checkins

Lists check-ins.

POST/nerogym/checkins

Creates a check-in.

PATCH/nerogym/checkins/{id}

Updates a safe check-in field where allowed.

GET/nerogym/payments

Lists gym payment records.

POST/nerogym/payments

Creates a manual gym payment record. Raw card details are not accepted.

PATCH/nerogym/payments/{id}

Updates safe payment metadata/status only.

GET query attributes

FieldTypeRequiredDescription
client_idintegerOptionalFilter by client from the scoped merchant.
membership_idintegerOptionalFilter by membership from the scoped merchant.
date_from / date_todateOptionalFilter by checked-in or paid date.
statusenumPayments optionalFilter payment status.
page / per_pageintegerOptionalPagination controls.

GET response attributes

FieldTypeDescription
idintegerRecord ID.
client_id, membership_idinteger/nullLinked client and membership IDs.
checked_in_atdatetimeCheck-in timestamp for check-in records.
sourceenumCheck-in source such as manual, qr or api.
amount, currencydecimal/stringPayment amount and currency for payment records.
methodenumPayment method such as cash, bank, card, link or manual.
paid_atdatetimePayment timestamp.
statusenumPayment status where applicable.

POST /nerogym/checkins request attributes

FieldTypeRequiredDescription
client_idintegerRequiredClient ID from the scoped merchant.
membership_idintegerOptionalMembership ID from the scoped merchant.
checked_in_atdatetimeOptionalDefaults to now.
sourceenumOptionalDefaults to api.

POST /nerogym/payments request attributes

FieldTypeRequiredDescription
client_idintegerRequiredClient ID from the scoped merchant.
membership_idintegerOptionalMembership ID from the scoped merchant.
amountdecimalRequiredManual payment amount.
currencystringOptionalDefaults to merchant currency.
methodenumRequiredcash, bank, card, link or manual. Raw card data is rejected.
paid_atdatetimeOptionalDefaults to now.
statusenumOptionalDefaults to paid/recorded.
referencestringOptionalYour integration payment reference.

PATCH request attributes

FieldTypeDescription
checked_in_at, source, status, reference, notesmixedOnly safe metadata/status fields are updated. Audit deletes are not exposed in API v2.
Abuse protection: payment writes reject raw card numbers, PINs, CVV, bank credentials, access tokens and secret keys. Use hosted NeroPay checkout links for card collection.
Invoices

Invoices API

Create professional merchant invoices with customer details, VAT lines, discounts, due dates and a secure NeroPay payment page.

GET/invoices

Lists invoices for the merchant or connected merchant account.

POST/invoices

Creates a professional invoice and returns the public payment/review URL.

GET/invoices/{id}

Retrieves one invoice with line items.

PATCH/invoices/{id}

Updates an unpaid invoice. Paid/refunded invoices are locked.

DELETE/invoices/{id}

Deletes a draft/unpaid invoice where no payment has been recorded.

GET /invoices query attributes

FieldTypeRequiredDescription
statusenumOptionalFilter by draft, unpaid, paid, cancelled, refunded or your configured invoice status.
qstringOptionalSearch invoice number, customer name, email or reference.
date_from / date_todateOptionalLimit by invoice creation date or issue date.
page / per_pageintegerOptionalPagination controls.

GET /invoices response attributes

FieldTypeDescription
idintegerInternal invoice ID.
invoice_numberstringMerchant/customer-facing invoice number.
public_urlurlPublic invoice review and payment page.
invoice_to, email, addressstringCustomer billing details.
items[]arrayInvoice line items with name, quantity, unit amount, VAT and row total.
subtotal_amount, vat_amount, discount_amount, shipping_amount, total_amountdecimalCalculated invoice totals.
payment_required, partial_payment_allowed, deposit_amountboolean/decimalPayment collection settings.
status, paid_atenum/datetimeCurrent invoice status and payment timestamp when available.

POST /invoices request attributes

FieldTypeRequiredDescription
invoice_tostringRequiredCustomer or company name.
emailemailRequiredCustomer email address.
addressstringRequiredCustomer billing address.
invoice_titlestringOptionalShort title/subject for the invoice.
referencestringOptionalYour internal reference.
po_numberstringOptionalCustomer purchase order number.
currencystringOptionalCurrency code such as GBP. You may send currency_id instead.
items[]arrayRequiredEach item requires name and unit_amount. qty, description and vat_rate are optional.
discount_amountdecimalOptionalFlat invoice discount.
shipping_amountdecimalOptionalShipping, delivery or service amount added to the invoice.
due_datedateOptionalInvoice due date.
payment_requiredbooleanOptionalWhen true, the public invoice includes NeroPay checkout.
partial_payment_allowedbooleanOptionalAllows the customer to pay a deposit/partial amount first.
deposit_amountdecimalOptionalDeposit or upfront amount when partial payments are allowed.
invoice_notetextOptionalCustomer-facing invoice note.
footer_notetextOptionalOptional footer shown on the invoice.
send_emailbooleanOptionalSend the invoice email after creation.
account_idstringPlatform onlyConnected merchant account for NeroConnect routing.

PATCH /invoices/{id} request attributes

FieldTypeDescription
invoice_to, email, address, invoice_title, reference, po_numberstringUpdate customer and reference details.
items[]arrayReplace line items and recalculate totals. Paid/refunded invoices are locked.
discount_amount, shipping_amount, due_datedecimal/dateUpdate invoice totals and due date.
payment_required, partial_payment_allowed, deposit_amountboolean/decimalUpdate payment collection rules before payment is recorded.
statusenumUpdate status only where allowed by the invoice lifecycle.
Safety: paid and refunded invoices cannot be edited through API v2. Provider errors are logged server-side and returned as NeroPay-safe messages.
Subscriptions · advanced billing · live API

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.

Live only: these routes are not part of the Developer sandbox simulator. They require the installed subscription workspace and its existing database setup. Never expose secret API keys in a browser, mobile app or public repository.

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.

HMAC-SHA256(timestamp + "\n" + METHOD + "\n" + path + "\n" + Idempotency-Key + "\n" + NeroPay-Account + "\n" + exact_raw_JSON, secret_key)

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

GET/subscriptions

List this account’s subscription snapshots, with pagination.

POST/subscriptions

Create 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.

GET/subscriptions/{id}

Read one owned subscription and its agreed phases.

PATCH / PUT/subscriptions/{id}

Change name/email only before an advanced agreement has been reviewed. Billing status and agreed pricing are not writable.

POST/subscriptions/{id}/sync

Refresh verified billing status. Does not authorise a card or activate an unsigned agreement.

POST/subscriptions/{id}/cancel

Confirm immediate cancellation through the billing workflow. No automatic refund, invoice settlement or proration.

GET/subscriptions/products

List product IDs and names. This is the recurring catalogue, separate from /products (NeroPOS).

POST/subscriptions/products

Create a product with up to six prices, or add prices to an owned product_id. Existing prices/agreements stay unchanged.

GET/subscriptions/prices

List full pricing rules. Optional product_id and active=0/1 filters.

POST/subscriptions/prices/{priceId}/archive

Archive an owned price for new agreements. Send {}. Existing agreements keep their price.

GET/subscriptions/discounts

List owned discount codes and availability.

POST/subscriptions/discounts

Create a percentage/amount code with duration, product, expiry and redemption limits.

PATCH/subscriptions/discounts/{discountId}

Enable/disable a code using {"active":true/false}; discountId is the id returned by creation/listing.

GET/subscriptions/{id}/usage

List that subscription’s usage ledger. accepted means recorded for processing, not paid.

POST/subscriptions/{id}/usage

Record measured usage for the current open billing period. Returns HTTP 202.

Products and prices

FieldTypeRules
product_namestringRequired; 1–190 characters. For additional prices, product_id must belong to the selected account.
pricesarray1–6 price objects. Fixed, per_unit, volume, graduated or metered.
prices[].modelenumflat: 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 / unitstringRequired; label up to 80 characters, unit up to 40.
prices[].currencyenumGBP, EUR or USD. Amounts are major currency units, not pennies/cents.
prices[].interval / interval_countenum / integerday (1–365), week (1–52), month (1–12), year (1). Required; billing periods cannot exceed one year.
prices[].amountdecimalRequired 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[].tiersarrayRequired 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[].meteredbooleanOptional for volume/graduated: true uses measured usage in arrears. The metered model is always measured usage.

Create an agreement

FieldTypeRules
customer_name / customer_emailstring / emailRequired; maximum 190 characters each.
phasesarray1–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_idstringRequired; use an ID returned by /subscriptions/prices or product creation.
phases[].quantityintegerRequired; 1–1,000,000. Fixed and measured-usage prices use quantity 1; licensed prices multiply by the agreed quantity.
phases[].cyclesinteger / nullIntroductory phases: 1–36 billing periods. Final phase: null or omitted, continuing until cancellation.
start_dateYYYY-MM-DDOptional: today or a future date less than one year away, using the application’s configured timezone. Omit for activation after customer authorisation.
offer_codestringOptional; 3–24 letters/digits. Code eligibility is checked again when the customer reviews the agreement.
Simple creationalternativeInstead 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

FieldTypeRules
codestringRequired; 3–24 letters/digits, normalised to uppercase. Code terms cannot be overwritten; create a new code for new terms.
type / valueenum / decimalpercent: greater than 0 and at most 100. amount: positive major currency amount with two decimals, at most 9,999,999.
currencyenumRequired: GBP/EUR/USD. For amount discounts it must match the agreement currency.
cyclesintegerRequired: 1–36 monthly bills, or 0 for ongoing. These codes apply only to interval=month, interval_count=1 agreements.
product_idstring / nullOptional; restrict to one product belonging to this account.
max_redemptionsinteger / nullOptional; 1–1,000,000, enforced when the offer is redeemed.
expires_atYYYY-MM-DD / nullOptional; today or later, valid through the end of that day in the application’s configured timezone.
PresetsexamplesFirst 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

FieldTypeRules
quantityintegerRequired; 1–1,000,000,000 measured units. The API never accepts a caller-supplied charge amount.
referencestringRequired; 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_atISO 8601 timestampRequired 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.
EligibilityruleOnly 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

StatusMeaningAction
200 / 201 / 202SuccessRead/update, creation, or accepted usage respectively.
400 / 401Request / authenticationMissing retry key, HTTPS/signature/timestamp/key failure.
403 / 404Access / ownershipAccount access denied or resource not found in the selected account.
409ConflictDifferent data for a used key, an immutable/consented agreement, or an old unconfirmed write requiring review.
413 / 415 / 422InputSize, content type, unknown fields, invalid pricing/offer/usage or lifecycle constraints.
429Rate limitRetry after the documented delay, preserving the operation key.
503Unconfirmed / unavailableThe 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.

POST/transactions

Legacy alias for creating hosted/API transaction where enabled.

Note: for new online checkout integrations, use POST /hosted-payments or POST /payment-links. The transaction table below describes transaction records returned by list/retrieve/refund/cancel flows.
GET/transactions

Lists transactions.

GET/transactions/{id}

Retrieves one transaction.

POST/transactions/{id}/refund

Refunds a transaction.

POST/transactions/{id}/cancel

Cancels a pending transaction.

Transaction response attributes

FieldTypeDescription
idintegerInternal transaction ID.
account_idstringMerchant or connected account ID.
referencestringNeroPay or merchant reference.
np_main_trxstringProcessor/payment identifier where available.
statusenumpending, succeeded, failed, cancelled, refunded.
is_reservebooleanWhether funds are currently held in reserve.
reserve_amountdecimalAmount held from available balance.
proof_statusenumrequested, submitted, approved, rejected or null.
A succeeded transaction can still have reserve/proof state. Do not show funds as fully available until reserve_amount is zero and proof status is clear.

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.

GET/transactions/{id}/proof

Returns proof request and transaction reserve state.

POST/transactions/{id}/proof

Submits proof details and invoice/shipping file.

POST proof upload request attributes

FieldTypeRequiredDescription
invoice_filefileOptionalJPG, PNG, PDF or WEBP. Required when staff/platform requested an invoice file.
courier_companystringOptionalShipping courier.
tracking_numberstringOptionalTracking number.
buyer_firstnamestringOptionalBuyer first name.
buyer_lastnamestringOptionalBuyer last name.
buyer_phonestringOptionalBuyer phone number.
buyer_emailstringOptionalBuyer email.
merchant_notestextOptionalMerchant notes for the review team.
Submitting proof publishes 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.

GET/balances

Returns wallet balances.

GET/balance

Alias of /balances.

Balance response attributes

FieldTypeDescription
wallets[].currencyobjectWallet currency id, ISO code and display symbol.
wallets[].availabledecimalCurrent main wallet balance.
wallets[].pending_fundsdecimalFunds still subject to settlement timing.
wallets[].standard_availabledecimalMain wallet balance after pending settlement funds are excluded.
wallets[].instant_availabledecimalCurrent instant availability reported for the wallet.
wallets[].reserve_balancedecimalFunds held in reserve due to proof, risk or compliance controls.
wallets[].nerobusiness_balancedecimalLatest locally recorded available balance for the merchant's NeroBusiness Financial Account in this wallet currency.
nerocard / issuingobjectRead-only card programme summaries where available.
Balance integrity: balance values are read-only snapshots scoped to the authenticated merchant or the connected account selected by 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.

GET/wallet-transactions

Lists wallet balance transactions.

GET/wallet-transactions/{id}

Retrieves one wallet ledger row.

Wallet ledger response attributes

FieldTypeDescription
txn_idstringLedger transaction ID.
typeenumcredit/debit/hold/release depending on implementation.
amountdecimalAmount moved.
balance_beforedecimalBalance before movement where available.
balance_afterdecimalBalance after movement where available.
notestextInternal 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.

GET/payouts

Lists payouts.

POST/payouts

Creates a payout request.

POST/payouts/request

Legacy alias for create payout.

GET/payouts/{id}

Retrieves one payout.

GET/payout-schedule

Gets payout schedule.

PATCH/payout-schedule

Updates payout schedule.

GET/transfer-schedule

Legacy alias of payout schedule.

PATCH/transfer-schedule

Legacy alias of update payout schedule.

POST/PATCH payout request attributes

FieldTypeRequiredDescription
amountdecimalRequiredPayout amount.
currencyenumRequiredCurrency.
transfer_speedenumOptionalinstant or standard.
bank_account_idstringOptionalDestination bank reference.
referencestringOptionalStatement or internal reference.
Transfers and payouts should not bypass risk controls. High-risk payout requests can create proof requirements, risk flags, tasks and webhooks.

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.

GET/disputes

Lists account-scoped cases. Filters: status, action_required, q and per_page (maximum 50).

GET/disputes/{case_id}

Retrieves one case such as DISPUTE-1057.

POST/disputes/{case_id}/counter

Submits final counter-dispute evidence to NeroPay.

POST/disputes/{case_id}/accept

Accepts the claim. This action is final and cannot be reversed.

Connected accounts: a platform may send 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.
Mandatory write protection: counter and accept requests require a unique 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

FieldTypeRequiredDescription
product_descriptionstringRequiredWhat was sold or delivered; maximum 20,000 characters.
evidence_statementstringRequiredClear explanation supporting the counter dispute; maximum 20,000 characters.
service_datedateOptionalISO date, for example 2026-09-01.
shipping_tracking_numberstringOptionalCarrier tracking reference; maximum 255 characters.
proof_filefileOptionalPDF, JPG or PNG, maximum 4.5 MB. Use multipart/form-data and sign the exact multipart body.
confirm_submissionbooleanRequiredMust 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.

GET/loans

Lists loan/financing records.

GET/loans/{id}

Retrieves one loan record.

Loan response attributes

FieldTypeDescription
offer_idstringFinancing offer identifier.
statusenumoffer, active, paid, declined etc.
campaign_typestringCampaign/category.
financing_typestringFinancing type.
created_atdatetimeRecord creation time.

NeroDisburse Bank Accounts

Bank accounts are documented under NeroDisburse. API responses never expose full account numbers, sort codes, IBANs or routing numbers.

GET/bank-accounts

Lists safe payout bank references.

POST/bank-accounts

Adds a payout bank account through the NeroDisburse bridge.

GET/nerodisburse/bank-accounts

Lists NeroDisburse bank accounts.

POST/nerodisburse/bank-accounts

Creates a NeroDisburse bank account.

POST bank-account request attributes

FieldTypeRequiredDescription
account_namestringRequiredDisplay name for the destination.
bank_namestringOptionalBank name.
sort_codestringOptionalGB sort code for GB bank accounts.
account_numberstringOptionalGB account number for GB bank accounts.
ibanstringOptionalIBAN for supported international accounts.
currencyenumRequiredCurrency.
use_forenumOptionalsupplier, payout, merchant etc.
is_defaultbooleanOptionalSet as default destination.

NeroDisburse Payouts

Create supplier or connected disbursement payouts using saved bank accounts.

GET/nerodisburse/payouts

Lists NeroDisburse payouts.

POST/nerodisburse/payouts

Creates pending NeroDisburse payout.

GET/nerodisburse/payouts/{id}

Retrieves one NeroDisburse payout.

POST payout request attributes

FieldTypeRequiredDescription
amountdecimalRequiredAmount.
currencyenumRequiredCurrency.
transfer_speedenumOptionalinstant or standard.
bank_account_idstringRequiredSaved bank account reference.
referencestringOptionalPayout reference.
notetextOptionalSupplier payout note.

NeroDisburse Payments

Create disbursement payment records where enabled by the NeroDisburse controller.

POST/nerodisburse/payments

Creates 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.

POST/terminal/payments

Creates and sends a terminal payment action.

POST/terminal/readers/{reader_id}/cancel-action

Cancels the current reader action.

POST terminal payment request attributes

FieldTypeRequiredDescription
amountdecimalRequiredAmount.
currencyenumRequiredCurrency.
reader_idstringRequiredTerminal reader ID.
location_idstringRequiredTerminal location ID.
descriptiontextOptionalPayment description.
referencestringOptionalReference shown in transaction history.

Terminal Locations

Create, list and manage terminal locations. Location creation uses the terminal bridge route.

GET/locations

Lists terminal/NeroPOS locations.

POST/locations

Legacy alias to create terminal location.

GET/terminal/locations

Lists terminal locations.

POST/terminal/locations

Creates a terminal location.

GET/locations/{id}

Retrieves one location.

PATCH/locations/{id}

Updates a location.

DELETE/locations/{id}

Deletes where enabled.

POST/PATCH location request attributes

FieldTypeRequiredDescription
display_namestringRequiredLocation display name.
line1stringRequiredAddress line 1.
citystringRequiredCity.
postal_codestringRequiredPostal code.
countryenumRequiredISO country code.
is_defaultbooleanOptionalSet default location.
tipping_enabledbooleanOptionalEnable tipping for terminal/POS flows.

Terminal Readers

Register, list and remove terminal readers.

GET/readers

Lists readers.

POST/readers

Legacy alias to register reader.

GET/terminal/readers

Lists terminal readers.

POST/terminal/readers

Registers a reader.

DELETE/terminal/readers/{id}

Deletes/unlinks a reader.

POST reader registration request attributes

FieldTypeRequiredDescription
labelstringRequiredReader label.
location_idstringRequiredLocation ID.
registration_codestringRequiredPairing/registration code from device.
reader_serial_numberstringRead-onlyDevice serial where available.
reader_statusenumRead-onlyonline/offline/unknown.

Devices

Read-only terminal/device records for fleet visibility.

GET/devices

Lists device rows.

GET/devices/{id}

Retrieves one device.

Device response attributes

FieldTypeDescription
device_idstringInternal device ID.
reader_idstringLinked reader ID.
reader_serialstringSerial number.
reader_labelstringDisplay label.
statusenumDevice status.

NeroCard Cards

NeroCard card records are read-only in API v2 and are separate from payment cards.

GET/nerocards

Lists NeroCard cards.

GET/nerocards/{id}

Retrieves one NeroCard card.

Card response attributes

FieldTypeDescription
cardholder_namestringCardholder name.
brandstringCard brand.
last4stringLast four digits.
statusenumactive, inactive, cancelled, blocked etc.
card_pinhiddenNever returned.

NeroCard Cardholders

Read NeroCard cardholder records.

GET/nerocardholders

Lists cardholders.

GET/nerocardholders/{id}

Retrieves one cardholder.

Cardholder response attributes

FieldTypeDescription
namestringCardholder name.
emailstringEmail.
phonestringPhone.
neropay_cardholder_idstringNeroPay cardholder identifier when present.
created_atdatetimeCreation time.

NeroCard Transactions

Read NeroCard issuing transactions separately from wallet and payment transactions.

GET/nerocard-transactions

Lists issuing/NeroCard transactions.

GET/nerocard-transactions/{id}

Retrieves one NeroCard transaction.

NeroCard transaction response attributes

FieldTypeDescription
neropay_issuing_transaction_idstringNeroPay issuing transaction ID.
merchant_namestringMerchant name on the card transaction.
amountdecimalTransaction amount.
merchant_amountdecimalOriginal merchant amount where different.
platform_fee_amountdecimalPlatform fee amount if applied.
net_amountdecimalNet ledger amount.
statusenumpending, posted, reversed etc.
typeenumpurchase, refund, adjustment etc.

NeroTrade API

NeroTrade API v2 lets eligible merchants create, retrieve, list and update wholesale trade records from their own systems.

Subscription required: NeroTrade endpoints require an active NeroTrade subscription and return 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 } }.

GET/nerotrade/dashboard

Returns NeroTrade summary, subscription status, stock alerts and operational totals.

GET/nerotrade/{resource}

Lists supported NeroTrade records for the authenticated merchant.

POST/nerotrade/{resource}

Creates a supported NeroTrade record where the resource supports creation.

GET/nerotrade/{resource}/{id}

Retrieves one supported NeroTrade record.

PATCH/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.

GET/nerotrade/trade-accounts

Lists trade accounts. Alias: /nerotrade/customers.

POST/nerotrade/trade-accounts

Creates a trade account.

GET/nerotrade/trade-accounts/{id}

Retrieves one trade account.

PATCH/nerotrade/trade-accounts/{id}

Updates account details, limits, terms, collection method or supply status.

POST/PATCH trade account request attributes

FieldTypeDescription
business_namestringRequired on create. Trade customer business name.
contact_namestringMain contact name.
emailstringBilling or account email.
phonestringContact phone number.
billing_addressstringBilling address.
delivery_addressstringDefault delivery address.
payment_termsenumcod, 7_days, 14_days, 30_days, weekly or monthly.
credit_limitdecimalApproved trade account credit limit.
opening_balancedecimalOptional opening balance on create.
collection_methodenumCollection preference such as payment_link or bank_transfer.
risk_statusstringInternal account risk label, for example good or watch.
stop_supplybooleanStops supply for the account when true.

NeroTrade Products & Pricing

Manage trade product categories, SKUs, wholesale pricing, VAT settings and stock-tracked product records.

GET/nerotrade/product-categories

Lists trade product categories. Alias: /nerotrade/categories.

POST/nerotrade/product-categories

Creates a product category.

PATCH/nerotrade/product-categories/{id}

Updates a product category.

GET/nerotrade/products

Lists trade products and pricing.

POST/nerotrade/products

Creates a trade product.

GET/nerotrade/products/{id}

Retrieves one trade product.

PATCH/nerotrade/products/{id}

Updates product details, stock settings or pricing.

POST/PATCH product and pricing request attributes

FieldTypeDescription
namestringRequired product name.
base_unitstringRequired unit such as pcs, box, case or pallet.
unit_pricedecimalRequired default trade unit price.
category_idintegerLinked NeroTrade product category.
category_namestringCreates or links a category by name when supplied.
skustringStock keeping unit.
descriptionstringProduct description.
vat_ratedecimalVAT rate applied to the product.
vat_includedbooleanWhether price includes VAT.
track_stockbooleanEnables inventory tracking for the product.
stock_qtydecimalCurrent available stock.
reorder_leveldecimalManual reorder threshold.
preferred_supplierstringSupplier reference.

NeroTrade Inventory

Read stock-tracked products and update stock quantity, reorder level, supplier and active status.

GET/nerotrade/inventory

Lists products where stock tracking is enabled.

GET/nerotrade/inventory/{id}

Retrieves one stock-tracked product.

PATCH/nerotrade/inventory/{id}

Updates stock quantity, reorder level, preferred supplier or active status.

Create inventory items by creating products with track_stock enabled. Stock fields can then be updated through the inventory endpoint.

PATCH inventory request attributes

FieldTypeDescription
track_stockbooleanEnables stock tracking.
stock_qtydecimalCurrent stock quantity.
reorder_leveldecimalManual reorder threshold.
preferred_supplierstringSupplier reference.
activebooleanWhether 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.

GET/nerotrade/drivers

Lists delivery drivers.

POST/nerotrade/drivers

Creates a driver record.

GET/nerotrade/drivers/{id}

Retrieves one driver record.

PATCH/nerotrade/drivers/{id}

Updates driver details or active status.

GET/nerotrade/deliveries

Lists deliveries and delivery notes.

POST/nerotrade/deliveries

Creates a delivery record.

GET/nerotrade/deliveries/{id}

Retrieves one delivery record with items.

PATCH/nerotrade/deliveries/{id}

Updates delivery status, driver, proof name, notes or line items.

POST/PATCH driver and delivery request attributes

FieldTypeDescription
customer_idintegerRequired linked trade account.
driver_idintegerAssigned driver.
delivery_numberstringOptional delivery reference. Generated if omitted.
statusenumscheduled, delivered, invoiced, failed or cancelled.
delivered_atdatetimeDelivery timestamp.
proof_namestringRecipient name for proof of delivery.
create_invoicebooleanCreates an invoice from the delivery items when true.
itemsarrayLine 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.

GET/nerotrade/invoices

Lists trade invoices.

POST/nerotrade/invoices

Creates a trade invoice with line items.

GET/nerotrade/invoices/{id}

Retrieves one trade invoice with items and payments.

PATCH/nerotrade/invoices/{id}

Updates invoice status, dates, terms, collection method, notes or items.

GET/nerotrade/collections

Lists collection/payment records. Alias: /nerotrade/payments.

POST/nerotrade/collections

Creates a collection/payment record.

PATCH/nerotrade/collections/{id}

Updates collection amount, method, invoice link, paid date or reference.

POST/PATCH invoice and collection request attributes

FieldTypeDescription
customer_idintegerRequired linked trade account.
invoice_numberstringOptional merchant invoice reference. Generated if omitted.
statusenumsent, part_paid, paid, overdue or collection_failed.
issue_datedateInvoice issue date.
due_datedateInvoice due date. Calculated from terms if omitted.
payment_termsenumcod, 7_days, 14_days, 30_days, weekly or monthly.
collection_methodstringCollection preference.
itemsarrayLine items with item_name, quantity, unit, unit_price, vat_rate and optional product_id.
amountdecimalRequired collection amount.
methodstringRequired payment method for collections.
referencestringExternal collection reference.
paid_atdatetimePayment received timestamp.

NeroTrade Statements

Read statement-style account summaries, outstanding balances, invoices and payments for trade accounts.

GET/nerotrade/statements

Lists trade accounts in statement format. Use outstanding_only=1 to return accounts with balance due.

GET/nerotrade/statements/{customer_id}

Retrieves one trade account statement with invoices and payments.

Statement response attributes

Query / FieldTypeDescription
outstanding_onlybooleanOnly return trade accounts with outstanding balances.
limitintegerNumber of records to return. Maximum 100 for the list endpoint and 200 for invoice/payment lines.
customerobjectTrade account details.
summaryobjectCurrent balance, overdue balance, invoice count and payment count.
invoicesarrayRecent invoices for the trade account.
paymentsarrayRecent payment/collection records.

NeroTrade Sales & Marketing

Manage campaign records linked to trade accounts for merchant-supplied sales and marketing workflows.

GET/nerotrade/campaigns

Lists sales and marketing campaign records.

POST/nerotrade/campaigns

Creates a campaign record.

GET/nerotrade/campaigns/{id}

Retrieves one campaign record.

PATCH/nerotrade/campaigns/{id}

Updates campaign details, schedule or status.

POST/PATCH campaign request attributes

FieldTypeDescription
namestringRequired campaign name.
campaign_typestringRequired campaign type, for example promotion or retention.
channelenumRequired channel such as email, sms, phone, field_sales or manual.
target_segmentstringTarget segment. Defaults to all_trade_accounts.
statusenumdraft, scheduled, active, completed or cancelled.
messagestringMerchant-supplied campaign message or note.
scheduled_atdatetimeOptional scheduled time.

NeroTrade Routes & Tracking

Create delivery route plans and update driver check-in records.

GET/nerotrade/route-plans

Lists planned routes. Alias: /nerotrade/routes.

POST/nerotrade/route-plans

Creates a route plan.

GET/nerotrade/route-plans/{id}

Retrieves one route plan.

PATCH/nerotrade/route-plans/{id}

Updates route name, date, status, driver, vehicle or notes.

GET/nerotrade/driver-checkins

Lists driver tracking/check-in records.

POST/nerotrade/driver-checkins

Creates a driver check-in record.

PATCH/nerotrade/driver-checkins/{id}

Updates a driver check-in record.

POST/PATCH route request attributes

FieldTypeDescription
route_namestringRequired route name.
driver_idintegerAssigned driver.
route_datedateRoute date. Defaults to today when omitted.
statusenumplanned, in_progress, completed or cancelled.
vehicle_registrationstringVehicle registration.
start_areastringRoute start area.
end_areastringRoute end area.
estimated_stopsintegerEstimated stop count.
estimated_valuedecimalEstimated route value.
checkin_typeenumRequired check-in type such as start_route, delivery_stop, issue or end_route.
latitude / longitudedecimalOptional GPS coordinates.

Customers

Create and manage NeroPOS/NeroPay customer records.

GET/customers

Lists customers.

POST/customers

Creates a customer.

GET/customers/{id}

Retrieves one customer.

PATCH/customers/{id}

Updates a customer.

POST/PATCH customer request attributes

FieldTypeRequiredDescription
namestringRequiredCustomer name.
emailstringOptionalEmail.
phonestringOptionalPhone.
postcodestringOptionalPostcode.
address1/address2stringOptionalAddress lines.
citystringOptionalCity.
instructionstextOptionalDelivery or customer notes.

Categories & Products

Keep product catalogue data in sync for NeroPOS and NeroWeb menus.

GET/categories

Lists categories.

POST/categories

Creates category.

PATCH/categories/{id}

Updates category.

DELETE/categories/{id}

Deletes category where enabled.

GET/products

Lists products.

POST/products

Creates product.

PATCH/products/{id}

Updates product.

DELETE/products/{id}

Deletes product where enabled.

POST/PATCH category and product request attributes

Product fieldTypeRequiredDescription
category_idintegerOptionalCategory ID.
namestringRequiredProduct name.
skustringOptionalSKU.
pricedecimalRequiredProduct price.
vat_ratedecimalOptionalVAT rate.
image_urlstringOptionalImage URL.
stock_qtyintegerOptionalStock quantity.
descriptiontextOptionalProduct description.

Product Options & Rules

Manage product-specific options and global option groups for POS and online ordering.

GET/product-option-groups

Lists product option groups.

POST/product-option-groups

Creates product option group.

GET/product-options

Lists product options.

POST/product-options

Creates product option.

GET/global-option-groups

Lists global option groups.

POST/global-option-groups

Creates global option group.

GET/global-option-items

Lists global option items.

POST/global-option-items

Creates global option item.

GET/global-option-assignments

Lists assignments.

POST/global-option-assignments

Creates assignment.

GET/product-option-rules

Alias for assignments/rules.

POST/PATCH option request attributes

FieldTypeDescription
namestringOption or group name.
requiredbooleanRequire selection.
min_select / max_selectintegerSelection limits.
price_deltadecimalPrice change for selected item.
rules_jsonobjectRule configuration.
scope / scope_idenum/integerWhere a global option applies.

Tables & Areas

Manage table maps, areas and table status for dine-in flows.

GET/table-areas

Lists table areas.

POST/table-areas

Creates table area.

GET/tables

Lists tables.

POST/tables

Creates table.

PATCH/tables/{id}

Updates table.

DELETE/tables/{id}

Deletes table where enabled.

POST/PATCH table and area request attributes

FieldTypeDescription
area_idintegerArea ID.
name / labelstringDisplay name.
seatsintegerSeat count.
statusenumavailable, occupied, reserved etc.
x,y,w,h,rotationdecimal/integerTable-map coordinates.

Cashiers, Registers & Staff

Manage POS cashiers, registers, POS staff and team members.

GET/cashiers

Lists cashiers.

POST/cashiers

Creates cashier.

GET/registers

Lists registers.

POST/registers

Creates register.

GET/pos-staffs

Lists POS staff.

POST/pos-staffs

Creates POS staff.

GET/team-members

Lists merchant team members.

POST/team-members

Creates team member.

POST/PATCH staff request attributes

FieldTypeDescription
namestringStaff/cashier name.
email / usernamestringLogin identifier.
password / new_passwordstringAccepted on create/update but never returned.
roleenumRole/register type.
permissionsobject/arrayPermission payload.
location_ids / till_idsarrayAllowed locations or tills.

Invoices

Create and manage merchant invoices and invoice line items.

GET/invoices

Lists invoices.

POST/invoices

Creates invoice.

GET/invoices/{id}

Retrieves invoice.

PATCH/invoices/{id}

Updates invoice.

GET/invoice-items

Lists invoice items.

POST/invoice-items

Creates invoice item.

POST/PATCH invoice request attributes

FieldTypeDescription
invoice_numberstringInvoice number.
invoice_tostringRecipient name.
invoice_emailstringRecipient email.
currency_idintegerCurrency ID.
sub_total / total_amountdecimalAmounts.
items_jsonobject/arrayLine items payload.
due_datedateDue date.
statusenumdraft, sent, paid etc.

NeroPOS Orders

NeroPOS order APIs are separate from NeroWeb orders and generic store orders.

GET/neropos-orders

Lists NeroPOS orders.

POST/neropos-orders

Creates NeroPOS order.

GET/neropos-orders/{id}

Retrieves order.

PATCH/neropos-orders/{id}

Updates order.

GET/neropos-order-items

Lists order items.

POST/neropos-order-items

Creates order item.

GET/orders

Generic orders resource.

GET/store-orders

Read-only NeroPay Store orders.

POST/PATCH order request attributes

FieldTypeDescription
order_number / order_refstringOrder reference.
statusenumOrder status.
fulfilment_typeenumdine_in, takeaway, delivery etc.
payment_method / payment_statusenumPayment fields.
customer_*stringCustomer details.
subtotal, total, tip_feedecimalMoney fields.
location_id / table_id / staff_idintegerOperational links.
meta_jsonobjectExtra order metadata.

NeroPOS Payment Settings

Manage POS payment, tax, service fee, cashiers, tables and receipt defaults.

GET/payment-settings

Lists POS payment settings.

POST/payment-settings

Creates settings where no row exists.

GET/payment-settings/{id}

Retrieves settings.

PATCH/payment-settings/{id}

Updates settings.

POST/PATCH payment settings request attributes

FieldTypeDescription
default_tax_feedecimalDefault tax fee.
default_service_feedecimalDefault service fee.
default_tip_feedecimalDefault tip fee.
pos_mode / default_channelenumPOS operating mode.
enable_tables / enable_cashiersbooleanFeature toggles.
receipt_footer / receipt_logo_urltext/stringReceipt branding. Use receipt_logo_url for the logo image URL.
min_card_chargedecimalMinimum card charge.

NeroWeb Settings

Configure online ordering storefront settings separately from POS resources.

GET/neroweb-settings

Lists NeroWeb settings.

POST/neroweb-settings

Creates settings.

GET/neroweb-settings/{id}

Retrieves settings.

PATCH/neroweb-settings/{id}

Updates settings.

POST/PATCH NeroWeb settings request attributes

FieldTypeDescription
store_namestringOnline store name.
slugstringStore slug.
is_activebooleanEnable store.
disable_delivery / disable_collectbooleanFulfilment toggles.
enable_card / enable_cashbooleanPayment toggles.
working_hours_jsonobjectWorking hours.
delivery_bands_jsonobjectDelivery pricing/areas.
theme_jsonobjectBrand/theme settings, including logo_url.

NeroWeb Pages

Manage public pages used by the NeroWeb storefront builder.

GET/neroweb-pages

Lists pages.

POST/neroweb-pages

Creates page.

GET/neroweb-pages/{id}

Retrieves page.

PATCH/neroweb-pages/{id}

Updates page.

GET/nerowebpages

Legacy alias for pages.

POST/PATCH NeroWeb page request attributes

FieldTypeDescription
titlestringPage title.
slugstringURL slug.
page_typeenumhome, content, legal etc.
is_home / is_published / show_in_navbooleanPage flags.
nav_label / nav_orderstring/integerNavigation settings.
html_content / content / css_contenttextPage content.
builder_jsonobjectBuilder state.
meta_title / meta_descriptionstring/textSEO metadata.

NeroWeb Orders

NeroWeb orders are separate from NeroPOS orders and store orders.

GET/neroweb-orders

Lists NeroWeb orders.

POST/neroweb-orders

Creates NeroWeb order.

GET/neroweb-orders/{id}

Retrieves order.

PATCH/neroweb-orders/{id}

Updates order.

GET/neroweb-order-items

Lists order items.

POST/neroweb-order-items

Creates order item.

POST/PATCH NeroWeb order request attributes

FieldTypeDescription
order_refstringOrder reference.
statusenumOrder status.
fulfilment_typeenumdelivery, collect etc.
payment_method / payment_statusenumPayment fields.
subtotal_pence / total_penceinteger/decimalMoney fields.
customer_name / email / phonestringCustomer fields.
meta_jsonobjectExtra metadata.

Booking Settings

Booking settings are separate from booking transactions and should appear under the Booking menu.

GET/booking-settings

Lists booking settings.

POST/booking-settings

Creates booking settings.

GET/booking-settings/{id}

Retrieves booking settings.

PATCH/booking-settings/{id}

Updates booking settings.

POST/PATCH booking settings request attributes

FieldTypeDescription
booking_company_namestringBooking brand/company name.
booking_typeenumBooking mode/type.
weekly_hoursobjectWeekly opening hours.
auto_approve_bookingbooleanAuto approve bookings.
slot_durationintegerMinutes per slot.
max_bookings_per_slot / max_guestsintegerCapacity.
servicesobject/arrayBookable services.
holiday_daysarrayClosed dates.
staff_enabled / staffboolean/objectStaff booking assignment.

Bookings

Create and manage booking transactions.

GET/bookings

Lists bookings.

POST/bookings

Creates booking.

GET/bookings/{id}

Retrieves booking.

PATCH/bookings/{id}

Updates booking.

POST/PATCH booking request attributes

FieldTypeRequiredDescription
booking_datedateRequiredBooking date.
booking_timetimeRequiredBooking time.
guest_countintegerOptionalGuests.
servicestringOptionalService name.
amountdecimalOptionalBooking amount.
staff_id / staff_nameinteger/stringOptionalStaff assignment.
location_idintegerOptionalLocation.
customer_name / phone / emailstringRequiredCustomer details.
customer_notetextOptionalCustomer note.
statusenumOptionalpending, 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.

POST/identity/verification-links

Creates a document verification link.

GET/identity/verification-sessions

Lists verification sessions.

GET/identity/verification-sessions/{id}

Retrieves one verification session.

POST identity verification-link request attributes

FieldTypeRequiredDescription
typeenumOptionaldocument or supported verification type.
return_urlstringOptionalWhere the user should return after verification.
first_name / last_namestringOptionalPrefill name if known.
countryenumOptionalISO country code.
metadataobjectOptionalDeveloper metadata.
NeroPay should not expose the underlying verification provider in your customer-facing copy. Use the returned 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.

GET/compliance/requests

Lists compliance requests, including each request's response_type.

GET/compliance/requests/{id}

Retrieves one compliance request.

POST/compliance/requests/{id}/documents

Uploads evidence for a request whose response_type is file.

Compliance request response attributes

FieldTypeDescription
response_typeenumfile or text. Text requests appear as Information needed in the merchant dashboard.
docs_numberintegerMaximum required file slots for file requests.
has_text_responsebooleanWhether the merchant has submitted the requested information.
text_submitted_atdatetime|nullISO 8601 submission time for a text response, when present.
has_file_1 / has_file_2 / has_file_3booleanWhether each available upload slot contains a file.

POST compliance document attributes

FieldTypeRequiredDescription
file_1fileRequired*First requested file. At least one of file_1, file_2 or file_3 is required.
file_2 / file_3fileOptionalAdditional files when the request allows multiple upload slots.
notetextOptionalSubmission note, maximum 2,000 characters.
Text requests are completed through the secure NeroPay merchant Compliance panel and the document upload endpoint rejects them with 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.

GET/support/tickets

Lists tickets.

POST/support/tickets

Creates ticket.

GET/support/tickets/{id}

Retrieves ticket.

POST support ticket request attributes

FieldTypeRequiredDescription
subjectstringRequiredTicket subject.
messagetextRequiredInitial message.
priorityenumOptionallow, normal, high, urgent.
categorystringOptionalSupport category.
attachments[]fileOptionalOptional files where supported. Max 2mb. PNG, JPG, WEBP or PDF
When NeroPay answers a ticket, your platform can receive 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.

GET/webhooks

Lists configured endpoints.

GET/webhook-deliveries

Lists 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_created

Webhook response attributes

FieldTypeDescription
idstringWebhook event ID.
typeenumEvent type.
created_atdatetimeEvent creation time.
accountobjectMerchant or connected account payload.
dataobjectEvent-specific payload. Failed transaction events include data.error.code, data.error.message and optional data.error.decline_code.
signaturestringUse your endpoint signing secret where configured.
Payment failures: subscribe to 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.
If the platform handles email/SMS, NeroPay skips delegated merchant-facing messages and publishes webhooks so the platform can send branded communication.

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

accountconnected-accountsbalancesbalanceapi-logs

Payments

hosted-paymentspayment-linkscontractsinvoicessubscriptionstransactionstransaction proof

Money Movement

wallet-transactionspayoutspayout-scheduletransfer-scheduledisputesloans

NeroDisburse

bank-accountsnerodisburse/bank-accountsnerodisburse/payoutsnerodisburse/paymentsnerodisburse-bank-accountsnerodisburse-payoutsnerodisburse-payments

Terminal

terminal/paymentslocationsterminal/locationsreadersterminal/readersdevices

NeroCard

nerocardsnerocardholdersnerocard-transactions

NeroTrade

nerotrade/trade-accountsnerotrade/product-categoriesnerotrade/productsnerotrade/inventorynerotrade/driversnerotrade/deliveriesnerotrade/invoicesnerotrade/collectionsnerotrade/statementsnerotrade/campaignsnerotrade/route-plansnerotrade/driver-checkins

NeroPOS

customerscategoriesproductsproduct-option-groupsproduct-optionsglobal-option-groupsglobal-option-itemsglobal-option-assignmentsproduct-option-rulescashiersregisterspos-staffsteam-memberstablestable-areasinvoicesinvoice-itemsordersneropos-ordersneropos-order-itemspayment-settings

NeroWeb

neroweb-settingsneroweb-pagesnerowebpagesneroweb-ordersneroweb-order-itemsstore-orders

Bookings

booking-settingsbookings

Risk & Ops

identity/verification-linksidentity/verification-sessionscompliance/requestssupport/ticketswebhookswebhook-deliveries
Direct aliases such as /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.
10-2026 · Sandbox API reference

Test the payment journey.
No real money moves.

View Markdown ↗

Use isolated test credentials to create a simulated checkout, choose its outcome and inspect test webhooks and API logs. This is a payment-flow simulator, not a full replica of the live API.

/v2/sandboxDedicated test base path
Separate keysLive keys are not accepted
3 outcomesSuccess, failure, cancellation
No real fundsNo payouts or balance changes

Quick start

From a test key to a verified result in four steps.

  1. Open Developer → Sandbox mode → API and generate your sandbox keys.
  2. Create a payment from your server using the sandbox secret and a unique Idempotency-Key.
  3. Open the returned checkout_url and select a simulated result. The checkout does not collect card details.
  4. Read the payment back and check Developer → Webhooks / API Logs with Sandbox mode on.
Configure a separate sandbox callback endpoint. A test success must never fulfil a live order. Check livemode: false and environment: sandbox.

Authentication & headers

Base URL: https://eu.neropay.app/v2/sandbox

Send Authorization: Bearer YOUR_TEST_SECRET_KEY. Sandbox secrets start with np_test_sk_ followed by 64 hexadecimal characters. The merchant is resolved from this key; do not send an account ID.

HeaderSandbox requirement
AuthorizationBearer sandbox secret. Alternatively, use X-NeroPay-Secret-Key.
Acceptapplication/json
Content-Typeapplication/json for POST requests.
Idempotency-KeyRequired for create: 8–100 letters, digits or . _ : -.
X-NeroPay-Public-KeyOptional. If supplied, it must match the sandbox secret.
X-NeroPay-AccountNot supported for sandbox creation. No connected-account routing.

Sandbox API requests do not require the live write-signature headers. Callback signatures are separate and are described below.

Keep secrets server-side, including when using JavaScript examples. Live keys cannot authenticate in sandbox; test keys cannot authenticate against the live API. Rotating sandbox keys does not rotate live keys.

Three aliases share the same isolated payment records.

POST/v2/sandbox/hosted-payments

Create a simulated hosted payment.

POST/v2/sandbox/payment-links

Create the same simulated checkout through the payment-link alias.

POST/v2/sandbox/transactions

Create the same simulated checkout through the transactions alias.

Request fields

FieldValidation
identifierRequired string, maximum 100 characters.
amountRequired number, 0.01–10,000; rounded to two decimal places.
currencyGBP, EUR or USD (lowercase is also accepted).
detailsOptional string, maximum 500 characters.
ipn_urlOptional public HTTPS callback URL, maximum 1,000 characters.
success_url / cancel_urlOptional public HTTPS return URLs, maximum 1,000 characters each.

Do not send account_id, merchant_id, connected-account routing fields, on_behalf_of, card_number, cvc, cvv or payment_method. They are rejected; no real payment instrument is used.

Idempotency

The same key and same validated parameters return the existing test payment. Reusing a key with different parameters returns HTTP 409. Use a new key for a new simulated order. The aliases share this key space; repeated requests do not create separate copies.

Lookups & pagination

GET/v2/sandbox/hosted-payments

List your test records.

GET/v2/sandbox/hosted-payments/{id}

Retrieve one test payment.

The same GET collection and GET-by-ID paths are supported under /payment-links and /transactions. The ID is test_pay_ followed by 64 hexadecimal characters. Only records belonging to the authenticated merchant are returned.

Lists are newest first, 20 records per page. Use ?page=2 for the next page. The response has data, page and last_page; it does not use the live API pagination envelope.

Checkout simulator

Choose one terminal outcome. Nothing is charged.

Choicestatuspayment_statusEvent
Successpaidsucceededtransaction.succeeded
Failurefailedfailedtransaction.failed
Cancellationcancelledcancelledtransaction.cancelled

A fresh payment starts with status: open and payment_status: null. Completion is single-use: choosing a result again does not create another event. Create a new payment with a new idempotency key to test another outcome.

Checkout expires after 24 hours (HTTP 410). The simulator presents a return button instead of automatically redirecting to an external site. Do not treat arrival at a return URL as proof of payment; verify the API result or signed notification.

This flow does not test real card authorisation, 3DS, settlement, refunds, terminals or bank payouts. It does not require Stripe test-card numbers.

Sandbox webhooks & retries

Configure up to three endpoints in Developer → Sandbox mode → Webhooks. Only enabled endpoints subscribed to the selected outcome receive the JSON event.

Supported events: transaction.succeeded, transaction.failed, transaction.cancelled. Sandbox endpoint management is in the dashboard, not a public sandbox webhook-management API.

Verify JSON signatures

Compute lowercase hexadecimal HMAC-SHA256(timestamp + "." + raw_request_body, webhook_signing_secret) and compare it in constant time with X-NeroPay-Signature. Read the timestamp from X-NeroPay-Timestamp, enforce an appropriate freshness window and deduplicate X-NeroPay-Event-Id. Do not re-serialize the JSON before verifying.

Headers also include X-NeroPay-Environment: sandbox and X-NeroPay-Delivery. The event contains id, type, created_at, livemode: false, environment: sandbox and payment data. Checkout URLs and capability tokens are excluded from the callback.

Delivery behaviour

The first attempt runs after the simulator response. Failed or pending deliveries can be retried from Developer: at least one minute apart, at most five total attempts, and within ten hours of creation. Sandbox deliveries do not use the live automatic redelivery queue. A delivered event is not resent by this test retry action.

Return HTTP 2xx promptly. Test callbacks have a five-second timeout and a 64 KB response limit. Public HTTPS hostnames on port 443 with publicly routable IPv4 resolution are required; localhost, private/reserved IPs, embedded credentials, URL fragments and redirects are not supported.

Hosted-payment IPN

Supplying ipn_url when creating a payment adds a form-encoded callback for the simulated outcome. This is separate from the dashboard's JSON webhook endpoints; do not process the same order twice if you enable both.

Validate the form field signature using uppercase hexadecimal HMAC-SHA256(data.amount + identifier, sandbox_API_secret). Use the exact amount string received, including eight decimal places, not a floating-point reconstruction.

Top-level status is success, failed or cancelled; success is not named succeeded in this form payload. The form includes environment=sandbox and livemode=false as strings. data.currency is an object with code and symbol.

Limits, errors & unavailable operations

LimitValue
API requests30 per minute per merchant.
Request body16 KB maximum.
New test payments100 in the preceding 24 hours.
Stored test payments2,000 maximum.
Webhook endpoints3 per merchant.
Checkout validity24 hours.

Developer → API → Clear expired test records removes expired test payments and test logs/deliveries older than seven days. It does not delete keys, webhook settings or live data. Test API logs retain up to 500 recent entries and exclude credentials and raw request bodies.

Common HTTP results

401: invalid/mismatched test credentials. 403: unsupported operation. 404: payment not found for this merchant. 409: idempotency conflict. 410: checkout expired. 413: request too large. 422: invalid fields or unsafe URL. 429: rate, payment or storage limit. 503: sandbox storage has not been installed.

Balances, transfers, payouts, refunds, bank accounts, connected-account routing, terminals and live resource changes are unavailable. Requests outside the supported paths/methods fail closed; they do not fall back to the live API. Old generic dry-run resource and terminal endpoints are not supported by this sandbox.

Ready plugins & going live

Prefer an existing integration? Browse ready-to-use plugins. Supported plugin flows do not require custom API development, but installation, account setup and credentials may still be required. Check each plugin's own sandbox compatibility; this simulator does not automatically add sandbox support to every plugin.

When ready, switch this reference to LIVE and follow the live authentication and endpoint contract. Configure separate production credentials and callbacks. Sandbox records and outcomes are not migrated into real transactions, and this selector does not activate live payments.

AI Reception API

Manage your business receptionist, opening hours, voices, service availability and customer follow-ups from your server.

Base URL: https://eu.neropay.app/v2/ai-reception. This is a live, merchant-owned management API. Calls, orders and bookings continue through the existing receptionist and integrated business workflows.

Access and subscription

An active AI Reception subscription is required on every request. Starter includes 100 minutes and one UK number for £49.90/month including VAT. Growth includes 250 minutes and one UK number for £99.90/month including VAT. Cancelling renewal preserves access until the paid period ends. Pending, failed or expired subscriptions do not grant API access. Explicit complimentary access grants are reported as complimentary: true; they are not paid subscriptions.

The subscription can be purchased and managed in AI Reception in the merchant dashboard. The API does not purchase, cancel or change subscription payment methods. Additional minutes on paid plans cost £1 per started minute when enabled, subject to the spending cap. SMS uses the merchant's existing SMS tariff and GBP balance. Complimentary grants have a calendar-month allowance and do not support additional-minute billing.

Authentication

Send Authorization: Bearer YOUR_LIVE_SECRET_KEY and Accept: application/json. The alternative X-NeroPay-Secret-Key header is supported; conflicting credentials are rejected. X-NeroPay-Public-Key is optional and must match when supplied. Keys remain on your server.

Use the workspace owner's credentials. NeroPay-Account, merchant/account routing fields and connected-account delegation are not supported. An active merchant account is required. These software endpoints do not require payment-account onboarding or a browser bot challenge; authentication, subscription and request limits still apply. No sandbox endpoints are provided.

Writes and retries

For every POST, PUT or PATCH, send a JSON object, Content-Type: application/json and an 8–100 character Idempotency-Key containing letters, numbers, dots, underscores, colons or hyphens. Send write fields in the body, without query parameters. Reuse the same key and exact body for a retry of the same operation. A completed result is replayed with Idempotency-Replayed: true. Reusing a key with a different method, path or body returns 409. Use a new unique key for each new operation.

If your merchant account requires signed API writes, also send X-NeroPay-Timestamp (Unix seconds, within five minutes) and X-NeroPay-Signature (hexadecimal HMAC-SHA256 of timestamp + "." + raw_json_body using your secret key). Supplied signatures are always checked, even when optional. A retry can use a fresh signature with the same body and idempotency key.

An uncertain service failure is marked for review and is not automatically run again. Inspect the dashboard state before attempting a new operation; contact support if the result is unclear. Idempotency records follow the workspace retention policy, and keys must never be recycled.

Limits and errors

Maximum body: 128 KiB. Maximum JSON depth: 32. Writes: 20/minute per merchant; reads: up to 120/minute per merchant. Application and IP limits also apply. Use Retry-After on 429. Uploads, raw card credentials and live outbound-call creation are not supported.

HTTPMeaning
401Missing, invalid or expired credentials/signature.
402No active AI Reception entitlement.
403Inactive account or operation not permitted.
404Resource not found in this merchant workspace.
409Workspace busy, retry-key conflict, setup incomplete or prior result needs review.
413 / 415 / 422Oversized request, wrong content type or invalid fields.
429Request limit reached.
503Service or installation unavailable. Inspect workspace state before retrying writes.

Settings, tools & MCP

GET /settings returns the settings object in data. PUT /settings saves a complete settings object. Read, edit and send it back so omitted values are not accidentally reset. This is not a partial PATCH endpoint. Voice and instructions take effect after POST /publish; integration and accepting switches apply immediately.

FieldsRules
business_name / prompt / first_messageRequired strings, up to 120 / 10,000 / 1,000 characters.
knowledge / guardrailsOptional text, up to 20,000 / 5,000 characters.
voice_idID returned by GET /voices; required before publishing.
language / languagesPrimary language must be in the 1–11 supported languages: en, tr, de, fr, es, it, pt, nl, pl, ar, hi.
timezone / hoursIANA timezone and exactly seven objects, Monday first. Each needs closed (boolean), open and close (HH:mm). Earlier closing time means overnight. Equal times provide no open interval.
outside_hourscallback or hangup; closed_message and busy_message required, up to 500 characters each.
transfer_number / transfer_sipOptional supported UK +44 geographic/mobile destination, or sip:user@host (optional port 5060/5061). Cannot loop to the reception number.
receipt_channel / sms_enabledemail, sms or none; SMS requires the merchant setting and recipient consent. Existing SMS fees apply.
save_customer / record_voiceBoolean preferences; existing consent and disclosure rules apply. No raw card data.
retention_days / max_call_seconds7–90 days / 60–600 seconds. Re-publish to apply the call duration.
overage_enabled / spend_cap_pence / wallet_fallbackBoolean / integer 0–50,000 pence / boolean. Additional minutes cannot be enabled on complimentary grants.
integrations / acceptingBoolean maps for neroweb, nerobooking, nerogym, nerotrade and neroconnect. Accepting does not enable an unconfigured integration.
tools / mcpArrays, including empty arrays. Maximum 10 custom tools and 4 MCP connections.

Custom tools and MCP

Custom tool fields: name (custom_ followed by 1–40 lowercase letters, digits or underscores), public HTTPS url, description up to 1,000 characters, object JSON schema up to 10 KB, optional bearer token and approved: true.

MCP fields: unique name up to 80 characters, public HTTPS url, transport (SSE or STREAMABLE_HTTP), optional token and approved: true. Approval authorises the endpoint's tools to run during conversations. Private IPs, URL credentials, fragments and non-443 ports are rejected.

Tokens and internal connection identifiers are never returned. GET reports has_token. Omitting or leaving a token empty preserves the existing secret only when connection name and URL match. Remove the connection to remove its credential. The whatsapp_enabled field is read-only here; use POST /whatsapp.

Publish & live availability

Paths below are relative to /v2/ai-reception. Writes require the authentication and retry headers above.

Method & pathBody / result
GET /Active/enabled state, number, readiness, publication date, subscription, number_billing, minutes, plan definitions, SMS fee and WhatsApp availability.
GET /voicesVoice catalogue: id, name and labels. Choose a returned ID; preview is available in the dashboard.
GET /numbers?type=national&contains=0333UK number catalogue. type: local, national or tollfree. contains: optional 2–6 digit UK prefix, e.g. 020, 0333, 0800 or 0808. Response data contains items, cursor and message. Each item contains number, label, locality, type, premium, monthly_extra_pence, currency, vat_included, quote and quote_expires_at. Pass the returned cursor with unchanged filters to refresh for different available choices. Quotes and cursors are merchant-bound and expire after 15 minutes. Numbers and prices are rechecked before purchase.
POST /number{"number":"+442012345678","quote":"RETURNED_QUOTE"} — reserve one included UK number. The matching quote is required. Premium choices return 402 and require the merchant to approve the extra £20/month including VAT in the dashboard payment drawer. The API cannot silently start premium billing. Existing assigned numbers are not replaced by refresh. A number with unpaid premium rental cannot activate reception.
POST /publish{} — publish current voice, prompt, hours and tools. Choose a voice first. Number selection and activating reception are separate steps.
PATCH /availabilityOptional enabled boolean and/or accepting map. Activating reception requires a number and a published agent. Disabling pauses reception and a connected messaging agent.
POST /whatsapp{"enabled":true} — connect an operations-verified WhatsApp business number. Reception must be enabled first. false disconnects.

Suggested setup sequence

  1. Read GET / and GET /settings.
  2. Select a voice from GET /voices, save the complete settings with PUT /settings.
  3. Choose an included number with GET /numbers and POST /number using its returned quote. For premium choices, complete the merchant dashboard checkout first.
  4. Publish with POST /publish and activate with PATCH /availability.
  5. Test an inbound call, then inspect GET /calls and GET /usage.

NeroWeb orders and NeroBooking appointments use their existing validation, payment and fulfilment flows. NeroGym, NeroTrade and NeroConnect integrations currently handle information and callback enquiries. They do not create memberships or wholesale/partner orders. Caller card details must go through secure hosted checkout.

WhatsApp ownership and service configuration must be verified before connection. API activation does not register a new WhatsApp business account. Dashboard or API access alone does not allocate a phone number or make an unconfigured receptionist answer calls.

Calls, callbacks & usage

List endpoints accept page (1–10,000, default 1) and per_page (1–100, default 25). The response data contains items, page, per_page and has_more. Records are newest first. All IDs are scoped to the authenticated merchant.

Method & pathReturned fields / operation
GET /callsid, channel, caller, state, duration_seconds, minutes, summary and created_at.
GET /calls/{id}One call by UUID. Returns 404 for another merchant's call. No audio, raw transcript, provider identifier or call-context credential is exposed.
GET /callbacksid, state, created_at and details. Details contain the consented callback enquiry; they are personal data.
PATCH /callbacks/{id}{"state":"completed"} — mark one callback UUID complete. This does not place a telephone call.
GET /usageid, call_id, minutes, amount_pence, state, payment_method and created_at. Amounts are integer GBP pence.

Phone duration is verified before final usage is recorded; in-progress calls can show zero minutes. Started minutes are rounded up. Included usage has zero amount and payment_method included. Additional paid usage follows the existing saved-card and configured balance-fallback collection flow. This endpoint cannot submit or alter billable usage.

Use the workspace overview for current-period minutes and subscription status. Data is subject to the workspace retention policy, so old summaries and enquiry details may be empty. No public receptionist tool-execution, raw payment, receipt-send or outgoing-call endpoint is exposed by this API.

NeroPay Docs

Documentation library

Explore all documentation ↗
On this API page

Developer resources

Live API referenceSandbox API reference

Product documentation

Browse the documentation library

Help & updates

SupportChangelogSystem status ↗