Payments

Payment endpoints by purpose
PurposeEndpoints
Create and send in one callPOST /v1/payments/inner · POST /v1/payments/swift · POST /v1/payments/internal-cards
Prepare without sendingPOST /v1/payments/inner/prepare · POST /v1/payments/swift/prepare · POST /v1/payments/internal-cards/prepare
Send a prepared paymentPOST /v1/payments/inner/:paymentId/send · POST /v1/payments/swift/:paymentId/send · POST /v1/payments/internal-cards/:paymentId/send
Calculate the feePOST /v1/payments/inner/calculate-fee · POST /v1/payments/swift/calculate-fee · POST /v1/payments/internal-cards/calculate-fee
Payment statuses
StatusMeaning
DRAFTPrepared but not sent yet.
PROCESSINGSubmitted and being processed.
ON_REVIEWHeld for manual review.
NEED_ACTIONWaiting for an action before it can continue.
SUCCESSFULCompleted.
REFUNDEDReturned to the sender.
DECLINEDRejected.
Base request fields
NameTypeRequiredDescription
sourceCurrencyIdUUIDRequiredDebit currency.
targetCurrencyIdUUIDRequiredCredit currency.
sourceAmountstring (decimal)ConditionalAmount to debit. Pass either this or targetAmount.
targetAmountstring (decimal)ConditionalAmount to credit. Pass either this or sourceAmount.
quoteIdUUIDConditionalLocked quote id, required when sourceCurrencyId ≠ targetCurrencyId.
notestringOptionalFree-form note.
metadataobjectOptionalFree-form JSON returned back on the payment object.

Internal transfer (INNER)

POST/v1/payments/inner

Auth: Bearer access token — how to use the access token.

Scopes: tb:payments:write

A transfer between accounts inside the system — instant, no external banks.

Body parameters
NameTypeRequiredDefaultDescription
senderAccountIdUUIDRequiredThe account to debit.
recipientAccountIdUUIDRequiredThe account to credit.
recipientClientIdUUIDRequiredThe recipient client.
recipientClientTypeINDIVIDUAL | CORPORATERequiredThe kind of recipient client.
recipientEmailstringOptionalRecipient email.
recipientPhoneNumberstringOptionalRecipient phone number.
POST/v1/payments/inner
curl -X POST 'https://sandbox-bank.tedr.com/open-banking/v1/payments/inner' \
  -H 'Authorization: Bearer <access-token>' \
  -H 'Content-Type: application/json' \
  -d '{
    "senderAccountId": "05155318-22a3-45aa-9db0-0ebfe8f21e8c",
    "recipientAccountId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "recipientClientId": "c9788fca-ed84-49e9-a511-81af1906c393",
    "recipientClientType": "INDIVIDUAL",
    "recipientEmail": "recipient@example.com",
    "recipientPhoneNumber": "+1234567890",
    "sourceCurrencyId": "99d41c98-93d1-471a-a73a-4cac9e3587e7",
    "targetCurrencyId": "99d41c98-93d1-471a-a73a-4cac9e3587e7",
    "sourceAmount": "100.00",
    "note": "Payment for services",
    "metadata": { "orderId": "ORD-123" }
  }'

The body also takes the base request fields.

SWIFT transfer

POST/v1/payments/swift

Auth: Bearer access token — how to use the access token.

Scopes: tb:payments:write

Body parameters
NameTypeRequiredDefaultDescription
purposeOfPaymentstringRequiredPurpose of the payment.
sourceOfFundsenumRequiredCOMMISSION_OF_SALES, DIVIDEND_INCOME_FROM_SHARE, INVESTMENT_CAPITAL, REVENUE_GENERATED_FROM_BUSINESS_ACTIVITIES, SALARY, SAVING.
internal.accountIdUUIDRequiredThe sender's account.
externalobjectRequiredThe recipient, see below.
external.accountHolderNamestringRequiredName on the recipient account.
external.clientTypeINDIVIDUAL | CORPORATERequiredThe kind of recipient.
external.bankCodestringRequiredBIC, 8 or 11 characters.
external.accountNumberstringRequiredRecipient account number or IBAN.
external.branchCodestringOptionalDerived from bankCode when omitted.
external.firstName · lastName · middleNamestringOptionalRecipient name parts.
external.addressobjectRequiredcountryId (UUID), postalCode, line1, line2?.
external.bankobjectRequiredname, countryId (UUID), cityName?, addressLine1?, addressLine2?, postalCode?.
external.intermediaryBankobjectOptionalbankCode, accountNumber?, name?, countryId?, cityName?, addressLine1?, addressLine2?.
POST/v1/payments/swift
curl -X POST 'https://sandbox-bank.tedr.com/open-banking/v1/payments/swift' \
  -H 'Authorization: Bearer <access-token>' \
  -H 'Content-Type: application/json' \
  -d '{
    "purposeOfPayment": "Payment for consulting services",
    "sourceOfFunds": "REVENUE_GENERATED_FROM_BUSINESS_ACTIVITIES",
    "sourceCurrencyId": "99d41c98-93d1-471a-a73a-4cac9e3587e7",
    "targetCurrencyId": "2e5d9800-f467-4eb7-ad47-1f67a874a908",
    "sourceAmount": "1000.00",
    "quoteId": "7c9f2f2e-1a4b-4f1f-9a4e-58b0c2f1a3d2",
    "note": "Invoice #INV-2024-001",
    "metadata": { "orderId": "ORD-123" },
    "internal": {
      "accountId": "05155318-22a3-45aa-9db0-0ebfe8f21e8c"
    },
    "external": {
      "accountHolderName": "Acme Corp GmbH",
      "clientType": "CORPORATE",
      "bankCode": "DEUTDEFFXXX",
      "accountNumber": "DE89370400440532013000",
      "branchCode": "XXX",
      "firstName": null,
      "lastName": null,
      "middleName": null,
      "address": {
        "countryId": "6f0f2a51-1f4c-4a3e-9f4a-4b5b2d1c9a10",
        "postalCode": "10117",
        "line1": "Unter den Linden 1",
        "line2": null
      },
      "bank": {
        "name": "Deutsche Bank AG",
        "countryId": "6f0f2a51-1f4c-4a3e-9f4a-4b5b2d1c9a10",
        "cityName": "Berlin",
        "addressLine1": "Taunusanlage 12",
        "addressLine2": null,
        "postalCode": "60325"
      },
      "intermediaryBank": {
        "bankCode": "CHASUS33",
        "accountNumber": "9876543210",
        "name": "JPMorgan Chase",
        "countryId": "a1c3e5f7-2b4d-4e6f-8a0b-1c2d3e4f5a6b"
      }
    }
  }'

