Skip to main content

Send Your First Payment

Now that your customers have accounts, they can send payments across Europe. Inventi routes your SEPA payments through CENTROlink (Bank of Lithuania) and EKS (Bank of Latvia) — giving you direct access to European clearing networks.
What happens when you send a payment:
  1. You submit the payment via API
  2. Inventi validates and forwards to CENTROlink or EKS
  3. The clearing system routes to the beneficiary bank
  4. You receive status updates via webhooks

Supported Payment Types

SEPA Credit Transfer

Standard transfers with next business day settlement

SEPA Instant

Real-time payments settled in under 10 seconds

API Reference

Business Requirements

Always send an Idempotency-Key header when creating payments. If your request times out, retry with the same key to prevent duplicate payments.
Without idempotency, network retries can result in duplicate transactions.
The create response returns result.id (transaction ID). Persist it immediately and use it for all subsequent operations.
Store both trx_id and end_to_end_id for complete tracking and reconciliation.
Use the Payment Status Change webhook to update transaction state in real-time. Implement API polling only as a fallback for reconciliation.
Depending on your tenant configuration, transactions may require approval before processing. When status is To sign, use one of these methods:
  • Single approval: PATCH /v1/transactions/{id}:approve
  • Bulk signing: POST /v1/transactions/signatures
Choose based on your UX: single-button approve for simple flows, bulk signing for queue-based approval workflows.

Transaction Lifecycle

Transaction Statuses

StatusDescriptionTiming
CreatedPayment initiatedImmediate
To signAwaiting approval (if configured)Until signed
SignedApproved, queued for clearingUntil cut-off
AcceptedSubmitted to CENTROlink/EKSNext business day
CompletedSettled at beneficiary bankD+1

Create a Payment

curl -X POST https://api.pgw-sandbox.finventi.com/gateway/createSepaPmt \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: {uuid}" \
  -d '{
    "dr_acc": "LT543210010000000003",
    "dr_name": "Sender Name",
    "dr_amount": 10657,
    "dr_ccy_isocode": "EUR",
    "cr_acc": "LT123450010000000004",
    "cr_name": "Recipient Name",
    "cr_amount": 10657,
    "cr_ccy_isocode": "EUR",
    "inst": true,
    "trx_purpose": "Invoice 2026-001"
  }'

Request Fields

dr_acc
string
required
Debtor IBAN (sender account)
dr_name
string
required
Debtor name
dr_amount
integer
required
Amount in cents
dr_ccy_isocode
string
required
Currency code (EUR)
cr_acc
string
required
Creditor IBAN (recipient account)
cr_name
string
required
Creditor name
cr_amount
integer
required
Amount in cents
cr_ccy_isocode
string
required
Currency code (EUR)
inst
boolean
true for SEPA Instant, false for SCT
trx_purpose
string
Payment reference / remittance info

Payment Flows

Standard flow when approval is not required.

Sign Transactions

curl -X PATCH https://api.pgw-sandbox.finventi.com/v1/transactions/{id}:approve \
  -H "Authorization: Bearer {token}"
If failedToSignTransactionIds is not empty, those transactions were not signed. Check their status and retry if needed.

Webhook Integration

Payment Status Change

Each status transition triggers a webhook notification with these fields:
trx_id
string
required
Transaction identifier
end_to_end_id
string
End-to-end reference
direction
string
required
OUTBOUND for sent payments
status
string
required
Current transaction status
amount
integer
required
Amount in cents
currency
string
required
Currency code
updated_at
datetime
required
Status change timestamp

Signature Verification

Verify webhook authenticity using these headers:
HeaderPurpose
finventi-signature-1RSASSA-PKCS1-v1_5 signature
finventi-signature-timestampRequest timestamp
finventi-receiver-tenant-idYour tenant ID
See Signature Verification for implementation details.
If your webhook endpoint fails, the platform retries and holds all subsequent notifications until the blocked one succeeds.

Reconciliation

Use API polling as a fallback when webhooks may have gaps.
Run a nightly job to fetch recent transactions and compare statuses. Store any missing transitions for audit completeness.

Data Model

Store these fields for complete tracking:
trx_id
string
required
Platform transaction ID (primary key)
end_to_end_id
string
Customer reference for reconciliation
idempotency_key
string
required
Your generated key for retry safety
current_status
string
required
Latest transaction status
status_history
array
required
Append-only list of status transitions

Integration Checklist

1

Implement idempotency

Generate and persist an Idempotency-Key for each payment intent before calling the API
2

Store transaction ID

Persist trx_id from the response immediately after creation
3

Implement webhook receiver

Create an idempotent endpoint that responds 2xx quickly and processes asynchronously
4

Verify webhook signatures

Validate authenticity using the provided signature headers
5

Handle signing flow

If approval is required, implement signing/approval actions for To sign transactions
6

Build reconciliation

Implement status polling as a fallback for missed webhooks

What’s Next?

You can now send payments. Next, set up your system to receive payments and handle the full payment lifecycle: