1. 7. Payment Providers (PSPs)
Mozarto - The Payments Orchestration Platform
  • 1. Introduction
  • 2. Quick Start
  • 3. Authentication
  • 4. Webhook Setup
  • 5. Errors
  • 6. Redirect flow
    • Pay-In Flow
    • Pay-Out Flow
  • 7. Payment Providers (PSPs)
    • Overview
    • Brite
    • CashLib
    • Cleo
    • Contiant
    • emerchantpay
    • Flexepin
    • ForumPay
    • Gigadat
    • Neosurf
    • OFApay
    • PayModum
    • PayOne
    • PawaPay
    • Trust Payments
    • Worldpay
  • 8. Redirect Flow APIs
    • Redirect Flow APIs - overview
    • Pay-In
      • Brite
      • CashLib
      • Cleo
      • Contiant
      • emerchantpay
      • Flexepin
      • Forumpay
      • Gigadat
      • Neosurf
      • OFApay
      • PayOne
      • PawaPay
      • Trust Payments
      • WorldPay
    • Pay-Out
      • Cleo
      • Forumpay
      • Gigadat withdraw ACH
      • Gigadat withdraw ETO
      • PawaPay
      • PayOne
      • Trust Payments
  • Webhook
    • ForumPay status webhook
    • PayOne status webhook
  • Schemas
    • TransactionData
  1. 7. Payment Providers (PSPs)

PayOne

Bank transfer via Interac for Canada. Supports Pay-In and Pay-Out.
Note: PayOne processes Interac bank transfers in Canada only. Use "CAD" as the currency.
Note: For Pay-In, the user selects Interac e-Transfer on the PayOne hosted page and then manually enters the payment amount in their own bank app. A user can enter the wrong amount (for example 100 instead of 1.00). PayOne records the amount actually received from the bank, not the original baseamount, and reports the received amount in the webhook. See Amount mismatch on Interac e-Transfer for details.
Note: phone is sent to PayOne as the payer's mobile on Pay-In and phone on Pay-Out. If you omit it, Mozarto falls back to the phone number on the authenticated user's profile (x-user-token). A phone in the body always takes precedence over the profile value.
Operations: Pay-In ✓ | Pay-Out ✓ | Webhook ✓
Processing: Asynchronous - redirect user to hosted page; final status via webhook
Fields marked with * are required.

Configuration (Mozarto back office)#

FieldDescription
accountName *Display name for this account
apiKey *PayOne API key
webhookUrl *Your HTTPS endpoint for transaction status updates
siteUrl *Your site URL - used by PayOne to build redirect URLs after payment

Pay-In#

POST /v1/api/mozarto/cashier

Request body#

FieldTypeDescription
pspType *stringAlways "PAYONE"
type *stringAlways "PAYIN"
baseamount *numberAmount as a number (e.g. 100.00)
currency *stringCurrency code - must be "CAD"
currencyCode *stringCurrency code - must be "CAD"
userId *stringYour internal user/player identifier
email *stringUser's email address
country *stringPayer's country - full name, ISO 3166-1 alpha-2, or alpha-3 (e.g. "Germany", "DE", "DEU"). Matched against the account's Processing Scope. Omit it and Mozarto geo-locates the caller's IP instead - see Country
firstName *stringUser's first name
lastName *stringUser's last name
phone *stringPhone number (min 6 digits)
siteUrlstringPer-transaction redirect URL. Overrides the siteUrl from your configuration for PayOne's post-payment redirect

Example request#

{
  "pspType": "PAYONE",
  "type": "PAYIN",
  "baseamount": 100.00,
  "currency": "CAD",
  "currencyCode": "CAD",
  "country": "CA",
  "userId": "user_123",
  "email": "player@example.com",
  "firstName": "John",
  "lastName": "Doe",
  "phone": "4915112345678"
}

Response#

{
  "status": "success",
  "message": "Transaction successfully processed",
  "isSuccess": true,
  "data": {
    "success": true,
    "message": "Transaction successfully Ongoing Process ",
    "redirect_url": "https://demo.payonepayment.com/webflow-payment/<reference>/<token>",
    "transactionId": "64a1f2b3c4d5e6f7a8b9c0d1",
    "merchantReference": "",
    "amount": 10
  }
}
Note: PayOne uses data.redirect_url - not data.url as returned by other providers. Update any redirect logic accordingly.
FieldDescription
data.redirect_urlHosted Interac payment page URL - redirect the user here. Format: https://demo.payonepayment.com/webflow-payment/<reference>/<token>
data.successtrue when PayOne accepted the transaction
data.messagePayOne status message - informational only
data.transactionIdMozarto transaction ID - use for status queries and idempotency
data.amountTransaction amount as a number

