Developers

Build on a clean, predictable API.

One REST API over acceptance, orchestration and settlement. Idempotent writes, a single status model across every payment method, signed webhooks as the source of truth, and a sandbox for the cases that are hard to produce on purpose.

Architecture

One API over every capability

Your systems talk to one gateway. Behind it, acceptance, orchestration and settlement are separate concerns with risk controls in line and a ledger underneath, so adding a provider, a method or a market does not change your integration.

  • One payment resource for cards, wallets, bank rails and local methods
  • Provider differences normalised before they reach your code
  • Risk screening and routing applied in line, not bolted on
  • A ledger that ties every payment to the settlement that paid it
Unified APIAcceptanceOrchestrationSettlementRisk · KYC/KYB · Sanctions · Fraud scoringwebhooks · routing · ledger · reconciliation
Integration options

Three ways to connect

They differ in how much of the checkout you own and how much compliance scope you take on. All three produce the same payment object and the same webhooks.

Hosted payment page

Redirect to a Flowa Pay-hosted checkout. Card data never touches your systems, new methods appear without a release, and the integration is a redirect plus a webhook handler. Smallest compliance scope, fastest to live.

Embedded checkout

Drop-in components keep the customer on your page while the card fields stay in an isolated payment surface. Your design, without the card data entering your application.

Server-to-server

You build the entire interface and submit payment details through the API. Maximum control, and the largest compliance obligation, because card data passes through systems you operate.

•••• 8419PayHosted pageredirect•••• 8419PayEmbeddedyour page•••• 8419PayHeadlessyour APIsame payment object · same webhooks · same reconciliation
Authentication

Keys, environments and scope

  • API keys are server-side only. A key must never reach a browser or a mobile binary.
  • Test and live are separate credentials over separate data. A test key cannot touch live objects.
  • Keys are scoped to the actions your account is enabled for, and can be rotated without downtime.
  • Every request is authenticated and carried over TLS; unauthenticated requests are rejected outright.

API credentials and sandbox access are issued as part of merchant onboarding, once your account is approved. Availability depends on merchant category, jurisdiction, underwriting and the applicable payment or acquiring partner.

Idempotency

Retries that cannot double-charge

  • Send an idempotency key on every mutating request, derived from your own order or reference.
  • Retrying with the same key returns the original result instead of creating a second payment.
  • Reusing a key with a different payload is rejected rather than silently accepted.
  • This is what makes a network timeout a safe condition rather than an accounting problem.
Quickstart

One call, any method

Create a payment, then follow the next action the response gives you. The same request shape works whether the customer pays by card, wallet or bank transfer: the method is a parameter, not a different integration.

The API is REST over HTTPS with JSON bodies, so it is callable from any language without a vendor library. Examples illustrate the documented interface; the full reference is issued with your sandbox credentials.

curl https://api.flowapay.co/v1/payments \
  -H "Authorization: Bearer $FLOWA_KEY" \
  -H "Idempotency-Key: ord_1837" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "1200.00",
    "currency": "EUR",
    "method": "card",
    "reference": "ord_1837",
    "return_url": "https://yourshop.com/return"
  }'

# 201 Created
{
  "id": "pay_8f2c41",
  "status": "requires_action",
  "next_action": { "type": "redirect", "url": "https://..." },
  "amount": "1200.00",
  "currency": "EUR"
}
Payment lifecycle

One status model, every method

A bank redirect, a wallet confirmation and a card authorization are very different events. They produce the same states, so your state machine does not branch per provider.

1Collectcard or wallet2Authenticate3-D Secure 23Authorizeissuer decision4Capturenow or later5Settleto your account
createdThe payment exists and is awaiting its next action. Nothing has been charged.
requires_actionThe customer must do something: authenticate, approve in their bank, or complete a redirect.
processingSubmitted to the selected route and awaiting the provider or rail. Asynchronous methods can sit here for minutes.
authorizedApproved by the issuer. Funds are reserved but not yet captured.
capturedThe authorization has been captured and the amount is owed to you.
settledIncluded in a settlement and paid out, with a statement line to reconcile against.
failedDeclined or expired, with a normalised reason code and a retryable flag.
refundedFully or partially returned to the customer, carrying its own lifecycle.
disputedA chargeback or dispute has been raised against the payment.
Reference

