Skip to content

Get Panel Availability

GET
/api/canvas/{deal_id}/panel-availability
curl --request GET \
--url https://example.com/api/canvas/example/panel-availability \
--header 'Authorization: Bearer <token>'

Return which data-gated right-sidebar tabs have data for deal_id.

RBAC: RequireViewer — identical to the three panels it gates (comparables_trail / sponsor_patterns / conflict_provenance, all RequireViewer). The booleans expose strictly less than the panels themselves.

Response shape::

{"deal_id": "...",
 "comparables_trail": true | false,
 "sponsor_patterns": true | false,
 "provenance": true | false}

Each field is an independent existence probe. G4 (2026-06-10): a probe that CONFIRMS absence returns false (tab hidden — correct); a probe that cannot answer (timeout / error) falls back to the deal’s last CONFIRMED value, defaulting to false only when nothing is known yet — a transient 2s intel timeout no longer hides a tab that had data. Never raises a 5xx for “no data”.

deal_id
required
Deal Id
string

Successful Response

Media typeapplication/json
PanelAvailabilityResponse

Which data-gated right-sidebar tabs have data for deal_id.

Snake_case keys are part of the canvas-contract Python↔TS parity invariant — they mirror PanelAvailabilityResponse in canvas-ui/src/api/canvasApi/panelAvailability.ts field-for-field. Do NOT camelCase.

object
deal_id
required
Deal Id
string
comparables_trail
required
Comparables Trail
boolean
sponsor_patterns
required
Sponsor Patterns
boolean
provenance
required
Provenance
boolean
Examplegenerated
{
"deal_id": "example",
"comparables_trail": true,
"sponsor_patterns": true,
"provenance": true
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string
input
Input
ctx
Context
object
Examplegenerated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example",
"input": "example",
"ctx": {}
}
]
}