Pay-Out#

POST /v1/api/mozarto/cashier
Uses the same request body as Pay-In with type set to "PAYOUT". All required fields remain the same.

Response#

{
  "status": "success",
  "message": "Withdraw request successfully processed",
  "isSuccess": true,
  "data": {
    "success": true,
    "message": "Withdraw request successfully processed",
    "withdraw": {
      "client": "Your account name",
      "brand": "Your account name",
      "userId": "000000000000000000000001",
      "transactionId": "HS932097JV",
      "first_name": "John",
      "last_name": "Doe",
      "email": "merchant@example.com",
      "phone": "07700900000",
      "userIp": "203.0.113.42",
      "currency": "CAD",
      "siteUrl": "https://your-site.com/operations",
      "amount": "10.00",
      "date": "2026-04-30",
      "status": "Pending"
    },
    "transactionId": "64a1f2b3c4d5e6f7a8b9c0d1",
    "merchantReference": "",
    "amount": 10
  }
}
FieldDescription
data.transactionIdMozarto transaction ID - use for status queries and idempotency
data.amountTransaction amount as a number
data.withdraw.transactionIdPayOne internal transaction ID
data.withdraw.statusInitial status - always "Pending" on creation
data.withdraw.siteUrlThe siteUrl from your configuration
data.withdraw.userIpIP address of the request origin

Webhook#

Mozarto calls your webhookUrl when the transaction reaches a final state. The payload is identical for Pay-In and Pay-Out - it carries no flow indicator. Match transaction_id against the cashier call to distinguish them.

Payload example#

{
  "transaction_id": "69f8a54b2beab46cc6a51149",
  "psp_transaction_id": "HS923856HU",
  "user_id": "000000000000000000000001",
  "status": "Declined",
  "transaction_status": "Declined",
  "message": "Declined",
  "amount": "10.00",
  "merchantReference": ""
}
FieldDescription
transaction_idMozarto transaction ID - matches data.transactionId from the Pay-In/Pay-Out response
psp_transaction_idPayOne internal transaction ID - matches the ID embedded in data.redirect_url
user_idThe user ID passed in the original request
statusRaw PayOne status string - do not use for business logic
transaction_statusNormalized Mozarto status - use this for all business logic
messageHuman-readable description of the outcome
amountAmount PayOne actually received from the bank, as a string. May differ from the baseamount sent in the Pay-In request - see Amount mismatch on Interac e-Transfer
merchantReferenceThe merchant reference passed in the original request - empty string if not set

Amount mismatch on Interac e-Transfer#

Interac e-Transfer requires the user to manually enter the payment amount in their own bank app after being redirected from the PayOne hosted page. This manual step can introduce a mismatch between the amount your system requested and the amount PayOne actually receives - for example, a user enters 100 instead of 1.00.
PayOne treats the amount confirmed by the bank as authoritative:
1.
Your system creates the transaction with a baseamount (for example 1.00).
2.
The user enters an incorrect amount in their bank app (for example 100).
3.
PayOne receives the deposit confirmation from the bank API showing 100, credits the user for 100, and reports 100 as the amount in the webhook call - not the original 1.00.
4.
Mozarto updates the transaction with the amount from the webhook and forwards this webhook, including the corrected amount, to your webhookUrl.
Use the amount field from the webhook, not the baseamount from your original request, as the final settled amount for this transaction.

Error codes#

PayOne errors are mapped to normalized Mozarto errorCode values. Use errorCode for programmatic handling rather than parsing the raw data.error string.
Mozarto errorCodePSP raw signalWhen
INVALID_PSP_CREDENTIALSHTTP 404 (no PSP body)API key is missing, wrong, or the PayOne account is not active
INVALID_PSP_CREDENTIALSdata.error contains "Invalid account details"Credentials were accepted by the HTTP layer but rejected by PayOne
INVALID_PSP_CREDENTIALSdata.error contains "Invalid API key"API key format is valid but not recognised by PayOne
PSP_TIMEOUTHTTP 408 or response body contains "timeout"PayOne did not respond in time - safe to retry
PSP_UNAVAILABLEHTTP 5xxPayOne service error - safe to retry with backoff
PSP_RATE_LIMITEDHTTP 429Too many requests - retry after a delay
UNKNOWN_PSP_ERRORAny other responseUnrecognised error - check data.error for the raw message and contact support if it persists
For the full list of errorCode values and retryability guidance, see Errors.
Modified at 2026-09-14 11:34:13
Previous
PayModum
Next
PawaPay
Built with