Core endpoints

POST/v1/paymentsCreate a payment for any enabled method and route it
GET/v1/payments/:idRetrieve a payment with its full status timeline
POST/v1/refundsRefund a payment in full or in part
POST/v1/payoutsInitiate a payout to a stored beneficiary
POST/v1/customersCreate a customer and attach a stored credential
GET/v1/balancesRead settled and available balances by currency

Which endpoints and methods are enabled depends on the capabilities approved for your account during onboarding.

Webhooks

The authoritative channel

A browser redirect can be interrupted, a tab closed, a mobile connection dropped. No integration should treat the customer's return as confirmation. Webhooks are delivered server to server and are the result of record.

  • Verify the signature. Every payload is signed with your endpoint secret. Reject anything that does not verify.
  • Be idempotent. Delivery is at least once. Each event carries a stable id, so de-duplicate on it.
  • Acknowledge fast. Return 2xx immediately and do your own work asynchronously; slow handlers trigger retries.
  • Expect retries. Failed deliveries are retried with backoff until acknowledged.
payment.createdA payment object was created.
payment.requires_actionCustomer action is needed to continue.
payment.succeededAuthorized or captured, depending on your capture mode.
payment.failedDeclined or expired, with the reason attached.
refund.succeededA refund completed.
payout.updatedA payout changed state, including returns and failures.
settlement.createdA settlement was generated with its statement.
dispute.createdA chargeback or dispute was raised.
Error model

Failures you can branch on

Every error returns a stable machine-readable code, a human-readable message and whether retrying could help. You should never have to parse prose to decide what to do.

HTTPcodeMeaning · retryable
400invalid_requestA field is missing or malformed. The response names the field. · retry: No
401authentication_failedThe API key is missing, wrong for the environment, or revoked. · retry: No
403not_permittedThe key is valid but the account is not enabled for this action or method. · retry: No
404not_foundNo object with that identifier in this environment. · retry: No
409idempotency_conflictThe idempotency key was reused with a different payload. · retry: No
422payment_declinedThe provider or issuer declined. Carries the normalised decline reason. · retry: Sometimes
429rate_limitedToo many requests. Back off using the Retry-After header. · retry: Yes
5xxprocessing_errorA fault on our side or the route's. Retry with the same idempotency key. · retry: Yes
Testing

Sandbox

A separate environment with its own credentials and its own data, built for the cases that are hard to produce deliberately in production: a specific decline reason, an authentication challenge, an asynchronous method that completes minutes later, a webhook retry after a failed delivery. Build against those before go-live rather than meeting them in production.

01

Deterministic outcomes

Trigger approval, each decline reason, and authentication challenge or frictionless paths on demand.

02

Asynchronous flows

Exercise redirect-based and delayed-confirmation methods, including the pending state your UI must handle.

03

Webhook delivery

Test signature verification, duplicate delivery and retry behaviour against your real endpoint.

In production

Operating the integration

Versioning

Breaking changes ship under a new version. Existing versions keep working, and changes are announced before they take effect.

Rate limits

Limits are applied per account. A limited request returns 429 with a Retry-After header, so back-off is deterministic rather than guesswork.

Observability

Every payment records the route taken, the decision returned and the rule that selected it, which is what makes a production incident diagnosable.

Reconciliation

Pull settlements and their statement lines through the API so your ledger matches ours without manual export.

Security

Server-side credentials, signed webhooks, request validation and tokenization keep card data out of your systems on hosted and embedded integrations.

Support

Integration questions go to a named contact during onboarding, with solution engineering for enterprise rollouts.

FAQ

Developer FAQ

Start building

Talk to us about your stack and the methods you need, and we will scope the integration with you.