Get Panel Availability
const url = 'https://example.com/api/canvas/example/panel-availability';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://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”.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”Successful Response
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
Examplegenerated
{ "deal_id": "example", "comparables_trail": true, "sponsor_patterns": true, "provenance": true}Validation Error
object
object
object
Examplegenerated
{ "detail": [ { "loc": [ "example" ], "msg": "example", "type": "example", "input": "example", "ctx": {} } ]}