Webhooks
Ta emot notifikationer när en kreditupplysning är redo att hämtas.
Översikt
Webhooks skickas som HTTP POST-anrop till din angivna URL när kreditupplysningen är klar. Alla webhooks signeras med HMAC-SHA256.
Händelsetyper
| Händelse | Beskrivning |
|---|---|
credit.completed |
Kreditupplysningen är klar och finns tillgänglig via API. |
Övriga slutliga statusvärden (Rejected, Expired, Failed)
skickar inte webhook i denna version — hämta status via
GET /api/v1/check/{guid}.
Konfigurera webhook
Ange webhookUrl antingen per anrop (som en del av kreditupplysningsförfrågan)
eller globalt för hela kontot i kontrollpanelen. Per-anrop-värdet har företräde om båda är
satta.
{
"personalNumber": "YYYYMMDDNNNN",
"mobilePhoneNumber": "+46XXXXXXXXX",
"webhookUrl": "https://your-app.com/webhook/credit"
}
Webhook-payload
Payloaden är avsiktligt minimal — den innehåller inga personuppgifter eller
andra uppgifter i kreditupplysningen. Webhooken fungerar som en notifiering: hämta den fullständiga kreditupplysningen via
GET /api/v1/check/{guid}.
{your webhookUrl}
Body Fields
| Fält | Typ | Beskrivning |
|---|---|---|
| event | string | Alltid credit.completed (idag). |
| timestamp | string | Unix-tidsstämpel (sekunder) när webhooken genererades. Används för signaturverifiering. |
| data.creditCheckId | guid | Unikt ID — används som nyckel för att hämta kreditupplysningen. |
| data.status | string | Alltid Completed. |
| data.completedAt | string | ISO 8601 UTC-tidpunkt när kreditupplysningen färdigställdes. |
Payload
{
"event": "credit.completed",
"timestamp": "1713614550",
"data": {
"creditCheckId": "550e8400-e29b-41d4-a716-446655440000",
"status": "Completed",
"completedAt": "2026-04-15T12:02:30Z"
}
}
Signaturverifiering
Varje webhook innehåller en X-TIC-Signature-header med en HMAC-SHA256-signatur.
Verifiera alltid signaturen för att säkerställa att den kommer från TIC.
Headers
| Header | Värde |
|---|---|
X-TIC-Signature |
t={timestamp},v1={hex-sha256} — Stripe-stil.
v1 är hex-kodad HMAC-SHA256 av {timestamp}.{raw-body}.
|
Content-Type |
application/json |
Verifieringsexempel
using System.Security.Cryptography;
using System.Text;
public bool VerifyWebhook(string rawBody, string sigHeader, string webhookSecret)
{
// Parse header: "t=1713614550,v1=abc123..."
var parts = sigHeader.Split(',')
.Select(s => s.Split('=', 2))
.ToDictionary(kv => kv[0], kv => kv[1]);
var timestamp = parts["t"];
var providedSig = parts["v1"];
// Reject stale webhooks (>5 minutes)
var ts = DateTimeOffset.FromUnixTimeSeconds(long.Parse(timestamp));
if (DateTimeOffset.UtcNow - ts > TimeSpan.FromMinutes(5)) return false;
// Recompute and compare
var message = $"{timestamp}.{rawBody}";
using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(webhookSecret));
var expected = Convert.ToHexString(hmac.ComputeHash(Encoding.UTF8.GetBytes(message))).ToLowerInvariant();
return CryptographicOperations.FixedTimeEquals(
Encoding.UTF8.GetBytes(providedSig),
Encoding.UTF8.GetBytes(expected));
}
Retry-policy
Om din endpoint inte svarar med 2xx inom 30 sekunder gör vi upp till 3 nya försök
via vår webhook-kö. Permanenta fel (DNS, TLS, 4xx) kan avbryta retries tidigare.
Best practices
- Verifiera signaturen — aldrig lita på payloaden utan HMAC-kontroll.
- Kontrollera tidsstämpeln — avvisa webhooks äldre än 5 minuter för att förhindra replay.
- Svara snabbt — returnera
200 OKoch bearbeta asynkront. Timeout är 30 sekunder. - Idempotens — samma
creditCheckIdkan levereras flera gånger vid retries. Dedupera. - HTTPS — använd alltid HTTPS för din webhook-endpoint.