{% extends "base.html" %} {% block title %} — Step 6: Webhooks & Events{% endblock %} {% block stepper %}
{% set step_names = ["Auth", "Opret Bruger", "Tilslut Bank", "Konti", "Transaktioner", "Webhooks"] %} {% for i in range(1, 7) %} {{ i }} {{ step_names[i-1] }} {% if i < 6 %} {% endif %} {% endfor %}
{% endblock %} {% block content %}
6

Webhooks & Real-time Events

Push-notifikationer til din backend

Registrér dit endpoint hos Tink — så sender de automatisk en HTTP POST til dig hver gang en transaktion bogføres, opdateres eller en konto ændres. Zero polling.

{% if error %}

Webhook API fejl

{{ error }}
{% endif %}

Hvordan webhooks virker

Din app Brugeren kobler bank
Tink Henter transaktioner
POST /webhooks/tink Dit endpoint modtager event
Din app Opdaterer UI / notifikation
Registrerede webhooks GET /api/v1/webhooks
app token
cURL
{{ curl_list }}
{% if result_webhooks %} {% if is_demo %}

⚠ Sample Data

{% endif %}
{{ result_webhooks | tojson(indent=2) }}
{% else %}

Ingen webhooks registreret endnu.

{% endif %}
Registrér webhook endpoint POST /api/v1/webhooks
registreret ✓
cURL
{{ curl_register }}
{% if webhook_registered %} {% if is_demo %}

⚠ Sample Data

{% endif %}
{{ webhook_registered | tojson(indent=2) }}
{% else %}

Webhook ikke registreret.

{% endif %}
Sample Webhook Payload

Sådan ser en event ud når Tink poster til dit endpoint

incoming POST
{
  "event": "account-booked-transaction:created",
  "context": {
    "userId": "a8b3c2d1-...",
    "externalUserId": "moneycapp-user-42"
  },
  "content": {
    "id": "tx_9f3a2b1c...",
    "accountId": "acc_7e1d4f2a...",
    "amount": {
      "currencyCode": "DKK",
      "value": { "scale": 2, "unscaledValue": "-24900" }
    },
    "dates": {
      "booked": "2025-05-22",
      "value": "2025-05-22"
    },
    "descriptions": {
      "display": "Netto Albertslund",
      "original": "NETTO ALBERTSLUND"
    },
    "merchantInformation": {
      "merchantCategoryCode": "5411",
      "merchantName": "Netto"
    },
    "status": "BOOKED",
    "types": { "type": "DEFAULT" }
  }
}

Dit webhook modtager endpoint er live

POST {{ app_base_url }}/webhooks/tink
Se receiver kode
@router.post("/webhooks/tink")
async def tink_webhook(request: Request):
    payload = await request.json()
    event_type = payload.get("event", "unknown")
    content = payload.get("content", {})
    
    # Her ville MoneyCapp opdatere sin database,
    # sende push-notifikation, opdatere UI via SSE etc.
    
    print(f"Tink event: {event_type}")
    print(f"Transaction ID: {content.get('id')}")
    print(f"Amount: {content.get('amount')}")
    
    return {"status": "received"}
🎉

Det var hele flowet

Fra brugeroprettelse over live bankdata til real-time webhooks — alt via Tink API.

Auth → bruger → bank-tilslutning → konti (v2) → transaktioner (v2) → webhooks.

↺ Kør demo igen Tink Docs →

Næste skridt mod en produktion-klar integration

Backend (C# / .NET)

1. Lav en TinkApiClient wrapper (brug tink/client.py som reference)

2. Gem external_user_id + user_id i din kundedatabase

3. Implementér /callback endpoint med token exchange

4. Gem tokens sikkert (encrypted, server-side — ikke i cookie)

Webhooks & Production

5. Byg webhook receiver med HMAC-SHA256 signature verification

6. Skift til production Tink-credentials (Tink Console)

7. Registrér din production callback URI i Tink Console

8. Brug authorization-grant/delegate i prod-flowet (ikke anon)

Kildekoden til dette demo (src/tink/client.py og src/routes/demo.py) er skrevet for at være letlæselig og direkte overførbar til andre platforme.

← Step 5
{% endblock %}