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. Any probe that times out / hits degraded DI / errors degrades to false (the tab stays hidden — the safe default). Never raises a 5xx for “no data”.

deal_id
required
Deal Id
string

Successful Response

Media type application/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
Example generated
{
"deal_id": "example",
"comparables_trail": true,
"sponsor_patterns": true,
"provenance": true
}

Validation Error

Media type application/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
Example generated
{
"detail": [
{
"loc": [
"example"
],
"msg": "example",
"type": "example",
"input": "example",
"ctx": {}
}
]
}