Overview
TheAGENT_LICENSE_EXPIRED webhook is triggered the day after one of your producers’ licenses passes its renewal date.
This is the event behind “did you know your license lapsed in Oregon”. Agent Compliance Status Change fires per product and state and only on an actual status flip, so a lapse in a state you have no requirement for, or one covered by another license the producer holds, never reached you.
Webhook type: AGENT_LICENSE_EXPIRED
Triggers
One delivery per license, on the day after itsnextRenewalDate.
The day after is deliberate: a state treats the renewal date as the last valid day, so a license expiring today is still valid today. daysUntilExpiration is therefore -1 on a normal delivery, not 0.
Deliveries land on a daily sweep at 05:00 America/New_York, not in real time. This is a date crossing rather
than a change to a record.
What does not fire this event
Licenses the producer chose not to renew DO fire
If a producer marked a license do-not-renew, this event still fires, which is the opposite of how Turris treats its own renewal reminders (those are suppressed, because there is no point nagging someone about a license they decided to drop). For a carrier the reasoning inverts, and this is arguably the single most useful case: the license you most want to hear about lapsing is the one the producer let lapse on purpose.There is no “expired” license status, and this payload proves it
The most confusing thing about this event:status on the payload normally reads "active" even though the license has expired.
That is correct. status is copied verbatim from the NIPR PDB payload and nothing in Turris derives it from a date, so a license can sit at active with a renewal date years past. This event exists precisely because the status field cannot tell you what this tells you.
Key on daysUntilExpiration being negative, or on nextRenewalDate being in the past. Never on status.
Perpetual licenses never fire
Both events are driven entirely by a range query onnextRenewalDate, so a license without one never produces a delivery. That is roughly 9% of producer licenses on the platform. Reconcile against Get Agent Licenses if you need the complete set.
Payload Example
status: "active" on an expired license, and daysUntilExpiration: -1. Both are what a real delivery looks like.
Payload Fields
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.There is deliberately no
expirationDate field. nextRenewalDate is the only expiry date the platform holds.