Doctor / Health Check
Channel managers move real money, so the integration ships a checker rather than trusting that a push
returned 200. ChannexDoctorService verifies a listing's integration end-to-end.
GET /api/v1/admin/channex/listings/{listingId}/doctor?channelId=chnl_X&sampleDays=14
It runs these checks and returns a structured report:
| Check | Verifies |
|---|---|
credentials | a Channex API key is configured for the channel |
api_reachable | GET /properties succeeds with the key |
property_mapping | the listing is onboarded (channex_property_id present, SYNCED) |
room_type_mappings | every room type has a room_type_id + rate_plan_id |
availability_readback | a sampled GET /availability matches locally computed availability |
rate_readback | a sampled GET /restrictions?…&filter[restrictions]=rate matches local rates |
feed_reachable | the revision feed responds; reports the pending-revision count |
sampleDays controls the read-back window (default 14, max 60). The read-backs compare Channex's values
against what we would push for the same cells, so any drift (a stale rate, a missed availability
update) is surfaced with the specific mismatching cells.
CI / monitoring
The endpoint returns 200 when every check passes and 503 when any check fails, so a monitor or
CI job can alert on a failing integration without parsing the body.
{
"listingId": "lst_0853ie",
"channelId": "chnl_X",
"ok": false,
"checks": [
{ "name": "rate_readback", "ok": false,
"detail": "1 of 14 mismatch: [cx_rate|2026-07-03 local=12000 channex=15000]" }
]
}