API 参考
类型、枚举与 reason code
契约中全部具名 schema,含完整的 reason code 枚举。逐字取自契约。
- 来源
- api/openapi.yaml
- 契约版本
- 1.0.0
- 规范
- OpenAPI 3.1.0
- 契约摘要
- sha256:0c75891a35d8
枚举
Relation
An enum indicating how the customer address relates to the enforcement event.
DIRECT— the customer address is itself the subject of the event.INDIRECT— the event does not name the customer address, but is related to it.PATH— the relation is expressed at the level of the inbound route, not at the level of any individual party on it.
The values are ordinal in specificity only. No further detail about the relation is available through this API by any parameter, plan, or mode.
DIRECTINDIRECTPATH
Severity
Ordinal severity band of the match. R0 is the lowest band and R2 the highest band exposed on the exposure endpoint.
A band is not a score. Foreshock publishes no numeric risk score, on this endpoint or any other, in any mode.
R0R1R2
RiskLevel
Ordinal risk band assigned to a decision, R0 (lowest) through R4 (highest). A band, not a score; no numeric score is published.
R0R1R2R3R4
MatchStage
Stage of the enforcement event underlying this match, at observed_at.
PROPOSED— the event exists and is not yet executed; treat as live and begin declining inbound funds on the matched address.CONFIRMING— the event is progressing toward execution.EXECUTED— the event has been carried out.
Matches that leave this set are announced through the exposure.revoked webhook and disappear from subsequent pages. They are never removed silently.
PROPOSEDCONFIRMINGEXECUTED
RevocationStage
Terminal stage that removed a match from the active set.
REVOKED— the underlying event was withdrawn. Not a clearance.EXPIRED— the event did not execute within its configured window.STALE— the underlying data can no longer be trusted. Not a clearance either; treat the affected scope as a blind spot and fall back to a more conservative policy.
REVOKEDEXPIREDSTALE
Pool
Segregation pool the funds should be routed to. Keeping pools separate is what prevents differently classified funds from being swept into one collection address.
cleantaggedquarantine
ReasonCode
Classification code explaining why a verdict came out the way it did.
Reason codes classify. They do not describe derivation, and none of them is accompanied by an enforcement target address, a path detail, or a score.
Risk classifications
| Code | Meaning |
|---|---|
ACTIVE_ENFORCEMENT_RELATION | The counterparty relates to an enforcement event that is not in a terminal stage. |
EXECUTED_ENFORCEMENT_MATCH | The counterparty relates to an enforcement event that has been executed. |
SANCTIONS_LIST_MATCH | The counterparty appears on an authoritative sanctions list. |
ISSUER_LIST_MATCH | The counterparty appears on an issuer-published enforcement list. |
AUTHORITY_DRIFT | The on-chain control authority for an asset in scope no longer matches its registry entry. |
PATH_HEALTH_DEGRADED | The inbound route for this deposit is currently not healthy. Route-level, not party-level. |
VENDOR_HIGH_RISK | A third-party vendor returned its own highest-risk classification. Reported verbatim, not rescaled. |
VENDOR_DISAGREEMENT | Vendors returned classifications that are not mutually consistent. Reported, never reconciled into one answer. |
AMOUNT_THRESHOLD | The amount crossed a threshold you configured for elevated handling. |
CUSTOMER_RULE | A rule in your active rule version produced this outcome. |
MANUAL_OVERRIDE | A human operator recorded this outcome. |
Degradations — every one of these yields HOLD with HTTP 200
| Code | Meaning |
|---|---|
SCREENING_DEGRADED | A screening source timed out or was unavailable. |
BUDGET_EXHAUSTED | Your configured screening budget for the period is spent. |
LIST_STALE | A required list is older than its freshness objective. |
REGISTRY_ENTRY_STALE | A registry entry in scope has not been re-verified within its window. |
COVERAGE_BLIND_SPOT | An authority in scope for this deposit is not currently observable. |
DECISION_TIMEOUT | The decision could not be completed within its latency budget. |
There is no reason code that permits a credit on degradation, and none will be added. New codes may be introduced in a minor version; clients must treat an unrecognised code as at least as serious as the accompanying risk_level.
ACTIVE_ENFORCEMENT_RELATIONEXECUTED_ENFORCEMENT_MATCHSANCTIONS_LIST_MATCHISSUER_LIST_MATCHAUTHORITY_DRIFTPATH_HEALTH_DEGRADEDVENDOR_HIGH_RISKVENDOR_DISAGREEMENTAMOUNT_THRESHOLDCUSTOMER_RULEMANUAL_OVERRIDESCREENING_DEGRADEDBUDGET_EXHAUSTEDLIST_STALEREGISTRY_ENTRY_STALECOVERAGE_BLIND_SPOTDECISION_TIMEOUT
RequiredAction
An operational step your workflow is expected to complete before the deposit can move out of HOLD.
COLLECT_SOURCE_OF_FUNDS— obtain source-of-funds documentation from the user.L1_REVIEW— first-line analyst review.L2_REVIEW— escalated review.QUARANTINE_ROUTE— route the funds to the quarantine pool and keep them out of shared collection paths.NOTIFY_COMPLIANCE_OFFICER— notify the responsible compliance officer.OPEN_CASE— open a case record for tracking and later audit.RE_DECIDE_AFTER_RECOVERY— the hold was caused by a degradation; call the decision endpoint again once the degradation clears rather than crediting.
COLLECT_SOURCE_OF_FUNDSL1_REVIEWL2_REVIEWQUARANTINE_ROUTENOTIFY_COMPLIANCE_OFFICEROPEN_CASERE_DECIDE_AFTER_RECOVERY
标量类型
Chain string
Chain identifier. Values are data, not a fixed vocabulary: the set supported for your account is returned by GET /v1/coverage. New chains appear without a version bump of this document.
minLength=1 maxLength=64
example-chain
Address string
On-chain address, in the canonical textual form for its chain.
On chains where the freeze primitive operates on a token account rather than a wallet, state is per token account: two token accounts of the same wallet can be in different states, and must be submitted separately.
minLength=1 maxLength=128
0xEXAMPLEaddress0000000000000000000000000
AuthorityId string
Identifier of one enforcement authority — a single "who can freeze what, where" entry — as it appears in your account's coverage. Treat it as an opaque, stable string. The live set of authorities is returned by GET /v1/coverage to authenticated customers and is not enumerated in this document.
minLength=1 maxLength=128
authority-EXAMPLE-0001
SnapshotRef string
Content-addressed reference to an immutable snapshot of a raw upstream response, of the form cas:sha256:<hex>. Snapshots are append-only and version-locked, so a reference resolves to the same bytes forever. Derived conclusions can be recomputed; the raw data behind them cannot be rewritten.
pattern=^cas:sha256:[0-9a-zA-Z]{8,128}$
cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000000
CustomerAddressRef string
Opaque reference to one entry in your own address book. Stable for the lifetime of that entry and resolvable only by your account. It is not the address and cannot be reversed into one.
minLength=1 maxLength=128
caref_EXAMPLE0000000000000001
对象 schema
Problem
RFC 9457 problem detail. All non-2xx responses use this shape.
fail_closed_action is present whenever the failure occurred on a decision path. Its only defined value is HOLD. It is a machine-readable restatement of the client obligation, not a verdict: a verdict only ever arrives in a 200 response body.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| type | string(uri) | 是 | Stable URI identifying the problem class. |
| title | string | 是 | Short, human-readable summary of the problem class. |
| status | integer | 是 | HTTP status code, repeated for convenience. |
| detail | string | 否 | Human-readable explanation specific to this occurrence. |
| fail_closed_action | string | 否 | Present on decision-path failures. Instructs the client what to do in the absence of a verdict. Always |
| request_id | string | 否 | Identifier for this request, for support correlation. |
CoverageHealthEntry
Observability health of one enforcement authority in scope for your account.
Read observable: false, a verified_at outside its window, or an abnormal collector_lag_s as a blind spot, not as an all-clear.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| authority_id | AuthorityId | 是 | Identifier of one enforcement authority — a single "who can freeze what, where" entry — as it appears in your account's coverage. Treat it as an opaque, stable string. The live set of authorities is returned by |
| observable | boolean | 是 | Whether this authority is currently observable to Foreshock. Observability is a property of the authority, not a Foreshock capability, and it can change without notice. |
| verified_at | string(date-time) | 是 | When this authority's registry entry was last verified against the chain. An entry that has not been re-verified within its window is reported as degraded and downgrades any decision that depends on it. |
| collector_lag_s | integer | 是 | Current lag, in seconds, between chain state and Foreshock's view of this authority. |
{
"authority_id": "authority-EXAMPLE-0001",
"observable": true,
"verified_at": "2026-08-24T09:00:00Z",
"collector_lag_s": 3
} ExposureMatch
One match between an enforcement event and an entry in your own address book.
This object is the complete match record. There is no expanded, verbose, or premium form of it that adds the subject address, any path detail, or any score, and no parameter that requests one.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| customer_address_ref | CustomerAddressRef | 是 | Opaque reference to one entry in your own address book. Stable for the lifetime of that entry and resolvable only by your account. It is not the address and cannot be reversed into one. |
| relation | Relation | 是 | An enum indicating how the customer address relates to the enforcement event.
The values are ordinal in specificity only. No further detail about the relation is available through this API by any parameter, plan, or mode. |
| severity | Severity | 是 | Ordinal severity band of the match. A band is not a score. Foreshock publishes no numeric risk score, on this endpoint or any other, in any mode. |
| stage | MatchStage | 是 | Stage of the enforcement event underlying this match, at
Matches that leave this set are announced through the |
| observed_at | string(date-time) | 是 | When Foreshock observed this match. |
| evidence_ref | SnapshotRef | 是 | Content-addressed reference to an immutable snapshot of a raw upstream response, of the form |
{
"customer_address_ref": "caref_EXAMPLE0000000000000001",
"relation": "PATH",
"severity": "R1",
"stage": "PROPOSED",
"observed_at": "2026-08-24T09:04:11Z",
"evidence_ref": "cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000000"
} ExposureResponse
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| as_of | string(date-time) | 是 | Instant this response describes. |
| coverage_health | array<CoverageHealthEntry> | 是 | Coverage health of the authorities in scope for your account, returned with every exposure response so that "no matches" can be told apart from "we cannot currently see". |
| matches | array<ExposureMatch> | 是 | Matches against your own address book, in cursor order. |
| next_cursor | string | null | 否 | Cursor to pass as |
{
"as_of": "2026-08-24T09:05:00Z",
"coverage_health": [
{
"authority_id": "authority-EXAMPLE-0001",
"observable": true,
"verified_at": "2026-08-24T09:00:00Z",
"collector_lag_s": 3
},
{
"authority_id": "authority-EXAMPLE-0002",
"observable": false,
"verified_at": "2026-08-23T21:40:00Z",
"collector_lag_s": 1
}
],
"matches": [
{
"customer_address_ref": "caref_EXAMPLE0000000000000001",
"relation": "PATH",
"severity": "R1",
"stage": "PROPOSED",
"observed_at": "2026-08-24T09:04:11Z",
"evidence_ref": "cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000000"
}
],
"next_cursor": "eyJFWEFNUExFIjoibmV4dC1jdXJzb3ItcGxhY2Vob2xkZXIifQ"
} CoverageResponse
Coverage health for the authorities in scope for the authenticated account. Scope is per-customer; this is not a directory of Foreshock's registry.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| as_of | string(date-time) | 是 | Instant this response describes. |
| coverage_health | array<CoverageHealthEntry> | 是 | |
{
"as_of": "2026-08-24T09:05:00Z",
"coverage_health": [
{
"authority_id": "authority-EXAMPLE-0001",
"observable": true,
"verified_at": "2026-08-24T09:00:00Z",
"collector_lag_s": 3
},
{
"authority_id": "authority-EXAMPLE-0002",
"observable": false,
"verified_at": "2026-08-23T21:40:00Z",
"collector_lag_s": 1
}
]
} ScreenAddressRequest
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| chain | Chain | 是 | Chain identifier. Values are data, not a fixed vocabulary: the set supported for your account is returned by |
| address | Address | 是 | On-chain address, in the canonical textual form for its chain. On chains where the freeze primitive operates on a token account rather than a wallet, state is per token account: two token accounts of the same wallet can be in different states, and must be submitted separately. |
| depth | string | 否 | How far to screen. |
{
"chain": "example-chain",
"address": "0xEXAMPLEaddress0000000000000000000000000",
"depth": "A"
} LayerAHit
Result from one authoritative list source, with a reference to the raw response snapshot that produced it. Answers are references rather than bare booleans so that any result can be re-derived and audited.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| source | string | 是 | Identifier of the list source. Values are data; the set available to your account is not enumerated in this document. |
| hit | boolean | 是 | Whether the address is present on this source. |
| detail | object | 否 | Source-specific detail about the hit, present only when |
| list_version | string | 否 | Version identifier of the list as published by its source. |
| snapshot_ref | SnapshotRef | 是 | Content-addressed reference to an immutable snapshot of a raw upstream response, of the form |
LayerAResult
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| hits | array<LayerAHit> | 是 | One entry per authoritative list source consulted, hit or not. |
| latency_ms | integer | 是 | Wall-clock time spent on layer A, in milliseconds. |
VendorResult
One third-party vendor's result, reproduced as the vendor expressed it.
verdict, score, and categories are the vendor's own. They are not translated, rescaled, or merged. Scores from different vendors are on different scales and are not comparable; Foreshock does not convert between them, because converting would manufacture precision that does not exist and would break the audit trail back to the vendor's original judgement.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| vendor | string | 是 | Vendor name. |
| verdict | string | 是 | The vendor's own classification, verbatim. |
| score | number | null | 否 | The vendor's own score, if the vendor produces one, on the vendor's own scale. |
| categories | array<string> | 否 | The vendor's own labels, untranslated. |
| list_version | string | 否 | Version identifier of the vendor data set consulted. |
| raw_ref | SnapshotRef | 是 | Content-addressed reference to an immutable snapshot of a raw upstream response, of the form |
LayerBResult
Third-party vendor results, listed side by side. Foreshock does not reconcile them and does not emit a combined verdict or a combined score.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| results | array<VendorResult> | 是 | |
| latency_ms | integer | 是 | Wall-clock time spent on layer B, in milliseconds. |
ScreenAddressResponse
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| layer_a | LayerAResult | 是 | |
| layer_b | LayerBResult | null | 是 | Vendor results, or |
| billable_units | integer | 是 | Billable units consumed by this call. Layer A is never billed, so a layer-A only response is |
{
"layer_a": {
"hits": [
{
"source": "example_issuer_blacklist",
"hit": true,
"detail": {
"stage": "EXECUTED",
"executed_at": "2026-08-22T14:31:07Z"
},
"snapshot_ref": "cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000001"
},
{
"source": "sanctions_list",
"hit": false,
"list_version": "example-list-v2026.08.24",
"snapshot_ref": "cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000002"
}
],
"latency_ms": 41
},
"layer_b": null,
"billable_units": 0
} DecideDepositRequest
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| deposit_ref | string | 是 | Your own identifier for this deposit. Echoed into the decision record. |
| chain | Chain | 是 | Chain identifier. Values are data, not a fixed vocabulary: the set supported for your account is returned by |
| tx_hash | string | 是 | Transaction hash of the inbound transfer. |
| from_address | Address | 是 | On-chain address, in the canonical textual form for its chain. On chains where the freeze primitive operates on a token account rather than a wallet, state is per token account: two token accounts of the same wallet can be in different states, and must be submitted separately. |
| to_address | Address | 是 | On-chain address, in the canonical textual form for its chain. On chains where the freeze primitive operates on a token account rather than a wallet, state is per token account: two token accounts of the same wallet can be in different states, and must be submitted separately. |
| asset | string | 是 | Asset symbol or contract reference for the transferred asset. Values are data; the supported set for your account is reflected in |
| amount_usd | string | 是 | Amount in USD, as a decimal string to avoid floating-point loss. Used against the thresholds you configured. |
| user_ref | string | 否 | Your identifier for the depositing user. Foreshock does not perform KYC and stores this only as a reference. |
| kyc_ref | string | 否 | Your identifier for the user's existing KYC record. A reference only; Foreshock does not perform or evaluate KYC. |
{
"deposit_ref": "deposit-EXAMPLE-0001",
"chain": "example-chain",
"tx_hash": "0xEXAMPLEtxhash000000000000000000000000000000000000000000000000000",
"from_address": "0xEXAMPLEaddress0000000000000000000000001",
"to_address": "0xEXAMPLEaddress0000000000000000000000002",
"asset": "EXAMPLEUSD",
"amount_usd": "25000.00",
"user_ref": "user-EXAMPLE-0001",
"kyc_ref": "kyc-EXAMPLE-0001"
} DecisionReason
One classification behind the verdict. A reason states what class of finding applied. It does not state how the finding was made.
| 名称 | 类型 | 必填 | 描述 | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| code | ReasonCode | 是 | Classification code explaining why a verdict came out the way it did. Reason codes classify. They do not describe derivation, and none of them is accompanied by an enforcement target address, a path detail, or a score. Risk classifications
Degradations — every one of these yields
There is no reason code that permits a credit on degradation, and none will be added. New codes may be introduced in a minor version; clients must treat an unrecognised code as at least as serious as the accompanying | ||||||||||||||||||||||||||||||||||||||
| severity | RiskLevel | null | 否 | Severity band this reason contributed, when the reason carries one. A band, not a score. | ||||||||||||||||||||||||||||||||||||||
| vendor | string | 否 | Vendor name, present only on reasons that originate from a third-party vendor. | ||||||||||||||||||||||||||||||||||||||
| raw_ref | SnapshotRef | null | 否 | Reference to the immutable snapshot of the raw upstream response behind this reason, when one exists. |
DecideDepositResponse
The verdict for one deposit.
A verdict only ever arrives in a 200 response. Any 5xx means no verdict exists and the client must apply HOLD.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| decision_id | string(uuid) | 是 | Identifier of the append-only decision record. Use it to fetch the evidence bundle. Decision records are never updated or deleted. |
| verdict | string | 是 |
There is no fourth value, and no path returns |
| risk_level | RiskLevel | 是 | Ordinal risk band assigned to a decision, |
| pool | Pool | 是 | Segregation pool the funds should be routed to. Keeping pools separate is what prevents differently classified funds from being swept into one collection address. |
| reasons | array<DecisionReason> | 是 | Classification codes behind the verdict. Empty only on a clean |
| vendor_disagreement | boolean | 是 | Whether third-party vendors returned mutually inconsistent classifications. Reported so you can see the disagreement. Foreshock does not resolve it into a single answer. |
| rule_version | string | 是 | Version of your rule set that produced this decision. Rule versions are stored, two-person reviewed, and reproducible, so a past decision can be replayed against the rules that were actually in force at the time. |
| required_actions | array<RequiredAction> | 是 | Steps your workflow must complete before this deposit can leave |
| sla_deadline | string | null | 否 | When the required actions are due under your configured service levels. |
| evidence_ref | SnapshotRef | 是 | Content-addressed reference to an immutable snapshot of a raw upstream response, of the form |
| billable_units | integer | 是 | Billable units consumed by this decision. |
{
"decision_id": "11111111-1111-4111-8111-111111111111",
"verdict": "HOLD",
"risk_level": "R1",
"pool": "quarantine",
"reasons": [
{
"code": "ACTIVE_ENFORCEMENT_RELATION",
"severity": "R1"
},
{
"code": "VENDOR_HIGH_RISK",
"vendor": "example-vendor",
"raw_ref": "cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000003"
}
],
"vendor_disagreement": false,
"rule_version": "rules-EXAMPLE-2026.08.01",
"required_actions": [
"COLLECT_SOURCE_OF_FUNDS",
"L2_REVIEW"
],
"sla_deadline": "2026-08-24T13:05:00Z",
"evidence_ref": "cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000004",
"billable_units": 1
} WebhookEnvelope
Fields common to every webhook delivery.
Delivery semantics — at least once. The same event_id may arrive more than once, and out of order relative to other events. Deduplicate on event_id and order your own state by occurred_at.
Retry envelope — 24 hours. A delivery is successful only on a 2xx returned within 5 seconds. Anything else is retried with exponential backoff and jitter for up to 24 hours from occurred_at. After that the event moves to a dead-letter queue, an alert is raised on your account, and the events remain replayable from the console.
Signature. Verify Foreshock-Signature over the raw request body before parsing it. See that header's description for the exact procedure.
A missed webhook must not be read as an all-clear. GET /v1/exposure with your last cursor is the authoritative reconciliation path; the webhook stream is a latency optimisation over it.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| event_id | string(uuid) | 是 | Stable identifier for this event. Constant across retries. Deduplicate on this. |
| event_type | string | 是 | Type of this event. Mirrors the |
| occurred_at | string(date-time) | 是 | When the event occurred. Retries do not change this value. |
ExposureMatchEvent
A match involving one of your own addresses was created or changed.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| event_id | string(uuid) | 是 | Stable identifier for this event. Constant across retries. Deduplicate on this. |
| event_type | string | 是 | Type of this event. Mirrors the |
| occurred_at | string(date-time) | 是 | When the event occurred. Retries do not change this value. |
| match | ExposureMatch | 是 | One match between an enforcement event and an entry in your own address book. This object is the complete match record. There is no expanded, verbose, or premium form of it that adds the subject address, any path detail, or any score, and no parameter that requests one. |
{
"event_id": "44444444-4444-4444-8444-444444444444",
"event_type": "exposure.match",
"occurred_at": "2026-08-24T09:04:11Z",
"match": {
"customer_address_ref": "caref_EXAMPLE0000000000000001",
"relation": "PATH",
"severity": "R1",
"stage": "PROPOSED",
"observed_at": "2026-08-24T09:04:11Z",
"evidence_ref": "cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000000"
}
} ExposureRevokedEvent
A match was removed from your active match set. Announced explicitly so your local list cannot silently diverge from ours. Not a clearance.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| event_id | string(uuid) | 是 | Stable identifier for this event. Constant across retries. Deduplicate on this. |
| event_type | string | 是 | Type of this event. Mirrors the |
| occurred_at | string(date-time) | 是 | When the event occurred. Retries do not change this value. |
| customer_address_ref | CustomerAddressRef | 是 | Opaque reference to one entry in your own address book. Stable for the lifetime of that entry and resolvable only by your account. It is not the address and cannot be reversed into one. |
| stage | RevocationStage | 是 | Terminal stage that removed a match from the active set.
|
| evidence_ref | SnapshotRef | 是 | Content-addressed reference to an immutable snapshot of a raw upstream response, of the form |
{
"event_id": "55555555-5555-4555-8555-555555555555",
"event_type": "exposure.revoked",
"occurred_at": "2026-08-24T10:12:00Z",
"customer_address_ref": "caref_EXAMPLE0000000000000001",
"stage": "REVOKED",
"evidence_ref": "cas:sha256:EXAMPLE00000000000000000000000000000000000000000000000000000005"
} CoverageHealthChangedEvent
The observability health of an authority in scope for your account changed.
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| event_id | string(uuid) | 是 | Stable identifier for this event. Constant across retries. Deduplicate on this. |
| event_type | string | 是 | Type of this event. Mirrors the |
| occurred_at | string(date-time) | 是 | When the event occurred. Retries do not change this value. |
| coverage_health | array<CoverageHealthEntry> | 是 | Current health of the affected authorities. |
{
"event_id": "66666666-6666-4666-8666-666666666666",
"event_type": "coverage.health_changed",
"occurred_at": "2026-08-24T10:20:00Z",
"coverage_health": [
{
"authority_id": "authority-EXAMPLE-0002",
"observable": false,
"verified_at": "2026-08-23T21:40:00Z",
"collector_lag_s": 1
}
]
}