Webhooks

Partner headers
HeaderTypeRequiredDescription
x-client-idUUIDRequiredYour client id.
x-api-keyUUIDRequiredYour API key.
x-client-id: <your-client-id>
x-api-key: <your-api-key>
Webhook endpoints
MethodPathPurpose
POST/v1/webhooksCreate a subscription.
GET/v1/webhooksList subscriptions (paginated).
GET/v1/webhooks/:webhookIdRead one subscription.
PATCH/v1/webhooks/:webhookIdUpdate a subscription.
DELETE/v1/webhooks/:webhookIdDelete a subscription (irreversible).

Create a subscription

POST/v1/webhooks

Auth: Partner client ID and API key headers — how to send the partner headers.

Body parameters
NameTypeRequiredDefaultDescription
urlstring (URL)RequiredWhere the POST notifications are delivered.
secretstringRequiredSecret used to sign outgoing notifications; never returned back.
eventsenum[]RequiredAt least one event from the catalogue.
isActivebooleanRequiredWhether the subscription is enabled.
descriptionstringOptionalFree-form description.
POST/v1/webhooks
curl -X POST 'https://sandbox-bank.tedr.com/open-banking/v1/webhooks' \
  -H 'x-client-id: <your-client-id>' \
  -H 'x-api-key: <your-api-key>' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://partner-app.com/webhooks/payments",
    "secret": "<your-signing-secret>",
    "events": ["INNER_PAYMENT_SUCCEEDED", "ACCOUNTS_CREATED"],
    "isActive": true,
    "description": "Webhook to notify when payments are updated."
  }'

GET /v1/webhooks

GET/v1/webhooks

Auth: Partner client ID and API key headers — how to send the partner headers.

Query: ids[], pagination[limit], pagination[skip].

GET/v1/webhooks
curl -G 'https://sandbox-bank.tedr.com/open-banking/v1/webhooks' \
  -H 'x-client-id: <your-client-id>' \
  -H 'x-api-key: <your-api-key>' \
  -d 'pagination[skip]=0' \
  -d 'pagination[limit]=10'

GET /v1/webhooks/:webhookId

GET/v1/webhooks/:webhookId

Auth: Partner client ID and API key headers — how to send the partner headers.

GET/v1/webhooks/:webhookId
curl 'https://sandbox-bank.tedr.com/open-banking/v1/webhooks/<webhookId>' \
  -H 'x-client-id: <your-client-id>' \
  -H 'x-api-key: <your-api-key>'

PATCH /v1/webhooks/:webhookId

PATCH/v1/webhooks/:webhookId

Auth: Partner client ID and API key headers — how to send the partner headers.

All fields are optional; only what is sent is changed.

PATCH/v1/webhooks/:webhookId
curl -X PATCH 'https://sandbox-bank.tedr.com/open-banking/v1/webhooks/<webhookId>' \
  -H 'x-client-id: <your-client-id>' \
  -H 'x-api-key: <your-api-key>' \
  -H 'Content-Type: application/json' \
  -d '{
    "isActive": false,
    "url": "https://partner-app.com/webhooks/payments-v2",
    "description": "Updated webhook.",
    "events": {
      "attach": ["SWIFT_PAYMENT_SUCCEEDED"],
      "detach": ["ACCOUNTS_CREATED"]
    }
  }'

DELETE /v1/webhooks/:webhookId

DELETE/v1/webhooks/:webhookId

Auth: Partner client ID and API key headers — how to send the partner headers.

DELETE /v1/webhooks/:webhookId removes the subscription permanently and returns the deleted object.

DELETE/v1/webhooks/:webhookId
curl -X DELETE 'https://sandbox-bank.tedr.com/open-banking/v1/webhooks/<webhookId>' \
  -H 'x-client-id: <your-client-id>' \
  -H 'x-api-key: <your-api-key>'
Event catalogue
GroupEventsScope required
AccountsACCOUNTS_ORDERED, ACCOUNTS_CREATEDtb:accounts:read
INNER paymentsINNER_PAYMENT_CREATED / _UPDATED / _SUCCEEDED / _DECLINED / _REFUNDEDtb:payments:read
SWIFT paymentsSWIFT_PAYMENT_CREATED / _UPDATED / _SUCCEEDED / _DECLINED / _REFUNDEDtb:payments:read
INTERNAL_CARDS paymentsINTERNAL_CARDS_PAYMENT_CREATED / _UPDATED / _SUCCEEDED / _DECLINED / _REFUNDEDtb:payments:read
CardsINTERNAL_CARD_ORDERED, INTERNAL_CARD_UPDATED, INTERNAL_CARD_EXPIRES, INTERNAL_CARD_EXPIREDtb:internal-cards:read
Stripe cardsSTRIPE_CARD_CREATED, STRIPE_CARD_EXPIRES, STRIPE_CARD_EXPIREDtb:external-cards:read
Stripe paymentsSTRIPE_PAYMENT_CREATED, STRIPE_PAYMENT_UPDATEDtb:external-cards:read
Notification fields
FieldTypeDescription
idUUIDUnique id of this delivery — use it for idempotency.
webhookIdUUIDThe subscription the notification belongs to.
eventstringEvent name from the catalogue.
timestampnumberUnix time in seconds.
dataobjectThe entity snapshot: the payment, the account list or the card.
{
  "id": "9b1c8f0e-7d3a-4e2b-8a11-6c5d4e3f2a10",
  "webhookId": "5f4d42e5-60cb-42bc-b0d4-2b73d063560f",
  "event": "INNER_PAYMENT_SUCCEEDED",
  "timestamp": 1748689100,
  "data": { }
}
Notification headers
HeaderValue
Content-Typeapplication/json
X-SIGNATUREHMAC-SHA1(secret, raw body) in hex, where secret is the one you set on the subscription.
const crypto = require('crypto');


const SECRET = '<your-signing-secret>';


// rawBody: the request body bytes exactly as received, before any JSON parsing.
function isValidSignature(rawBody, signature, secret) {
  // X-SIGNATURE is HMAC-SHA1 in hex: exactly 40 hex characters.
  if (typeof signature !== 'string' || !/^[0-9a-f]{40}$/i.test(signature)) {
    return false;
  }


  const expected = Buffer.from(
    crypto.createHmac('sha1', secret).update(rawBody).digest('hex'),
    'hex',
  );
  const received = Buffer.from(signature, 'hex');


  return (
    received.length === expected.length &&
    crypto.timingSafeEqual(received, expected)
  );
}


const ok = isValidSignature(rawBody, req.headers['x-signature'], SECRET);
15, 15, 15, 30, 60, 60, 60, 320, 320, 10240 × 5, 43200 × 5, 86400