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 100instead of1.00). PayOne records the amount actually received from the bank, not the originalbaseamount, and reports the received amount in the webhook. See Amount mismatch on Interac e-Transfer for details.
Note: phoneis sent to PayOne as the payer'smobileon Pay-In andphoneon Pay-Out. If you omit it, Mozarto falls back to the phone number on the authenticated user's profile (x-user-token). Aphonein the body always takes precedence over the profile value.
| Field | Description |
|---|---|
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 |
POST /v1/api/mozarto/cashier| Field | Type | Description |
|---|---|---|
pspType * | string | Always "PAYONE" |
type * | string | Always "PAYIN" |
baseamount * | number | Amount as a number (e.g. 100.00) |
currency * | string | Currency code - must be "CAD" |
currencyCode * | string | Currency code - must be "CAD" |
userId * | string | Your internal user/player identifier |
email * | string | User's email address |
country * | string | Payer'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 * | string | User's first name |
lastName * | string | User's last name |
phone * | string | Phone number (min 6 digits) |
siteUrl | string | Per-transaction redirect URL. Overrides the siteUrl from your configuration for PayOne's post-payment redirect |
{
"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"
}{
"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- notdata.urlas returned by other providers. Update any redirect logic accordingly.
| Field | Description |
|---|---|
data.redirect_url | Hosted Interac payment page URL - redirect the user here. Format: https://demo.payonepayment.com/webflow-payment/<reference>/<token> |
data.success | true when PayOne accepted the transaction |
data.message | PayOne status message - informational only |
data.transactionId | Mozarto transaction ID - use for status queries and idempotency |
data.amount | Transaction amount as a number |
POST /v1/api/mozarto/cashiertype set to "PAYOUT". All required fields remain the same.{
"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
}
}| Field | Description |
|---|---|
data.transactionId | Mozarto transaction ID - use for status queries and idempotency |
data.amount | Transaction amount as a number |
data.withdraw.transactionId | PayOne internal transaction ID |
data.withdraw.status | Initial status - always "Pending" on creation |
data.withdraw.siteUrl | The siteUrl from your configuration |
data.withdraw.userIp | IP address of the request origin |
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.{
"transaction_id": "69f8a54b2beab46cc6a51149",
"psp_transaction_id": "HS923856HU",
"user_id": "000000000000000000000001",
"status": "Declined",
"transaction_status": "Declined",
"message": "Declined",
"amount": "10.00",
"merchantReference": ""
}| Field | Description |
|---|---|
transaction_id | Mozarto transaction ID - matches data.transactionId from the Pay-In/Pay-Out response |
psp_transaction_id | PayOne internal transaction ID - matches the ID embedded in data.redirect_url |
user_id | The user ID passed in the original request |
status | Raw PayOne status string - do not use for business logic |
transaction_status | Normalized Mozarto status - use this for all business logic |
message | Human-readable description of the outcome |
amount | Amount 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 |
merchantReference | The merchant reference passed in the original request - empty string if not set |
100 instead of 1.00.baseamount (for example 1.00).100).100, credits the user for 100, and reports 100 as the amount in the webhook call - not the original 1.00.amount, to your webhookUrl.amount field from the webhook, not the baseamount from your original request, as the final settled amount for this transaction.errorCode values. Use errorCode for programmatic handling rather than parsing the raw data.error string.Mozarto errorCode | PSP raw signal | When |
|---|---|---|
INVALID_PSP_CREDENTIALS | HTTP 404 (no PSP body) | API key is missing, wrong, or the PayOne account is not active |
INVALID_PSP_CREDENTIALS | data.error contains "Invalid account details" | Credentials were accepted by the HTTP layer but rejected by PayOne |
INVALID_PSP_CREDENTIALS | data.error contains "Invalid API key" | API key format is valid but not recognised by PayOne |
PSP_TIMEOUT | HTTP 408 or response body contains "timeout" | PayOne did not respond in time - safe to retry |
PSP_UNAVAILABLE | HTTP 5xx | PayOne service error - safe to retry with backoff |
PSP_RATE_LIMITED | HTTP 429 | Too many requests - retry after a delay |
UNKNOWN_PSP_ERROR | Any other response | Unrecognised error - check data.error for the raw message and contact support if it persists |
errorCode values and retryability guidance, see Errors.