List the Watchtower answers houses contested, with the contributions behind each
const url = 'https://api.aerandil.com/v1/watchtower/contests?limit=50';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.aerandil.com/v1/watchtower/contests?limit=50' \ --header 'Authorization: Bearer <token>'The platform’s review queue for Watchtower, the card rail’s federated fraud network: every fraud_network_signal a desk contested (contest_fraud_network_signal), across every tenant, most recently contested first — the house it was given to, when and why it was contested, the answer’s buckets, band_floor and floor_basis — and the contributions behind it: every fraud_network_contribution carrying one of the digests the answer kept, under its salt epoch, within the two-year look-back the answer was read with. A contribution is listed whatever its status now, naming its house, outcome, status and source; counts says whether the next answer still counts it (active, its house still consenting), own_house whether it is the contesting house’s own, and after_answer whether it was contributed after the answer (so did not shape it). An answer frozen before its digests were kept (2026-11-03) lists none (traceable: false). The platform operator’s read (tenant_admin:write), cleared to read internal.restricted (markings:internal.restricted:read): 403 without either, insufficient_clearance without the second.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”At most this many contests (default 50).
Responses
Section titled “Responses”The contested answers, newest contest first.
object
An answer a house contested, the house it was given to, and the contributions behind it.
object
A contribution behind a contested answer, as the platform’s review reads it: whose, what, and whether it still counts.
object
Contributed after the answer was given, so it did not shape it.
Whether the next answer counts it: active, its house still consenting.
The contesting house’s own contribution.
The processor’s dispute id, or the assessment id.
Whether the answer kept its digests (since 2026-11-03).
Example
{ "contests": [ { "band_floor": "low", "contributions": [ { "matched_kinds": [ "card" ], "outcome": "chargeback_lost_fraud", "status": "active", "withdrawn_by": "house" } ], "contributor_breadth": "none", "floor_basis": "none", "kinds_queried": [ "card" ], "match_count_bucket": "none", "matched_kinds": [ "card" ], "recency_bucket": "none" } ]}Headers
Section titled “Headers”Always no-store. Object and link state is live data and is never cacheable.
The bearer authenticated but does not hold the scope this operation requires.
Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.
object
object
Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).
Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.
Human-readable explanation of the failure.
Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).
Examplegenerated
{ "error": { "code": "example", "instance_id": "example", "message": "example", "parameters": "example" }}The request parsed but a validator refused it. The envelope’s code names which rule.
Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.
object
object
Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).
Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.
Human-readable explanation of the failure.
Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).
Examplegenerated
{ "error": { "code": "example", "instance_id": "example", "message": "example", "parameters": "example" }}