{"info":{"name":"PanelRoute Partner API","description":"Provision clinics, manage patients, place lab orders, pull results. Set the `apiKey` variable to a prk_test_… key to hit the sandbox, or prk_live_… for production.","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{apiKey}}","type":"string"}]},"variable":[{"key":"baseUrl","value":"https://api.panelroute.com/v1","type":"string"},{"key":"apiKey","value":"prk_test_replace_me","type":"string"}],"item":[{"name":"Clinics","item":[{"name":"POST /providers","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/providers","host":["{{baseUrl}}"],"path":["providers"],"query":[]},"description":"Creates (or returns, idempotently on external_clinic_id) a clinic under your partner account. Auto-activated. Partner keys only. Required scope: providers:write.","body":{"mode":"raw","raw":"{\n  \"org_name\": \"Downtown Family Clinic\",\n  \"external_clinic_id\": \"clinic_8842\",\n  \"contact_email\": \"ops@downtownclinic.com\",\n  \"npi\": \"1982749531\",\n  \"licensed_states\": [\n    \"AZ\"\n  ],\n  \"baa_attested\": true\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/providers","host":["{{baseUrl}}"],"path":["providers"],"query":[]},"description":"Creates (or returns, idempotently on external_clinic_id) a clinic under your partner account. Auto-activated. Partner keys only. Required scope: providers:write.","body":{"mode":"raw","raw":"{\n  \"org_name\": \"Downtown Family Clinic\",\n  \"external_clinic_id\": \"clinic_8842\",\n  \"contact_email\": \"ops@downtownclinic.com\",\n  \"npi\": \"1982749531\",\n  \"licensed_states\": [\n    \"AZ\"\n  ],\n  \"baa_attested\": true\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"provider\": {\n    \"id\": \"prov_uuid\",\n    \"org_name\": \"Downtown Family Clinic\",\n    \"status\": \"active\",\n    \"external_clinic_id\": \"clinic_8842\"\n  }\n}"}]},{"name":"GET /providers","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/providers","host":["{{baseUrl}}"],"path":["providers"],"query":[]},"description":"Required scope: providers:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/providers","host":["{{baseUrl}}"],"path":["providers"],"query":[]},"description":"Required scope: providers:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"data\": [\n    {\n      \"id\": \"prov_uuid\",\n      \"org_name\": \"Downtown Family Clinic\",\n      \"status\": \"active\",\n      \"external_clinic_id\": \"clinic_8842\",\n      \"npi\": \"1982749531\",\n      \"licensed_states\": [\n        \"AZ\"\n      ]\n    }\n  ]\n}"}]},{"name":"GET /providers/{id}","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/providers/:id","host":["{{baseUrl}}"],"path":["providers",":id"],"query":[]},"description":"Required scope: providers:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/providers/:id","host":["{{baseUrl}}"],"path":["providers",":id"],"query":[]},"description":"Required scope: providers:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"provider\": {\n    \"id\": \"prov_uuid\",\n    \"org_name\": \"Downtown Family Clinic\",\n    \"status\": \"active\",\n    \"external_clinic_id\": \"clinic_8842\",\n    \"contact_email\": \"ops@downtownclinic.com\"\n  }\n}"}]},{"name":"PATCH /providers/{id}","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/providers/:id","host":["{{baseUrl}}"],"path":["providers",":id"],"query":[]},"description":"Partial update: org_name, contact_email, npi, licensed_states. Status and billing linkage are platform-managed. Required scope: providers:write.","body":{"mode":"raw","raw":"{\n  \"contact_email\": \"newops@downtownclinic.com\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/providers/:id","host":["{{baseUrl}}"],"path":["providers",":id"],"query":[]},"description":"Partial update: org_name, contact_email, npi, licensed_states. Status and billing linkage are platform-managed. Required scope: providers:write.","body":{"mode":"raw","raw":"{\n  \"contact_email\": \"newops@downtownclinic.com\"\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"provider\": {\n    \"id\": \"prov_uuid\",\n    \"org_name\": \"Downtown Family Clinic\",\n    \"status\": \"active\",\n    \"contact_email\": \"newops@downtownclinic.com\"\n  }\n}"}]}]},{"name":"Patients","item":[{"name":"POST /patients","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/patients","host":["{{baseUrl}}"],"path":["patients"],"query":[]},"description":"Email, phone, and full address are required so orders are ready to ship. A test key creates a sandbox patient. Required scope: patients:write.","body":{"mode":"raw","raw":"{\n  \"provider_id\": \"prov_uuid\",\n  \"first_name\": \"Jane\",\n  \"last_name\": \"Doe\",\n  \"dob\": \"1990-04-12\",\n  \"gender\": \"female\",\n  \"email\": \"jane@example.com\",\n  \"phone\": \"6025551234\",\n  \"address_line1\": \"123 Main St\",\n  \"address_city\": \"Phoenix\",\n  \"address_state\": \"AZ\",\n  \"address_zip\": \"85004\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/patients","host":["{{baseUrl}}"],"path":["patients"],"query":[]},"description":"Email, phone, and full address are required so orders are ready to ship. A test key creates a sandbox patient. Required scope: patients:write.","body":{"mode":"raw","raw":"{\n  \"provider_id\": \"prov_uuid\",\n  \"first_name\": \"Jane\",\n  \"last_name\": \"Doe\",\n  \"dob\": \"1990-04-12\",\n  \"gender\": \"female\",\n  \"email\": \"jane@example.com\",\n  \"phone\": \"6025551234\",\n  \"address_line1\": \"123 Main St\",\n  \"address_city\": \"Phoenix\",\n  \"address_state\": \"AZ\",\n  \"address_zip\": \"85004\"\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"patient\": {\n    \"id\": \"pat_uuid\",\n    \"provider_id\": \"prov_uuid\",\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Doe\",\n    \"dob\": \"1990-04-12\",\n    \"gender\": \"female\"\n  }\n}"}]},{"name":"GET /patients","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/patients?provider_id=&q=&limit=&starting_after=","host":["{{baseUrl}}"],"path":["patients"],"query":[{"key":"provider_id","value":"","description":"Filter to one clinic.","disabled":true},{"key":"q","value":"","description":"Search by name.","disabled":true},{"key":"limit","value":"","description":"1–100 (default 50).","disabled":true},{"key":"starting_after","value":"","description":"Cursor: the next_cursor from the previous page.","disabled":true}]},"description":"Required scope: patients:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/patients?provider_id=&q=&limit=&starting_after=","host":["{{baseUrl}}"],"path":["patients"],"query":[{"key":"provider_id","value":"","description":"Filter to one clinic.","disabled":true},{"key":"q","value":"","description":"Search by name.","disabled":true},{"key":"limit","value":"","description":"1–100 (default 50).","disabled":true},{"key":"starting_after","value":"","description":"Cursor: the next_cursor from the previous page.","disabled":true}]},"description":"Required scope: patients:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"data\": [\n    {\n      \"id\": \"pat_uuid\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\",\n      \"dob\": \"1990-04-12\"\n    }\n  ],\n  \"has_more\": false,\n  \"next_cursor\": null\n}"}]},{"name":"GET /patients/{id}","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/patients/:id","host":["{{baseUrl}}"],"path":["patients",":id"],"query":[]},"description":"Required scope: patients:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/patients/:id","host":["{{baseUrl}}"],"path":["patients",":id"],"query":[]},"description":"Required scope: patients:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"patient\": {\n    \"id\": \"pat_uuid\",\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Doe\",\n    \"dob\": \"1990-04-12\",\n    \"gender\": \"female\"\n  }\n}"}]},{"name":"PATCH /patients/{id}","request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/patients/:id","host":["{{baseUrl}}"],"path":["patients",":id"],"query":[]},"description":"Partial update of contact, address, and name. dob/gender changes go through support. The patient must remain order-ready (required fields can’t be blanked). Required scope: patients:write.","body":{"mode":"raw","raw":"{\n  \"phone\": \"6025559999\",\n  \"address_line1\": \"500 New Address Rd\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/patients/:id","host":["{{baseUrl}}"],"path":["patients",":id"],"query":[]},"description":"Partial update of contact, address, and name. dob/gender changes go through support. The patient must remain order-ready (required fields can’t be blanked). Required scope: patients:write.","body":{"mode":"raw","raw":"{\n  \"phone\": \"6025559999\",\n  \"address_line1\": \"500 New Address Rd\"\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"patient\": {\n    \"id\": \"pat_uuid\",\n    \"first_name\": \"Jane\",\n    \"last_name\": \"Doe\",\n    \"phone\": \"6025559999\"\n  }\n}"}]}]},{"name":"Panels","item":[{"name":"GET /panels","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/panels?provider_id=&include_archived=","host":["{{baseUrl}}"],"path":["panels"],"query":[{"key":"provider_id","value":"","description":"Include this clinic’s custom panels.","disabled":true},{"key":"include_archived","value":"","description":"true to list EVERY custom panel the owner has — archived, pending (e.g. awaiting re-approval after a restore) and rejected included — instead of only orderable ones. Applies to the clinic named by provider_id (pass your own id with a provider key) and, for partner keys, to shared panels. Every custom panel carries approval_status, archived and orderable; restore archived ones with POST /panels/{id}/restore (only approval_status \"approved\" restores straight to orderable).","disabled":true}]},"description":"Standard panels, your partner-wide shared panels (shared: true), plus a clinic’s own custom panels with ?provider_id. Every panel lists its biomarkers in `markers` ({ marker_id, name, slug }) so you can show doctors and patients exactly what is being ordered; marker_count is its length. Partner keys see wholesale_price + retail_price; provider keys see price. Prices are per-panel — every order additionally carries a fixed $15.00 Lab Processing Fee. Required scope: panels:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/panels?provider_id=&include_archived=","host":["{{baseUrl}}"],"path":["panels"],"query":[{"key":"provider_id","value":"","description":"Include this clinic’s custom panels.","disabled":true},{"key":"include_archived","value":"","description":"true to list EVERY custom panel the owner has — archived, pending (e.g. awaiting re-approval after a restore) and rejected included — instead of only orderable ones. Applies to the clinic named by provider_id (pass your own id with a provider key) and, for partner keys, to shared panels. Every custom panel carries approval_status, archived and orderable; restore archived ones with POST /panels/{id}/restore (only approval_status \"approved\" restores straight to orderable).","disabled":true}]},"description":"Standard panels, your partner-wide shared panels (shared: true), plus a clinic’s own custom panels with ?provider_id. Every panel lists its biomarkers in `markers` ({ marker_id, name, slug }) so you can show doctors and patients exactly what is being ordered; marker_count is its length. Partner keys see wholesale_price + retail_price; provider keys see price. Prices are per-panel — every order additionally carries a fixed $15.00 Lab Processing Fee. Required scope: panels:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"data\": [\n    {\n      \"id\": \"panel_uuid\",\n      \"type\": \"custom\",\n      \"name\": \"TRT Panel (Male)\",\n      \"collection_method\": \"walk_in_test\",\n      \"lab_name\": \"Labcorp\",\n      \"marker_count\": 4,\n      \"markers\": [\n        {\n          \"marker_id\": 123,\n          \"name\": \"Testosterone, Total\",\n          \"slug\": \"testosterone-total\"\n        },\n        {\n          \"marker_id\": 124,\n          \"name\": \"Testosterone, Free\",\n          \"slug\": \"testosterone-free\"\n        },\n        {\n          \"marker_id\": 201,\n          \"name\": \"Estradiol\",\n          \"slug\": \"estradiol\"\n        },\n        {\n          \"marker_id\": 305,\n          \"name\": \"Sex Hormone Binding Globulin\",\n          \"slug\": \"shbg\"\n        }\n      ],\n      \"approval_status\": \"approved\",\n      \"archived\": false,\n      \"orderable\": true,\n      \"wholesale_price\": \"54.00\",\n      \"retail_price\": \"70.20\"\n    }\n  ]\n}"}]},{"name":"GET /panels/{id}","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/panels/:id?provider_id=","host":["{{baseUrl}}"],"path":["panels",":id"],"query":[{"key":"provider_id","value":"","description":"Partner keys: the clinic whose custom panel this is.","disabled":true}]},"description":"One panel with its full biomarker list, priced exactly as GET /panels. Standard panels, your shared panels, and (with ?provider_id for partner keys) a clinic’s own custom panels — archived ones included, with orderable: false. 404 when the panel is not in your scope. Required scope: panels:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/panels/:id?provider_id=","host":["{{baseUrl}}"],"path":["panels",":id"],"query":[{"key":"provider_id","value":"","description":"Partner keys: the clinic whose custom panel this is.","disabled":true}]},"description":"One panel with its full biomarker list, priced exactly as GET /panels. Standard panels, your shared panels, and (with ?provider_id for partner keys) a clinic’s own custom panels — archived ones included, with orderable: false. 404 when the panel is not in your scope. Required scope: panels:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"panel\": {\n    \"id\": \"panel_uuid\",\n    \"type\": \"custom\",\n    \"name\": \"TRT Panel (Male)\",\n    \"collection_method\": \"walk_in_test\",\n    \"lab_name\": \"Labcorp\",\n    \"marker_count\": 4,\n    \"markers\": [\n      {\n        \"marker_id\": 123,\n        \"name\": \"Testosterone, Total\",\n        \"slug\": \"testosterone-total\"\n      },\n      {\n        \"marker_id\": 124,\n        \"name\": \"Testosterone, Free\",\n        \"slug\": \"testosterone-free\"\n      },\n      {\n        \"marker_id\": 201,\n        \"name\": \"Estradiol\",\n        \"slug\": \"estradiol\"\n      },\n      {\n        \"marker_id\": 305,\n        \"name\": \"Sex Hormone Binding Globulin\",\n        \"slug\": \"shbg\"\n      }\n    ],\n    \"approval_status\": \"approved\",\n    \"archived\": false,\n    \"orderable\": true,\n    \"wholesale_price\": \"54.00\",\n    \"retail_price\": \"70.20\"\n  }\n}"}]},{"name":"GET /biomarkers","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/biomarkers?q=&lab=&page=&size=&provider_id=","host":["{{baseUrl}}"],"path":["biomarkers"],"query":[{"key":"q","value":"","description":"Search term (min 2 chars). Optional when lab is given — omit to list the lab’s full catalog.","disabled":true},{"key":"lab","value":"","description":"quest | labcorp | bioreference | sonora_quest | ihd — required to get provider_id codes.","disabled":true},{"key":"page","value":"","description":"Page number (default 1). Keep requesting until page equals pages.","disabled":true},{"key":"size","value":"","description":"Results per page, 1–100 (default 50).","disabled":true},{"key":"provider_id","value":"","description":"Partner keys: price as that clinic’s own panel. Omit for shared-panel pricing.","disabled":true}]},"description":"Search orderable biomarkers by name — or omit q and pass lab to page through that lab’s full catalog. Each result’s marker_id + provider_id plug straight into POST /v1/panels’ markers array — build a panel-builder UI on top of this. provider_id codes are lab-specific: pass ?lab= when building a panel (all of a panel’s markers must come from one lab). Every marker carries its own price, markup included: provider keys see price; partner keys see wholesale_price + retail_price. Marker prices are estimates for building panels — the panel’s price is confirmed when it is created (a panel is priced as one lab test, which can differ from the sum of its markers), and every order adds the flat lab_processing_fee once. price_varies: true means the lab may adjust that marker’s price by condition (e.g. patient state). Required scope: panels:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/biomarkers?q=&lab=&page=&size=&provider_id=","host":["{{baseUrl}}"],"path":["biomarkers"],"query":[{"key":"q","value":"","description":"Search term (min 2 chars). Optional when lab is given — omit to list the lab’s full catalog.","disabled":true},{"key":"lab","value":"","description":"quest | labcorp | bioreference | sonora_quest | ihd — required to get provider_id codes.","disabled":true},{"key":"page","value":"","description":"Page number (default 1). Keep requesting until page equals pages.","disabled":true},{"key":"size","value":"","description":"Results per page, 1–100 (default 50).","disabled":true},{"key":"provider_id","value":"","description":"Partner keys: price as that clinic’s own panel. Omit for shared-panel pricing.","disabled":true}]},"description":"Search orderable biomarkers by name — or omit q and pass lab to page through that lab’s full catalog. Each result’s marker_id + provider_id plug straight into POST /v1/panels’ markers array — build a panel-builder UI on top of this. provider_id codes are lab-specific: pass ?lab= when building a panel (all of a panel’s markers must come from one lab). Every marker carries its own price, markup included: provider keys see price; partner keys see wholesale_price + retail_price. Marker prices are estimates for building panels — the panel’s price is confirmed when it is created (a panel is priced as one lab test, which can differ from the sum of its markers), and every order adds the flat lab_processing_fee once. price_varies: true means the lab may adjust that marker’s price by condition (e.g. patient state). Required scope: panels:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"data\": [\n    {\n      \"marker_id\": 123,\n      \"name\": \"Testosterone, Total\",\n      \"slug\": \"testosterone-total\",\n      \"unit\": \"ng/dL\",\n      \"provider_id\": \"TESTOSTERONE_TOTAL\",\n      \"lab\": \"labcorp\",\n      \"wholesale_price\": \"34.82\",\n      \"retail_price\": \"45.27\",\n      \"price_varies\": false\n    }\n  ],\n  \"page\": 1,\n  \"size\": 50,\n  \"pages\": 21,\n  \"lab_processing_fee\": \"15.00\"\n}"}]},{"name":"GET /coverage","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/coverage?zip=&radius=&lab=&provider_id=","host":["{{baseUrl}}"],"path":["coverage"],"query":[{"key":"zip","value":"","description":"5-digit zip (ZIP+4 accepted). Required.","disabled":true},{"key":"radius","value":"","description":"Miles: 10 | 20 | 25 | 50 | 100 (default 25).","disabled":true},{"key":"lab","value":"","description":"quest | labcorp | bioreference | sonora_quest — repeat or comma-separate; default all.","disabled":true},{"key":"provider_id","value":"","description":"Partner keys: check through that clinic’s lab account.","disabled":true}]},"description":"How many patient service centers (walk-in draw sites) each lab has within range of a zip — check before ordering so the patient is sent to a lab that is actually nearby. ZIP only (convert a city to a zip first). locations_within_radius is null when that lab is not offered for the area at all (e.g. Quest and Labcorp in NY, NJ and RI); 0 means offered but no locations within the radius. Walk-in only: at-home draws are not offered. Required scope: panels:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/coverage?zip=&radius=&lab=&provider_id=","host":["{{baseUrl}}"],"path":["coverage"],"query":[{"key":"zip","value":"","description":"5-digit zip (ZIP+4 accepted). Required.","disabled":true},{"key":"radius","value":"","description":"Miles: 10 | 20 | 25 | 50 | 100 (default 25).","disabled":true},{"key":"lab","value":"","description":"quest | labcorp | bioreference | sonora_quest — repeat or comma-separate; default all.","disabled":true},{"key":"provider_id","value":"","description":"Partner keys: check through that clinic’s lab account.","disabled":true}]},"description":"How many patient service centers (walk-in draw sites) each lab has within range of a zip — check before ordering so the patient is sent to a lab that is actually nearby. ZIP only (convert a city to a zip first). locations_within_radius is null when that lab is not offered for the area at all (e.g. Quest and Labcorp in NY, NJ and RI); 0 means offered but no locations within the radius. Walk-in only: at-home draws are not offered. Required scope: panels:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"zip\": \"85004\",\n  \"radius_miles\": 25,\n  \"data\": [\n    {\n      \"lab\": \"quest\",\n      \"lab_name\": \"Quest Diagnostics\",\n      \"locations_within_radius\": 36,\n      \"available\": true\n    },\n    {\n      \"lab\": \"labcorp\",\n      \"lab_name\": \"LabCorp\",\n      \"locations_within_radius\": 16,\n      \"available\": true\n    },\n    {\n      \"lab\": \"bioreference\",\n      \"lab_name\": \"BioReference\",\n      \"locations_within_radius\": null,\n      \"available\": false\n    }\n  ]\n}"}]},{"name":"POST /panels","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/panels","host":["{{baseUrl}}"],"path":["panels"],"query":[]},"description":"Registers a custom panel with the lab network. Pass provider_id for a single-clinic panel, or shared: true (partner keys) for a partner-wide panel orderable by ALL your clinics. Auto-approves when the lab activates it immediately; otherwise it is pending and panel.approved fires once active (usually within a day). Live keys only. Required scope: panels:write.","body":{"mode":"raw","raw":"{\n  \"shared\": true,\n  \"name\": \"TRT Panel (Male)\",\n  \"collection_method\": \"walk_in_test\",\n  \"markers\": [\n    {\n      \"marker_id\": 123,\n      \"provider_id\": \"TESTOSTERONE_TOTAL\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/panels","host":["{{baseUrl}}"],"path":["panels"],"query":[]},"description":"Registers a custom panel with the lab network. Pass provider_id for a single-clinic panel, or shared: true (partner keys) for a partner-wide panel orderable by ALL your clinics. Auto-approves when the lab activates it immediately; otherwise it is pending and panel.approved fires once active (usually within a day). Live keys only. Required scope: panels:write.","body":{"mode":"raw","raw":"{\n  \"shared\": true,\n  \"name\": \"TRT Panel (Male)\",\n  \"collection_method\": \"walk_in_test\",\n  \"markers\": [\n    {\n      \"marker_id\": 123,\n      \"provider_id\": \"TESTOSTERONE_TOTAL\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"panel\": {\n    \"id\": \"panel_uuid\",\n    \"type\": \"custom\",\n    \"shared\": true,\n    \"name\": \"TRT Panel (Male)\",\n    \"approval_status\": \"pending\",\n    \"orderable\": false\n  }\n}"}]},{"name":"DELETE /panels/{id}","request":{"method":"DELETE","header":[],"url":{"raw":"{{baseUrl}}/panels/:id","host":["{{baseUrl}}"],"path":["panels",":id"],"query":[]},"description":"Archives (soft-deletes) a custom panel: it disappears from GET /v1/panels, POST /v1/orders rejects it by name, and the lab test is deactivated with the lab network. Orders already placed with it are unaffected. Custom panels only — a provider key may archive its own panels; a partner key its shared panels or any clinic’s panel in scope. Live keys only. 404 for standard-catalog or out-of-scope panels, 409 if already archived. Required scope: panels:write."},"response":[{"name":"Example","originalRequest":{"method":"DELETE","header":[],"url":{"raw":"{{baseUrl}}/panels/:id","host":["{{baseUrl}}"],"path":["panels",":id"],"query":[]},"description":"Archives (soft-deletes) a custom panel: it disappears from GET /v1/panels, POST /v1/orders rejects it by name, and the lab test is deactivated with the lab network. Orders already placed with it are unaffected. Custom panels only — a provider key may archive its own panels; a partner key its shared panels or any clinic’s panel in scope. Live keys only. 404 for standard-catalog or out-of-scope panels, 409 if already archived. Required scope: panels:write."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"panel\": {\n    \"id\": \"panel_uuid\",\n    \"type\": \"custom\",\n    \"name\": \"TRT Panel (Male)\",\n    \"archived\": true,\n    \"archived_at\": \"2026-09-07T18:00:00Z\",\n    \"orderable\": false\n  }\n}"}]},{"name":"POST /panels/{id}/restore","request":{"method":"POST","header":[],"url":{"raw":"{{baseUrl}}/panels/:id/restore","host":["{{baseUrl}}"],"path":["panels",":id","restore"],"query":[]},"description":"Un-archives a custom panel (the inverse of DELETE /panels/{id}; same ownership rules, live keys only). The lab test is reactivated with the lab network and the panel re-checked: approval_status is \"approved\" (orderable now) only if it was approved before, is active at the lab, has a price, and the lab’s cost is unchanged; otherwise \"pending\" — a changed cost drops the old price and the panel is repriced automatically at approval — and panel.approved fires once it clears. A panel rejected before archiving stays rejected. 409 if not archived. Required scope: panels:write."},"response":[{"name":"Example","originalRequest":{"method":"POST","header":[],"url":{"raw":"{{baseUrl}}/panels/:id/restore","host":["{{baseUrl}}"],"path":["panels",":id","restore"],"query":[]},"description":"Un-archives a custom panel (the inverse of DELETE /panels/{id}; same ownership rules, live keys only). The lab test is reactivated with the lab network and the panel re-checked: approval_status is \"approved\" (orderable now) only if it was approved before, is active at the lab, has a price, and the lab’s cost is unchanged; otherwise \"pending\" — a changed cost drops the old price and the panel is repriced automatically at approval — and panel.approved fires once it clears. A panel rejected before archiving stays rejected. 409 if not archived. Required scope: panels:write."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"panel\": {\n    \"id\": \"panel_uuid\",\n    \"type\": \"custom\",\n    \"name\": \"TRT Panel (Male)\",\n    \"archived\": false,\n    \"approval_status\": \"approved\",\n    \"orderable\": true,\n    \"message\": \"Restored and ready to order.\"\n  }\n}"}]},{"name":"GET /markup","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/markup","host":["{{baseUrl}}"],"path":["markup"],"query":[]},"description":"Your default retail markup and any per-panel overrides. Partner keys only. Required scope: panels:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/markup","host":["{{baseUrl}}"],"path":["markup"],"query":[]},"description":"Your default retail markup and any per-panel overrides. Partner keys only. Required scope: panels:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"default_markup_percent\": 30,\n  \"overrides\": [\n    {\n      \"panel_id\": \"panel_uuid\",\n      \"markup_percent\": 45\n    }\n  ]\n}"}]},{"name":"PUT /markup","request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/markup","host":["{{baseUrl}}"],"path":["markup"],"query":[]},"description":"Set the default retail markup and/or per-panel overrides (markup_percent: null removes an override). Applies to future orders. Wholesale pricing is not writable. Required scope: pricing:write.","body":{"mode":"raw","raw":"{\n  \"default_markup_percent\": 30,\n  \"overrides\": [\n    {\n      \"panel_id\": \"panel_uuid\",\n      \"markup_percent\": 45\n    }\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/markup","host":["{{baseUrl}}"],"path":["markup"],"query":[]},"description":"Set the default retail markup and/or per-panel overrides (markup_percent: null removes an override). Applies to future orders. Wholesale pricing is not writable. Required scope: pricing:write.","body":{"mode":"raw","raw":"{\n  \"default_markup_percent\": 30,\n  \"overrides\": [\n    {\n      \"panel_id\": \"panel_uuid\",\n      \"markup_percent\": 45\n    }\n  ]\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"default_markup_percent\": 30,\n  \"overrides\": [\n    {\n      \"panel_id\": \"panel_uuid\",\n      \"markup_percent\": 45\n    }\n  ]\n}"}]}]},{"name":"Orders","item":[{"name":"POST /orders","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"","description":"Optional UUID. Safe-retries the request — the first call runs and its response is replayed for repeats with the same key.","disabled":true}],"url":{"raw":"{{baseUrl}}/orders","host":["{{baseUrl}}"],"path":["orders"],"query":[]},"description":"No card is charged — usage is billed monthly at wholesale. Every order includes a fixed $15.00 Lab Processing Fee on top of the panels’ wholesale price (amount_charged reflects it). Requires a consents object. One panel: panel_id (standard) or custom_panel_id. Several panels in ONE order (one requisition, one draw, one fee): panel_ids and/or custom_panel_ids arrays, up to 10 — they must be from the same lab and share a collection method, and every panel must be active; otherwise 400 with the offending panel named, before anything is billed. A test key places a sandbox order (no charge, no lab). Required scope: orders:write.","body":{"mode":"raw","raw":"{\n  \"provider_id\": \"prov_uuid\",\n  \"patient_id\": \"pat_uuid\",\n  \"custom_panel_ids\": [\n    \"panel_uuid\",\n    \"panel_uuid_2\"\n  ],\n  \"consents\": {\n    \"telehealth\": true,\n    \"hipaa_authorization\": true\n  }\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","value":"","description":"Optional UUID. Safe-retries the request — the first call runs and its response is replayed for repeats with the same key.","disabled":true}],"url":{"raw":"{{baseUrl}}/orders","host":["{{baseUrl}}"],"path":["orders"],"query":[]},"description":"No card is charged — usage is billed monthly at wholesale. Every order includes a fixed $15.00 Lab Processing Fee on top of the panels’ wholesale price (amount_charged reflects it). Requires a consents object. One panel: panel_id (standard) or custom_panel_id. Several panels in ONE order (one requisition, one draw, one fee): panel_ids and/or custom_panel_ids arrays, up to 10 — they must be from the same lab and share a collection method, and every panel must be active; otherwise 400 with the offending panel named, before anything is billed. A test key places a sandbox order (no charge, no lab). Required scope: orders:write.","body":{"mode":"raw","raw":"{\n  \"provider_id\": \"prov_uuid\",\n  \"patient_id\": \"pat_uuid\",\n  \"custom_panel_ids\": [\n    \"panel_uuid\",\n    \"panel_uuid_2\"\n  ],\n  \"consents\": {\n    \"telehealth\": true,\n    \"hipaa_authorization\": true\n  }\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"order\": {\n    \"id\": \"order_uuid\",\n    \"status\": \"processing\",\n    \"amount_charged\": \"93.00\",\n    \"collection_method\": \"walk_in_test\",\n    \"items\": [\n      {\n        \"id\": \"panel_uuid\",\n        \"type\": \"custom\",\n        \"name\": \"TRT Panel (Male)\"\n      },\n      {\n        \"id\": \"panel_uuid_2\",\n        \"type\": \"custom\",\n        \"name\": \"Thyroid Panel\"\n      }\n    ]\n  }\n}"}]},{"name":"GET /orders","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders?provider_id=&limit=&starting_after=","host":["{{baseUrl}}"],"path":["orders"],"query":[{"key":"provider_id","value":"","description":"Filter to one clinic.","disabled":true},{"key":"limit","value":"","description":"1–100 (default 50).","disabled":true},{"key":"starting_after","value":"","description":"Cursor: the next_cursor from the previous page.","disabled":true}]},"description":"Required scope: orders:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders?provider_id=&limit=&starting_after=","host":["{{baseUrl}}"],"path":["orders"],"query":[{"key":"provider_id","value":"","description":"Filter to one clinic.","disabled":true},{"key":"limit","value":"","description":"1–100 (default 50).","disabled":true},{"key":"starting_after","value":"","description":"Cursor: the next_cursor from the previous page.","disabled":true}]},"description":"Required scope: orders:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"data\": [\n    {\n      \"id\": \"order_uuid\",\n      \"status\": \"processing\"\n    }\n  ],\n  \"has_more\": false,\n  \"next_cursor\": null\n}"}]},{"name":"GET /orders/{id}","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id","host":["{{baseUrl}}"],"path":["orders",":id"],"query":[]},"description":"`panels` lists every panel on the order in order-set position; `panel` is the first of them (kept for existing integrations). `requisition_available` flips true once the lab has accepted the order (usually within minutes) — then download the form the patient takes to the draw site from /orders/{id}/requisition.pdf. Required scope: orders:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id","host":["{{baseUrl}}"],"path":["orders",":id"],"query":[]},"description":"`panels` lists every panel on the order in order-set position; `panel` is the first of them (kept for existing integrations). `requisition_available` flips true once the lab has accepted the order (usually within minutes) — then download the form the patient takes to the draw site from /orders/{id}/requisition.pdf. Required scope: orders:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"order\": {\n    \"id\": \"order_uuid\",\n    \"status\": \"processing\",\n    \"lab_status\": \"requisition_created\",\n    \"amount_charged\": \"54.00\",\n    \"result_available\": false,\n    \"requisition_available\": true,\n    \"patient\": {\n      \"id\": \"pat_uuid\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\"\n    },\n    \"panel\": {\n      \"id\": \"panel_uuid\",\n      \"type\": \"custom\",\n      \"name\": \"TRT Panel (Male)\"\n    },\n    \"panels\": [\n      {\n        \"id\": \"panel_uuid\",\n        \"type\": \"custom\",\n        \"name\": \"TRT Panel (Male)\"\n      }\n    ]\n  }\n}"}]},{"name":"GET /orders/{id}/results","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/results","host":["{{baseUrl}}"],"path":["orders",":id","results"],"query":[]},"description":"Structured results once available. 409 until the lab reports back (watch the order.results_ready webhook). Required scope: orders:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/results","host":["{{baseUrl}}"],"path":["orders",":id","results"],"query":[]},"description":"Structured results once available. 409 until the lab reports back (watch the order.results_ready webhook). Required scope: orders:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"order_id\": \"order_uuid\",\n  \"results\": {\n    \"results\": [\n      {\n        \"name\": \"Estradiol\",\n        \"value\": 46.29,\n        \"unit\": \"pg/mL\",\n        \"is_above_max_range\": false\n      }\n    ]\n  },\n  \"pdf_url\": \"https://…\"\n}"}]},{"name":"POST /orders/{id}/cancel","request":{"method":"POST","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/cancel","host":["{{baseUrl}}"],"path":["orders",":id","cancel"],"query":[]},"description":"Cancels a submitted/processing order. Live orders only within 1 hour of placement (after that, contact support); test orders any time. Usage/charges are reversed and order.cancelled fires. Required scope: orders:write."},"response":[{"name":"Example","originalRequest":{"method":"POST","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/cancel","host":["{{baseUrl}}"],"path":["orders",":id","cancel"],"query":[]},"description":"Cancels a submitted/processing order. Live orders only within 1 hour of placement (after that, contact support); test orders any time. Usage/charges are reversed and order.cancelled fires. Required scope: orders:write."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"order_id\": \"order_uuid\",\n  \"status\": \"cancelled\",\n  \"cleanup\": \"complete\"\n}"}]},{"name":"GET /orders/{id}/requisition.pdf","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/requisition.pdf","host":["{{baseUrl}}"],"path":["orders",":id","requisition.pdf"],"query":[]},"description":"The lab order form the patient takes to the draw site, as an application/pdf stream. Ready once requisition_available is true on the order (usually within minutes of placement); 409 before that. Give it to the patient — PanelRoute does not contact patients directly. Test orders return a canned sandbox PDF. Required scope: orders:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/requisition.pdf","host":["{{baseUrl}}"],"path":["orders",":id","requisition.pdf"],"query":[]},"description":"The lab order form the patient takes to the draw site, as an application/pdf stream. Ready once requisition_available is true on the order (usually within minutes of placement); 409 before that. Give it to the patient — PanelRoute does not contact patients directly. Test orders return a canned sandbox PDF. Required scope: orders:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"note\": \"binary application/pdf response\"\n}"}]},{"name":"GET /orders/{id}/results.pdf","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/results.pdf","host":["{{baseUrl}}"],"path":["orders",":id","results.pdf"],"query":[]},"description":"The signed lab report as an application/pdf stream. 409 until results are ready. Test orders return a canned sandbox PDF. Required scope: orders:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/results.pdf","host":["{{baseUrl}}"],"path":["orders",":id","results.pdf"],"query":[]},"description":"The signed lab report as an application/pdf stream. 409 until results are ready. Test orders return a canned sandbox PDF. Required scope: orders:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"note\": \"binary application/pdf response\"\n}"}]},{"name":"GET /orders/{id}/events","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/events","host":["{{baseUrl}}"],"path":["orders",":id","events"],"query":[]},"description":"Every status transition the order has been through, in sequence — the authoritative history to reconcile against instead of reconstructing state from webhooks. Required scope: orders:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/orders/:id/events","host":["{{baseUrl}}"],"path":["orders",":id","events"],"query":[]},"description":"Every status transition the order has been through, in sequence — the authoritative history to reconcile against instead of reconstructing state from webhooks. Required scope: orders:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"order_id\": \"order_uuid\",\n  \"current_status\": \"delivered\",\n  \"events\": [\n    {\n      \"from_status\": null,\n      \"to_status\": \"pending_payment\",\n      \"occurred_at\": \"2026-07-01T10:00:00Z\"\n    },\n    {\n      \"from_status\": \"pending_payment\",\n      \"to_status\": \"processing\",\n      \"occurred_at\": \"2026-07-01T10:00:04Z\"\n    }\n  ]\n}"}]},{"name":"POST /orders/{id}/simulate","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/orders/:id/simulate","host":["{{baseUrl}}"],"path":["orders",":id","simulate"],"query":[]},"description":"SANDBOX ONLY (test key). Advances a test order processing → collected → resulted → delivered, or rehearse the unhappy paths with to: \"failed\" / \"cancelled\". Omit \"to\" to advance one step. interpretation (\"normal\" | \"abnormal\", default abnormal) shapes the canned results. On \"delivered\", results attach and order.results_ready fires. Required scope: orders:write. Sandbox only — use your test key.","body":{"mode":"raw","raw":"{\n  \"to\": \"delivered\",\n  \"interpretation\": \"abnormal\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/orders/:id/simulate","host":["{{baseUrl}}"],"path":["orders",":id","simulate"],"query":[]},"description":"SANDBOX ONLY (test key). Advances a test order processing → collected → resulted → delivered, or rehearse the unhappy paths with to: \"failed\" / \"cancelled\". Omit \"to\" to advance one step. interpretation (\"normal\" | \"abnormal\", default abnormal) shapes the canned results. On \"delivered\", results attach and order.results_ready fires. Required scope: orders:write. Sandbox only — use your test key.","body":{"mode":"raw","raw":"{\n  \"to\": \"delivered\",\n  \"interpretation\": \"abnormal\"\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"order_id\": \"order_uuid\",\n  \"status\": \"delivered\",\n  \"result_available\": true\n}"}]}]},{"name":"Usage","item":[{"name":"GET /usage","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/usage?period=","host":["{{baseUrl}}"],"path":["usage"],"query":[{"key":"period","value":"","description":"YYYY-MM to scope to a billing period.","disabled":true}]},"description":"What you owe for the period. Partner keys only. A test key returns an empty ledger (sandbox orders never bill). Required scope: usage:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/usage?period=","host":["{{baseUrl}}"],"path":["usage"],"query":[{"key":"period","value":"","description":"YYYY-MM to scope to a billing period.","disabled":true}]},"description":"What you owe for the period. Partner keys only. A test key returns an empty ledger (sandbox orders never bill). Required scope: usage:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"period\": \"2026-07\",\n  \"total_wholesale\": \"324.00\",\n  \"order_count\": 6,\n  \"events\": [\n    {\n      \"order_id\": \"order_uuid\",\n      \"wholesale\": \"54.00\",\n      \"retail\": \"70.20\",\n      \"billing_period\": \"2026-07\"\n    }\n  ]\n}"}]},{"name":"GET /invoices","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/invoices?limit=&starting_after=","host":["{{baseUrl}}"],"path":["invoices"],"query":[{"key":"limit","value":"","description":"1–100 (default 50).","disabled":true},{"key":"starting_after","value":"","description":"Cursor: the next_cursor from the previous page.","disabled":true}]},"description":"Monthly wholesale invoices, newest first. invoice.finalized fires when a period closes. Partner keys only. Required scope: usage:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/invoices?limit=&starting_after=","host":["{{baseUrl}}"],"path":["invoices"],"query":[{"key":"limit","value":"","description":"1–100 (default 50).","disabled":true},{"key":"starting_after","value":"","description":"Cursor: the next_cursor from the previous page.","disabled":true}]},"description":"Monthly wholesale invoices, newest first. invoice.finalized fires when a period closes. Partner keys only. Required scope: usage:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"data\": [\n    {\n      \"id\": \"inv_uuid\",\n      \"billing_period\": \"2026-06\",\n      \"total_wholesale\": \"324.00\",\n      \"order_count\": 6,\n      \"status\": \"finalized\"\n    }\n  ],\n  \"has_more\": false,\n  \"next_cursor\": null\n}"}]},{"name":"GET /invoices/{id}","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/invoices/:id","host":["{{baseUrl}}"],"path":["invoices",":id"],"query":[]},"description":"One invoice with its line items (the usage rows it covers). Required scope: usage:read."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/invoices/:id","host":["{{baseUrl}}"],"path":["invoices",":id"],"query":[]},"description":"One invoice with its line items (the usage rows it covers). Required scope: usage:read."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"invoice\": {\n    \"id\": \"inv_uuid\",\n    \"billing_period\": \"2026-06\",\n    \"total_wholesale\": \"324.00\",\n    \"order_count\": 6,\n    \"status\": \"finalized\",\n    \"lines\": [\n      {\n        \"order_id\": \"order_uuid\",\n        \"wholesale\": \"54.00\",\n        \"occurred_at\": \"2026-06-12T15:00:00Z\",\n        \"reversed_after_close\": false\n      }\n    ]\n  }\n}"}]}]},{"name":"Webhooks","item":[{"name":"GET /webhooks/portal","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/webhooks/portal","host":["{{baseUrl}}"],"path":["webhooks","portal"],"query":[]},"description":"A short-lived link to the hosted portal where you add/verify webhook endpoints and inspect deliveries. Available to partner keys and provider keys alike — each key owner has its own isolated webhook application. Required scope: webhooks:manage."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/webhooks/portal","host":["{{baseUrl}}"],"path":["webhooks","portal"],"query":[]},"description":"A short-lived link to the hosted portal where you add/verify webhook endpoints and inspect deliveries. Available to partner keys and provider keys alike — each key owner has its own isolated webhook application. Required scope: webhooks:manage."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"portal_url\": \"https://app.svix.com/…\"\n}"}]},{"name":"GET /webhooks/endpoints","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/webhooks/endpoints","host":["{{baseUrl}}"],"path":["webhooks","endpoints"],"query":[]},"description":"Required scope: webhooks:manage."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/webhooks/endpoints","host":["{{baseUrl}}"],"path":["webhooks","endpoints"],"query":[]},"description":"Required scope: webhooks:manage."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"data\": [\n    {\n      \"id\": \"ep_2x…\",\n      \"url\": \"https://example.com/webhooks/panelroute\",\n      \"event_types\": null,\n      \"disabled\": false,\n      \"created_at\": \"2026-07-01T10:00:00Z\"\n    }\n  ]\n}"}]},{"name":"POST /webhooks/endpoints","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/webhooks/endpoints","host":["{{baseUrl}}"],"path":["webhooks","endpoints"],"query":[]},"description":"Registers an HTTPS endpoint. Omit event_types to subscribe to every event type your key can receive (the endpoint is stored with that full list, so event_types comes back populated; event types added to the catalog later are not added automatically). The URL is not contacted at registration — deliveries start when events fire. The signing secret is returned once here (also retrievable via /webhooks/endpoints/{id}/secret). Partner keys can subscribe to every event type; provider keys to their own order.* events and panel.approved. Required scope: webhooks:manage.","body":{"mode":"raw","raw":"{\n  \"url\": \"https://example.com/webhooks/panelroute\",\n  \"event_types\": [\n    \"order.results_ready\",\n    \"order.failed\"\n  ]\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Example","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/webhooks/endpoints","host":["{{baseUrl}}"],"path":["webhooks","endpoints"],"query":[]},"description":"Registers an HTTPS endpoint. Omit event_types to subscribe to every event type your key can receive (the endpoint is stored with that full list, so event_types comes back populated; event types added to the catalog later are not added automatically). The URL is not contacted at registration — deliveries start when events fire. The signing secret is returned once here (also retrievable via /webhooks/endpoints/{id}/secret). Partner keys can subscribe to every event type; provider keys to their own order.* events and panel.approved. Required scope: webhooks:manage.","body":{"mode":"raw","raw":"{\n  \"url\": \"https://example.com/webhooks/panelroute\",\n  \"event_types\": [\n    \"order.results_ready\",\n    \"order.failed\"\n  ]\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"endpoint\": {\n    \"id\": \"ep_2x…\",\n    \"url\": \"https://example.com/webhooks/panelroute\",\n    \"event_types\": [\n      \"order.results_ready\",\n      \"order.failed\"\n    ],\n    \"disabled\": false\n  },\n  \"secret\": \"whsec_…\"\n}"}]},{"name":"DELETE /webhooks/endpoints/{id}","request":{"method":"DELETE","header":[],"url":{"raw":"{{baseUrl}}/webhooks/endpoints/:id","host":["{{baseUrl}}"],"path":["webhooks","endpoints",":id"],"query":[]},"description":"Required scope: webhooks:manage."},"response":[{"name":"Example","originalRequest":{"method":"DELETE","header":[],"url":{"raw":"{{baseUrl}}/webhooks/endpoints/:id","host":["{{baseUrl}}"],"path":["webhooks","endpoints",":id"],"query":[]},"description":"Required scope: webhooks:manage."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"deleted\": true\n}"}]},{"name":"GET /webhooks/endpoints/{id}/secret","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/webhooks/endpoints/:id/secret","host":["{{baseUrl}}"],"path":["webhooks","endpoints",":id","secret"],"query":[]},"description":"Required scope: webhooks:manage."},"response":[{"name":"Example","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/webhooks/endpoints/:id/secret","host":["{{baseUrl}}"],"path":["webhooks","endpoints",":id","secret"],"query":[]},"description":"Required scope: webhooks:manage."},"status":"OK","code":200,"header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"secret\": \"whsec_…\"\n}"}]}]}]}