Overview
TheAGENT_REGULATORY_ACTION_ADDED webhook is triggered when the daily NIPR PDB-alerts pass finds a regulatory action against one of your producers that Turris has not seen before.
It exists because an adverse action against a producer previously reached you only if you went looking. Regulatory actions are available on Get Agent Regulatory Actions, but nothing told you when a new one appeared, so the only way to act on one was to poll every producer on your book. A licence lapse or an adverse ruling does not always change a compliance status either, so the compliance-status events cannot stand in for this.
This event tells you an action was newly filed, against whom, and what it says.
Webhook type: AGENT_REGULATORY_ACTION_ADDED
Triggers
This webhook fires when the daily NIPR PDB-alerts pass records a regulatory action against a producer that was not already on file. That is the only trigger, and the wording is deliberate — see the next section for what that excludes.This webhook is sent immediately, with no debouncing, and there is one delivery per newly found action. A single
daily pass can find several, so a receiver can see a short run of deliveries — bounded by what NIPR newly reports,
which is typically small, rather than by any batching on our side.
What does not fire this event
Only newly found actions are delivered
A producer’s existing action history is never delivered by this event, and that is by design rather than an omission. Three cases all stay silent:- the first compliance-data synchronisation after a producer is added, which loads their whole history at once
- a re-synchronisation after their NIPR data is reset, which reloads the same history
- an internal reprocessing run over previously retrieved NIPR data
Payload Example
A criminal action, the case this event was built for:Payload Fields
The seven nullable fields are always present as keys.
null means NIPR did not supply a value; it never means
the key is missing. So you can read payload.disposition without a presence check, and an empty string from NIPR is
normalised to null so you do not have to treat blank and absent differently.Two of the numbers are worth reading carefully. penaltyFineForfeitureInUSD: 0 genuinely means no penalty, but
lengthOfOrderInDays: 0 is ambiguous in NIPR’s own data — it covers both “not specified” and “indefinite”. Do not
render it as “0 days”.The entity fields are best-effort, and they all depend on one lookup.
agentId,
downstreamEntityAssociationId, branchName and legalName are resolved from your association with the
producer’s agency. If that lookup misses — an agency archived between our read and the delivery is the realistic
case — none of them arrive. If it hits, downstreamEntityAssociationId is always present and the rest are
individually best-effort.Absent means “we could not resolve this”, never a statement about the data. Re-read from the API rather than
inferring anything from an absent field.One caveat. When a producer works under more than one of your agencies, the agency fields name an arbitrary one
of those relationships, because a single NIPR subscription is shared across them. agentId is exact; treat
downstreamEntityAssociationId as one of possibly several. Match on agentId.Deduplication
Key onactionId + npn + stateCode. Those three together identify a real-world action, and a redelivery of the
same action carries the same three values.
Do not key on regulatoryActionId alone if you also poll the API, because you would then hold the same action twice
under two different shapes of record.
No fan-out across carriers
If the same producer appears on more than one carrier’s book, each carrier holds their own copy of the action, and each receives exactly one delivery for it, carrying their owndownstreamEntityAssociationId.
This differs from Agency Updated, where a single change fans out across
every relationship you hold. There is nothing to de-duplicate across relationships here.