The body also takes the base request fields.

Internal cards payment (INTERNAL_CARDS)

POST/v1/payments/internal-cards

Auth: Bearer access token — how to use the access token.

Scopes: tb:payments:write

Moves money between the client's cards and accounts: top up a card from an account, withdraw from a card to an account, or transfer card to card.

Body parameters
NameTypeRequiredDefaultDescription
typeACCOUNT_TO_CARD | CARD_TO_ACCOUNT | CARD_TO_CARDRequiredDirection of the operation.
senderobjectRequiredcardId?, accountId?, email?, phoneNumber? — fill the one matching type.
recipientobjectRequiredcardId?, accountId?, clientId (required), clientType (required), email?, phoneNumber?.
POST/v1/payments/internal-cards
curl -X POST 'https://sandbox-bank.tedr.com/open-banking/v1/payments/internal-cards' \
  -H 'Authorization: Bearer <access-token>' \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "CARD_TO_CARD",
    "sourceCurrencyId": "99d41c98-93d1-471a-a73a-4cac9e3587e7",
    "targetCurrencyId": "99d41c98-93d1-471a-a73a-4cac9e3587e7",
    "sourceAmount": "100.00",
    "note": "Card to card transfer",
    "metadata": { "orderId": "ORD-123" },
    "sender": {
      "cardId": "0f2d6d63-4d9e-4a01-9d0f-9a3b6f1f2c77"
    },
    "recipient": {
      "cardId": "c1b2a3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "clientId": "c9788fca-ed84-49e9-a511-81af1906c393",
      "clientType": "INDIVIDUAL"
    }
  }'

The body also takes the base request fields.

Calculate the fee

POST/v1/payments/swift/calculate-fee

Auth: Bearer access token — how to use the access token.

The body is the full body of the future payment.

POST/v1/payments/swift/calculate-fee
curl -X POST 'https://sandbox-bank.tedr.com/open-banking/v1/payments/swift/calculate-fee' \
  -H 'Authorization: Bearer <access-token>' \
  -H 'Content-Type: application/json'
{
  "status": "SUCCESS",
  "data": {
    "totalFee": "10.00",
    "totalAmount": "1010.00",
    "currencyTicker": "USD",
    "originalAmount": "1000.00",
    "originalTotalAmount": "1010.00",
    "originalTotalFee": "10.00",
    "originalProviderFee": "7.00",
    "originalBankFee": "3.00"
  }
}

Each payment system has its own calculate-fee endpoint: /v1/payments/inner/calculate-fee, /v1/payments/swift/calculate-fee and /v1/payments/internal-cards/calculate-fee.

Browse payments

GET/v1/payments

Auth: Bearer access token — how to use the access token.

Scopes: tb:payments:read

Query parameters
NameTypeRequiredDefaultDescription
paymentSystems[]—OptionalINNER, SWIFT, INTERNAL_CARDS.
statuses[]—OptionalDRAFT, PROCESSING, ON_REVIEW, NEED_ACTION, SUCCESSFUL, REFUNDED, DECLINED.
directions[]—OptionalINCOMING, OUTGOING.
dateRange[from] · dateRange[to]—OptionalRange over the creation date.
settledAt[from] · settledAt[to]—OptionalRange over the settlement date.
currencyIds[]—OptionalBy currency on either side.
sourceCurrencyIds[]—OptionalBy debit currency.
targetCurrencyIds[]—OptionalBy credit currency.
isFavorite—OptionalFavourites only.
search—OptionalFull-text search.
pagination[limit] · pagination[skip]—OptionalPagination.
GET/v1/payments
curl -G 'https://sandbox-bank.tedr.com/open-banking/v1/payments' \
  -H 'Authorization: Bearer <access-token>' \
  --data-urlencode 'paymentSystems[]=SWIFT' \
  --data-urlencode 'directions[]=OUTGOING' \
  --data-urlencode 'dateRange[from]=2026-01-01T00:00:00Z'

The list accepts only the filters above. GET /v1/payments/:paymentId returns a single payment; its shape depends on paymentSystem.

Payment object fields
FieldTypeDescription
idUUIDPayment id.
paymentSystemenumINNER, SWIFT, INTERNAL_CARDS.
statusenumCurrent status.
previousStatusenumPrevious status, when the payment has changed state.
directionenumINCOMING, OUTGOING.
isFavoritebooleanFavourite flag.
notestringFree-form note.
purposeOfPaymentstringPurpose of the payment.
attachmentsarrayAttached files. Response-only.
metadataobject | nullWhatever was sent on creation.
sender · recipientobjectclientId, clientType.
amount · fee · totalAmountobjectEach with exchangeRate, source, target.
createdAt · updatedAt · settleddateLifecycle timestamps.