Migration from another E-PRO gateway
Point an existing E-PRO integration at this gateway with minimal changes
Why this is straightforward
Our V1 public API reuses the E-PRO wire contract: request field names, response envelope, and the numeric error code catalog. In most cases, migrating from another E-PRO-compliant gateway means changing the host and the API key header — no payload changes.
Separate hosts are used per environment:
https://api.sandbox.settleflow.io(test,pk_test_keys) andhttps://api.settleflow.io(production,pk_live_keys).
Key differences to verify
Before you change any configuration, review the short list of things that differ from a typical legacy E-PRO provider:
| Item | This gateway V1 | Notes |
|---|---|---|
| Host | Sandbox api.sandbox.settleflow.io / prod api.settleflow.io | Separate hosts; the host must match the key prefix. |
| Auth header | epro-api-key: pk_test_... or pk_live_... | Header name is lowercase, hyphenated. |
| Endpoint paths | /v1/payment/direct, /v1/status, /v1/refund | The /direct form of status/refund also works — see Endpoint URLs. |
| Content-Type | application/json or application/x-www-form-urlencoded | The legacy form-encoded body is accepted unchanged. |
| Response envelope | { "Code": 0, "Result": { ... } } | Identical to the E-PRO "standard response". |
| HTTP status | Always HTTP 200, even on errors | Inspect Code, not the HTTP status. |
| Refunds | Full refund only (no Amount parameter) | Contact your account manager for partial refunds. |
| Webhooks | Configured in the dashboard, per mode | Account-level endpoint, not per request. See Webhooks. |
| Webhook signature | HMAC-SHA256 of timestamp + "." + rawBody with whsec_... | X-SettleFlow-Signature header. |
| Partial capture | Not supported in V1 | Payments are authorized + captured together. |
Step-by-step migration
1. Request credentials
Ask your account manager for:
- A sandbox API key (
pk_test_...) and webhook secret. - A production API key (
pk_live_...) and webhook secret (issued once sandbox validation passes).
2. Update your HTTP client
In your existing code, swap:
- POST https://legacy-epro.example.com/payment/direct
- Header: API-KEY: <legacy-key>
+ POST https://api.sandbox.settleflow.io/v1/payment/direct
+ Header: epro-api-key: pk_test_...The request body can remain identical — the canonical E-PRO field names are accepted. See the Payment reference for the full field list.
Endpoint URLs
Our V1 paths mirror the original E-PRO shape under the /v1 prefix:
| Operation | Path | Also accepted |
|---|---|---|
| Payment | /v1/payment/direct | — |
| Status | /v1/status | /v1/status/direct |
| Refund | /v1/refund | /v1/refund/direct |
So an existing E-PRO integration calling /payment/direct, /status and /refund only needs to prefix the path with /v1 (and change host + API key header). The /direct form of status/refund is kept as an alias, so integrations that already use it keep working.
Content-Type & amounts. The legacy application/x-www-form-urlencoded body is accepted
alongside application/json. Amount (and OriginalAmount) may be sent as a string ("1234",
the E-PRO convention) or a JSON number (1234) — both are normalized server-side.
3. Validate response handling
Confirm that your existing response parsing handles the E-PRO envelope unchanged:
{
"Code": 0,
"Result": {
"OperationType": "payment",
"Status": "captured",
"Tid": "order-2026-001",
"Reference": "pr_abc123",
"Amount": "49.99",
"Currency": "EUR",
"UserId": "customer-42",
"Message": "Payment was successful",
"Date": "2026-04-22 14:30:45",
"3DSecure": "no"
}
}If your previous provider returned non-200 HTTP codes for errors, adjust the client: we always return HTTP 200.
Value formats
These match the legacy E-PRO gateway exactly, on all three surfaces: this reply, the ReturnUrl POST, and the notification.
| Field | Format |
|---|---|
Amount | A quoted decimal string with two places — "49.99", "50.00". Never a bare JSON number, never "50". |
Date | YYYY-MM-DD HH:mm:ss in Europe/Paris. No offset in the string, so convert with that zone in mind. |
Status, 3DSecure, OneClick | Lowercase strings. 3DSecure and OneClick are yes / no and are always present. |
The Amount you send is in minor units ("4999"); the Amount you receive is in major
units ("49.99"). That asymmetry is the legacy contract, not a mistake.
4. Re-validate error handling
The E-PRO numeric error codes follow the same catalog you already know — see Error codes. The full list is identical in numbering to E-PRO Integration Guideline v1.12.
A few codes are worth reviewing explicitly during migration:
3/4— authentication. Different from your previous provider's auth errors; wire them up to the same alerting you had before.104("TID already used") — same semantics, triggered if you replay the sameTid.222— only fires when the merchant configuration demands extra fields (e.g.BirthDate). Ask your account manager if any appear unexpectedly.
5. Webhooks
Just like legacy E-PRO (where the notification URL is set in the portal account preferences), webhooks are configured at the account level — in the merchant dashboard, separately for each mode (Live / Sandbox). There is no per-request callback parameter; register your endpoint once per mode and every matching event is posted to it.
The payload delivered is the same E-PRO "standard response" shape, so your existing webhook handler should accept it unchanged. What's new:
- Your handler must verify the
X-SettleFlow-Signatureheader (see Webhooks → Signature verification). - Retries are capped at three attempts (
5s,1min,5min).
6. 3DS flow
If your legacy integration already handles a 3DSecureUrl redirect + polling, nothing changes. We emit the same field — see 3D Secure. The return to your ReturnUrl is also a POST by default, exactly as on the legacy gateway, so your existing return handler keeps reading the outcome from the request body. Make sure your ReturnUrl points at your production domain before going live, and that you have a fallback to /v1/status if the customer never returns.
7. Dual-run in sandbox, then cut over
Recommended rollout:
- Point your sandbox / staging traffic here while leaving production on the legacy gateway.
- Replay a representative set of payment, 3DS, refund and status flows. Validate the webhook delivery against the sandbox checklist.
- Promote the new credentials to production. Keep the legacy integration's code behind a feature flag for one billing cycle in case of rollback.
Field mapping cheat-sheet
Commonly asked — here is the spelling we expect for the most-used fields (E-PRO canonical naming):
| Purpose | Our field | E-PRO canonical |
|---|---|---|
| Order reference | Tid | ✅ |
| Customer identifier | Uid | ✅ |
| Amount (minor units) | Amount | ✅ |
| Card number | CardNumber | ✅ |
| Card expiry month | CardMonth | ✅ |
| Card expiry year | CardYear | ✅ |
| Card CVV | CardCVV | ✅ |
| Return URL (3DS) | ReturnUrl | ✅ |
Getting help
If you run into migration-specific edge cases — custom fields, dual-routing, account-level requirements — contact your account manager. Keep a handful of Tid / Reference pairs from failed transactions so support can reproduce.