Webhooks
Udgående webhooks er i Beta. Strise aktiverer dem pr. team – kontakt Strise for at få adgang til dit team.
Strise kan sende hændelser til et HTTPS-endpoint, du kontrollerer. Når der sker noget væsentligt i din portefølje, såsom en færdig vurdering, en statusændring på en kundeorienteret formular eller en ny overvågningsalert, sender Strise en signeret HTTP-anmodning til din server i nær realtid. Dine systemer kan derefter reagere uden polling.
Hvor det konfigureres
Administrer abonnementer under Settings → Team → Webhooks. Kun team managers kan oprette eller redigere dem. Hvert abonnement har en endpoint-URL, det sæt af hændelsestyper, du ønsker, og en aktiv-til/fra-knap.

Understøttede hændelser
| Hændelsestype | Hvornår den udløses |
|---|---|
review.completed | En vurdering er færdigbehandlet, og dens resultat er klar. Payload indeholder vurderings-id og den entitet, den blev udført på. |
form.status.changed | En kundeorienteret formular har skiftet status (f.eks. PENDING → IN_PROGRESS → SUCCESS). Payload indeholder formularinstans-id, entiteten samt den gamle og nye status. Statusværdier matcher GraphQL-enummet DocumentStatus. |
entity.disposition.created | Nogen har verificeret et screening-hit på en entitet – bekræftet det som et sandt eller et falsk match. Payload indeholder entitets-id, id'et for det hit, der blev verificeret (externalId), kind (Pep eller Sanction), status (ConfirmedTrue eller ConfirmedFalse), den bruger, der verificerede det, og hvornår. |
monitoring.alert.created | En ny overvågningsalert er tilgængelig for dit team i appen og i Connect-forespørgslen alerts. Strise sender én hændelse pr. alert. Payload indeholder alerten: alertId, entityId, entityKind, kind, computedAt og insertedAt. Se Monitoring Alerts-API. |
Flere hændelser vil blive tilføjet over tid. Kontakt Strise, hvis der er en, du gerne vil se.
newStatus på form.status.changed kan også være INCONCLUSIVE – formularen blev udfyldt, men dokumentverifikationstrinnet kunne ikke afklares endeligt.
I monitoring.alert.created er entityKind Company eller PrivatePerson. kind er PEP, SANCTIONS, RELATIONS, COMPANY_INFORMATION eller CUSTOM_SCREENING_LISTS, værdierne i Connect-enummet DatasetKind. Hent hvad der ændrede sig med alertData(alert: "<alertId>").
Strise sender kun monitoring.alert.created for alerts, som Connect-forespørgslen alerts returnerer til dit team, så du kan slå ethvert alertId op. Teams, der ikke har funktionen Overvågningsvisning, modtager ingen hændelser. Alerter om ændringer i en persons oplysninger og alerter om ændringer i risikoniveau sender ingen hændelse, fordi Connect API endnu ikke returnerer dem. Hvis du skjuler visningen for overvågningsalerts under Indstillinger for overvågningsalerts, stopper det ikke hændelserne.
Send en testhændelse
Når et abonnement er aktivt, kan du udløse en rigtig levering efter behov for at tjekke dit endpoint – ingen grund til at vente på, at en live vurdering bliver færdig, eller at en formular skifter status. Under Settings → Team → Webhooks bruger du abonnementets handling Send mock event, vælger en af de hændelsestyper, det abonnerer på, gennemgår JSON-payloaden og sender.
Strise udgiver testhændelsen gennem den samme pipeline som en produktionslevering: den samme signerede kuvert og OIDC-token, sendt til det endpoint, du har registreret. En testhændelse afprøver derfor din signaturverificering og din modtagerlogik ende-til-ende mod en payload, du kan se på forhånd. Afsendelse er begrænset til team managers og kun, mens abonnementet er aktivt.
Samme hændelses-id ved hver genafsendelse
Genafsendelse af den samme mock-hændelse frembringer en levering med det samme id hver
gang. Dette er tilsigtet: det giver dig mulighed for at bekræfte, at din
deduplikering virker. En modtager, der deduplikerer på
hændelsens id, behandler den første levering og ignorerer identiske genafsendelser – så hvis en
gentagen testhændelse holder op med at dukke op downstream, gør din deduplikering sit arbejde.
Hvad du modtager
Et HTTPS POST til det endpoint, du har registreret, med:
- Header
Authorization: Bearer <JWT>– det token, du verificerer (nedenfor). - Hændelsen som den rå JSON-body. Kuverten indeholder alt, hvad du behøver for at identificere, dirigere og deduplikere en levering – ingen andre headere er nødvendige til behandlingen.
{
"id": "4bdf74b2-0d8e-3379-9739-cba7db9b602d",
"version": "1",
"eventType": "form.status.changed",
"teamId": "b07e18b1-45bf-4d5d-877e-ad0374d70111",
"subscriptionId": "76a48168-145b-495a-8cec-0ee929d8c15c",
"timestamp": "2026-05-27T12:41:58.985818515",
"data": {
"formInstanceId": "…",
"entityId": "…",
"entityKind": "Company",
"oldStatus": "IN_PROGRESS",
"newStatus": "SUCCESS"
}
}Dit endpoint skal være HTTPS – Strise pusher ikke til almindelig HTTP, og payloadens integritet under overførsel afhænger af TLS. Se Kvittering for leveringen nedenfor for at se, hvordan du svarer.
Endpointet skal desuden bruge et offentligt domænenavn, der udelukkende resolver til offentlige IP-adresser.
Strise afviser IP-adresser, loginoplysninger i URL'en (user:pass@) og interne navne såsom
localhost eller *.internal, når du opretter abonnementet eller sender en testhændelse.
Verificering af signaturen
Enhver levering indeholder en Authorization: Bearer <JWT>-header med et
Google-udstedt OIDC-token, signeret på vegne af Strises tjenestekonto til levering.
Verificering af det beviser, at anmodningen kom fra Strise og nåede frem til dig uændret.
Verificer det, før du stoler på payloaden.
Hvad der skal verificeres mod
| Claim | Forventet værdi |
|---|---|
| signature | Googles offentlige nøgler (JWKS): https://www.googleapis.com/oauth2/v3/certs |
iss | https://accounts.google.com |
email | webhook-delivery@strise-prod.iam.gserviceaccount.com |
aud | den nøjagtige endpoint-URL, du registrerede for abonnementet |
exp | skal være i fremtiden |
email er en fast Strise-værdi (ovenfor). aud er den endpoint-URL, du indtastede, da du
oprettede abonnementet – Strise sætter tokents audience til dit push-endpoint.
⚠️ Reglen, der betyder mest
En gyldig Google-signatur alene beviser ikke, at anmodningen er fra Strise. Enhver med en
Google Cloud-konto kan hente et Google-signeret OIDC-token (iss: https://accounts.google.com,
gyldig signatur). Det, der knytter et token til Strise, er email-claimet (tjenestekontoen til levering)
sammen med aud-claimet (dit endpoint).
Tjek altid både email og aud efter verificering af signaturen. Hvis du kun verificerer
signaturen eller kun udstederen, er du sårbar over for spoofing.
Verificeringstrin
- Udtræk tokenet fra
Authorization: Bearer-headeren. - Hent Googles offentlige nøgler (bibliotekerne nedenfor cacher og roterer dem automatisk for dig).
- Verificer signaturen og standard-claims (
iss,exp). - Bekræft, at
audmatcher din registrerede endpoint-URL. - Bekræft, at
emailer lig medwebhook-delivery@strise-prod.iam.gserviceaccount.com(og atemail_verifiedertrue). - Først derefter kan du stole på og behandle hændelsens JSON i anmodningens body.
Kodeeksempler
Hvert eksempel verificerer headeren og returnerer claims ved succes. Erstat
EXPECTED_AUDIENCE med den endpoint-URL, du registrerede.
Node.js — google-auth-library
import { OAuth2Client } from 'google-auth-library'
const client = new OAuth2Client()
const EXPECTED_EMAIL = 'webhook-delivery@strise-prod.iam.gserviceaccount.com'
const EXPECTED_AUDIENCE = 'https://your-domain.example.com/strise-webhook'
// Throws if the token is missing, invalid, expired, or not issued by Strise.
export async function verifyStriseWebhook(authorizationHeader) {
if (!authorizationHeader?.startsWith('Bearer ')) throw new Error('missing bearer token')
const token = authorizationHeader.slice('Bearer '.length)
// Verifies the Google signature (JWKS), iss, exp, and aud.
const ticket = await client.verifyIdToken({ idToken: token, audience: EXPECTED_AUDIENCE })
const claims = ticket.getPayload()
if (claims.email !== EXPECTED_EMAIL || claims.email_verified !== true) {
throw new Error('token not issued by Strise')
}
return claims
}Python — google-auth
from google.oauth2 import id_token
from google.auth.transport import requests as google_requests
EXPECTED_EMAIL = "webhook-delivery@strise-prod.iam.gserviceaccount.com"
EXPECTED_AUDIENCE = "https://your-domain.example.com/strise-webhook"
def verify_strise_webhook(authorization_header: str) -> dict:
if not authorization_header.startswith("Bearer "):
raise ValueError("missing bearer token")
token = authorization_header[len("Bearer "):]
# Verifies the Google signature (JWKS), iss, exp, and aud.
claims = id_token.verify_oauth2_token(token, google_requests.Request(), audience=EXPECTED_AUDIENCE)
if claims.get("email") != EXPECTED_EMAIL or not claims.get("email_verified"):
raise ValueError("token not issued by Strise")
return claimsGo — google.golang.org/api/idtoken
import (
"context"
"fmt"
"strings"
"google.golang.org/api/idtoken"
)
const (
expectedEmail = "webhook-delivery@strise-prod.iam.gserviceaccount.com"
expectedAudience = "https://your-domain.example.com/strise-webhook"
)
// VerifyStriseWebhook returns the verified claims, or an error if the token is
// missing, invalid, expired, or not issued by Strise.
func VerifyStriseWebhook(ctx context.Context, authorizationHeader string) (*idtoken.Payload, error) {
token := strings.TrimPrefix(authorizationHeader, "Bearer ")
if token == authorizationHeader {
return nil, fmt.Errorf("missing bearer token")
}
// Validate verifies the Google signature (JWKS), iss, exp, and aud.
payload, err := idtoken.Validate(ctx, token, expectedAudience)
if err != nil {
return nil, err
}
if payload.Claims["email"] != expectedEmail || payload.Claims["email_verified"] != true {
return nil, fmt.Errorf("token not issued by Strise")
}
return payload, nil
}Kvittering for leveringen
Svar med en vilkårlig 2xx-statuskode for at kvittere for modtagelsen. Et ikke-2xx-svar (eller et timeout)
får Strise til at forsøge at sende den samme payload igen.
Kvitter altid, selv hvis din egen behandling mislykkes. Hvis din downstream-modtager fejler
– en databaseskrivning kaster en fejl, din kø er fuld, en undtagelse bobler op – skal du stadig svare 2xx
og håndtere fejlen på din side (log, advisér, prøv igen fra din egen kø). Et ikke-2xx-svar fortæller
Strise, at beskeden ikke nåede frem til dig, så vi bliver ved med at forsøge at sende den identiske payload igen. Det løser sjældent
en downstream-fejl og forstærker blot støjen i dit system.
Almindelige fejlscenarier
- Verificering af signaturen, men ikke
email/aud– signaturen beviser kun, at Google udstedte tokenet, ikke at Strise gjorde det. Tjek altid begge claims. Dette er den mest almindelige fejl. - Afkodning uden verificering – base64-afkodning af JWT-bodyen for at læse claims uden at validere signaturen fæstner lid til angriber-leverede data. Brug et bibliotek, der verificerer.
- Forkert
aud– audience skal svare nøjagtigt til den endpoint-URL, du registrerede (den URL, Strise pusher til), ikke et tjenestenavn eller en anden sti. - Ur-forsinkelse (clock skew) –
expligger cirka en time fremme i tiden. Hvis din servers ur driver, bliver gyldige tokens afvist. Hold det NTP-synkroniseret; bibliotekerne ovenfor tolererer et par sekunders afvigelse. - Fjernet
Authorization-header – visse load balancere og API gateways fjerner eller omskriverAuthorization. Sørg for, at den når frem til din applikation intakt. - Nøglerotation – Google roterer sine signeringsnøgler periodisk. Alle tre biblioteker henter og cacher JWKS og følger rotationen automatisk; foretag aldrig pinning af en nøgle.
- Genafspilninger (replays) – et opsnappet token er gyldigt indtil
exp(~1 time). Deduplikér på hændelsensidi payloaden (stabil på tværs af genleveringer), så genbehandling er ufarlig.
Sidst opdateret