{"openapi":"3.1.0","info":{"title":"Licium Payer Follow-up API","version":"2.12.0","description":"Create payer enrollment follow-ups, read each application's status, and receive signed status webhooks. No API key: each follow-up's access token (returned once at creation) opens it. The full Licium API is at https://www.licium.ai/openapi.json."},"servers":[{"url":"https://www.licium.ai"}],"externalDocs":{"description":"Integration guide","url":"https://www.licium.ai/payer-follow-up/api"},"tags":[{"name":"Payer follow-ups","description":"Paid: pending payer enrollment applications checked with the payer until decided (every 30 minutes, day and night, for payers that post their status online; the others every week; check_every_days sets the others from every business day to weekly), with weekly roster monitoring and optional signed status webhooks; or, with the application bundle, applications written and submitted for you, then checked the same way. No key; the access token returned at intake opens it. Guide: https://www.licium.ai/payer-follow-up/api; these calls alone: https://www.licium.ai/payer-follow-up/api/openapi.json"},{"name":"Payments","description":"Funding, balances, held payments, payouts and royalties."}],"paths":{"/v1/payer-follow-ups":{"post":{"operationId":"payerFollowUpRequest","summary":"Weekly payer follow-up: we check every pending payer enrollment application with the payer until it is approved or denied (every 30 minutes, day and night, for payers that post their status online; the others every week, or as often as every business day with check_every_days), and tell you within one business day when a payer is missing a document; with the application bundle we first write and submit the application. Send an email, the plan and how you will give access (payer portal user, PECOS surrogate, delegation letter, CAQH admin invite, or call only). Group and per-application plans take the roster as NPIs and the pending applications (clinician NPI, payer, state, date submitted; payer reference number and notes optional). The application bundle takes applications_to_submit (clinician NPI, payer, state, and documents: caqh to use the clinician's CAQH profile, or send to send the license, malpractice certificate, W-9 and CV or work history; notes optional); where a payer requires the clinician's own signature, the clinician signs or attests. The reply has a Stripe checkout link and an access token, shown once, that opens the status later; nothing is checked until payment. A platform starting follow-ups for its own practices can keep every email from them with notify: platform_only (every email goes only to notify_email, its own address) or webhook_only (no email; status by the webhook). Group plan: $15 per clinician per month for the whole roster (weekly license, Medicare revalidation, exclusion list and NPI registry monitoring, only changes reported, plus a CAQH re-attestation and Medicare revalidation calendar), plus $149 per month for each clinician with a pending application, until all their applications are decided or six months. Per-application plan: $79 per application, checked until decided with no time limit; optional roster monitoring $3 per clinician per month. On the per-application plan and the application bundle, an application the payer never decides (no record on 3 checks in a row over at least 3 weeks, or 12 months without a decision) is stopped with an email and can be reopened at no charge within 30 days. Application bundle: $199 per application, paid up front, one checkout line per application, written, submitted and then checked until decided. Add webhook_url to get each status change as a signed POST (the reply carries webhook.secret once). Cancel subscriptions any time, from the next month. Not included: appeals, contract or rate negotiation. Up to 500 clinicians and 300 applications; up to 100 applications per bundle. Billing firms and software platforms get volume pricing, set up with us rather than at checkout. Book 20 minutes at https://calendly.com/licium/20-minutes or write to hello@licium.ai. Add partner_code if Licium gave you one.","description":"No key needed. The response carries access_token, shown once: send it (header X-Payer-Follow-Up-Token, or Authorization: Bearer) to read the follow-up, reopen payment and reopen an application stopped with no decision; an email address alone never opens it. Send email, plan, access, and the roster (npis, roster_text, roster_from_provider_check, or a multipart roster_file CSV/XLSX with NPIs in any column) and, for pending applications, applications, applications_text (CSV or tab-separated lines: NPI, payer, state, date submitted, payer reference, notes; a header row may name the columns) or a multipart applications_file. Every application's clinician joins the roster. With plan application_bundle, send applications_to_submit or applications_to_submit_text (CSV or tab-separated lines: NPI, payer, state, documents caqh or send, notes) instead of a roster and pending applications; their clinicians are the roster, there is no monitoring, and checkout has one line per application at $199 (the list price; a partner_code from Licium charges the agreed price instead). Any entry that cannot be used is listed in invalid_entries with its reason and nothing is saved. The response has the price and checkout_url (Stripe); nothing is checked, written or submitted until the payment settles. Up to 500 clinicians and 300 applications, or 100 applications per bundle; files at most 4 MB and requests 4.4 MB. Send an Idempotency-Key header to make a retry safe: within 24 hours, the same key with the same email and body returns the first reply again (replayed true, header Idempotent-Replayed: true, access_token and webhook.secret null because they are shown only once) instead of a second follow-up; the same key with a different body gets 409. Without the header, a retry after a timeout makes a second follow-up awaiting payment (nothing is charged or checked until its checkout is paid), so pay only the one whose account_id you stored. How often: Applications at payers that post their status online are read every 30 minutes, day and night, so a change the payer posts is caught within about half an hour; the others are checked every week, or as often as every business day with check_every_days (1 to 7 days, for the whole request or per application). When checks stop: An application that is never decided is not checked forever: on the per-application plan and the application bundle it is closed as no_decision, and you get an email, when the payer says it has no record of the application on 3 checks in a row spanning at least 3 weeks, or 12 months after the later of the day it was submitted and the day it was paid for, without a decision. Reopen it at no charge within 30 days: reply to that email, or POST /v1/payer-follow-ups/{id}/applications/{application_id}/reopen with the access token. A reopened application is checked again right away, and the 12 months and the no-record checks count again from the reopen.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Optional, 1 to 128 printable ASCII characters with no spaces (a UUID works). One key per follow-up: the same key, email and body within 24 hours return the first reply again; a different body gets 409.","schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[!-~]{1,128}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["email","plan","access"],"properties":{"email":{"type":"string","format":"email","maxLength":254,"description":"The follow-up's email: the practice (or whoever owns the follow-up). It can sign in on licium.ai to see the status page. With notify platform_only or webhook_only we never email it."},"company":{"type":"string","maxLength":300,"description":"The practice's name; platform_only emails are marked with it."},"plan":{"type":"string","enum":["group","per_application","application_bundle"],"description":"group: monthly, $15 per roster clinician plus $149 per clinician with a pending application. per_application: $79 per application, one time, checked until decided with no time limit. application_bundle: $199 per application, one time; written, submitted and then checked until decided."},"npis":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"string","maxLength":40},"description":"The roster: 10-digit NPIs (every application's clinician is added)."},"roster_text":{"type":"string","maxLength":200000},"roster_from_provider_check":{"type":"string","format":"uuid","description":"A provider check sent from the same email; its NPIs join the roster."},"applications":{"type":"array","minItems":1,"maxItems":600,"items":{"type":"object","additionalProperties":false,"required":["npi","payer","state","submitted_on"],"properties":{"npi":{"type":"string","description":"The clinician's 10-digit NPI."},"payer":{"type":"string","maxLength":200,"description":"The payer's name as you know it (Aetna, Medicare, Texas Medicaid)."},"state":{"type":"string","description":"Two-letter code."},"submitted_on":{"type":"string","description":"The day it was submitted: 2026-09-14 or 9/14/2026. Within the last year."},"payer_reference":{"type":"string","maxLength":100,"description":"The payer's application or reference number, if you have it."},"notes":{"type":"string","maxLength":500},"check_every_days":{"type":"integer","minimum":1,"maximum":7,"description":"This application's own check_every_days (wins over the request's)."}}},"description":"Pending applications, one clinician with one payer each, up to 300."},"applications_text":{"type":"string","maxLength":200000},"applications_to_submit":{"type":"array","minItems":1,"maxItems":200,"description":"application_bundle only; up to 100.","items":{"type":"object","additionalProperties":false,"required":["npi","payer","state","documents"],"properties":{"npi":{"type":"string"},"payer":{"type":"string","maxLength":200},"state":{"type":"string","description":"Two-letter code."},"documents":{"type":"string","enum":["caqh","send"],"description":"caqh: use the clinician's CAQH profile. send: you send the license, malpractice certificate, W-9 and CV or work history after payment."},"notes":{"type":"string","maxLength":500},"check_every_days":{"type":"integer","minimum":1,"maximum":7,"description":"This application's own check_every_days (wins over the request's)."}}}},"applications_to_submit_text":{"type":"string","maxLength":100000,"description":"application_bundle only: NPI, payer, state, documents (caqh or send), notes; one per line."},"caqh_attestations":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"object","additionalProperties":false,"required":["npi","attested_on"],"properties":{"npi":{"type":"string"},"attested_on":{"type":"string"}}},"description":"CAQH last attestation dates for the calendar; re-attestation is due 120 days later."},"caqh_text":{"type":"string","maxLength":50000},"access":{"type":"array","minItems":1,"maxItems":5,"items":{"type":"string","enum":["portal_user","pecos_surrogate","delegation_letter","caqh_admin","call_only"]},"description":"How we may reach the payer for you: payer portal user, PECOS surrogate, delegation letter, CAQH admin invite, or call_only (by itself)."},"monitoring":{"type":"boolean","description":"Per-application plan: add roster monitoring at $3 per clinician per month."},"source":{"type":"string","enum":["web","api","mcp","webmcp"]},"ref_code":{"type":"string","maxLength":100,"pattern":"^[a-zA-Z0-9_-]*$"},"partner_code":{"type":"string","maxLength":100,"description":"Optional. A partner code Licium gave you: your agreed price is charged instead of the list price. A code that is not active is refused and nothing is saved."},"webhook_url":{"type":"string","format":"uri","maxLength":300,"description":"Optional. An HTTPS address on a public host (port 443 or 8443; no private, loopback, link-local or local addresses; at most 300 characters) that gets a signed POST each time an application's status changes. The reply carries webhook.secret, shown once."},"check_every_days":{"type":"integer","minimum":1,"maximum":7,"default":7,"description":"Optional, 1 to 7 (default 7, weekly): days between the checks of an application that are not reads of the payer's public status page (calls, emails, portal checks), always on a business day; 1 is every business day. For every application of the request, or set in an application entry for that one. The price does not change. Status pages are read every 30 minutes, day and night."},"notify":{"type":"string","enum":["practice","platform_only","webhook_only"],"default":"practice","description":"Optional. Who gets this follow-up's emails: practice (default) sends them to email; platform_only sends every email (payment confirmation, missing documents, document requests and reminders, roster changes, the Monday status email, stopped applications) only to notify_email, your platform's address, marked with the practice it is about, and never to email; webhook_only sends no email at all (webhook_url is required) and status reaches you by the webhook and GET /v1/payer-follow-ups/{id}."},"notify_email":{"type":"string","format":"email","maxLength":254,"description":"Required with notify platform_only, and only then: the address every email of this follow-up goes to instead of email."}}},"example":{"email":"owner@brighttherapy.com","company":"Bright Therapy Group","plan":"per_application","access":["call_only"],"applications":[{"npi":"1234567893","payer":"Aetna","state":"TX","submitted_on":"2026-09-14","payer_reference":"APP-55102"},{"npi":"1234567893","payer":"Cigna","state":"TX","submitted_on":"2026-09-10","check_every_days":1}],"check_every_days":2,"notify":"platform_only","notify_email":"credentialing@yourplatform.com","webhook_url":"https://hooks.yourplatform.com/licium"}},"multipart/form-data":{"schema":{"type":"object","required":["email","plan","access"],"properties":{"email":{"type":"string","format":"email"},"plan":{"type":"string","enum":["group","per_application","application_bundle"]},"access":{"type":"string","description":"Repeat the field, or separate values with commas."},"roster_file":{"type":"string","format":"binary","description":"CSV or XLSX; NPIs in any column."},"applications_file":{"type":"string","format":"binary","description":"CSV or XLSX; columns NPI, payer, state, date submitted, payer reference, notes, or a header row naming them."},"roster_text":{"type":"string"},"applications_text":{"type":"string"},"applications_to_submit_text":{"type":"string"},"caqh_text":{"type":"string"},"company":{"type":"string"},"monitoring":{"type":"string","enum":["true","false"]},"roster_from_provider_check":{"type":"string","format":"uuid"},"check_every_days":{"type":"string","pattern":"^[1-7]$","description":"Optional, 1 to 7 (default 7, weekly): days between the checks of an application that are not reads of the payer's public status page (calls, emails, portal checks), always on a business day; 1 is every business day. For every application of the request, or set in an application entry for that one. The price does not change. Status pages are read every 30 minutes, day and night."},"notify":{"type":"string","enum":["practice","platform_only","webhook_only"],"description":"Optional. Who gets this follow-up's emails: practice (default) sends them to email; platform_only sends every email (payment confirmation, missing documents, document requests and reminders, roster changes, the Monday status email, stopped applications) only to notify_email, your platform's address, marked with the practice it is about, and never to email; webhook_only sends no email at all (webhook_url is required) and status reaches you by the webhook and GET /v1/payer-follow-ups/{id}."},"notify_email":{"type":"string","format":"email","description":"Required with notify platform_only, and only then: the address every email of this follow-up goes to instead of email."},"webhook_url":{"type":"string","format":"uri","maxLength":300,"description":"Optional. An HTTPS address on a public host (port 443 or 8443; no private, loopback, link-local or local addresses; at most 300 characters) that gets a signed POST each time an application's status changes. The reply carries webhook.secret, shown once."},"partner_code":{"type":"string","maxLength":100,"description":"Optional. A partner code Licium gave you: your agreed price is charged instead of the list price. A code that is not active is refused and nothing is saved."}}}}}},"responses":{"200":{"description":"Saved, awaiting payment. Pay at checkout_url. With an Idempotency-Key already used for the same request: that first reply again (replayed true, access_token and webhook.secret null).","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"$ref":"#/components/schemas/PayerFollowUpReceipt"}}},"example":{"success":true,"data":{"account_id":"8f2d4c1a-6b3e-4f7a-9c21-5d0e8b7a3f10","access_token":"Qm9yZWQ_eW91IGRlY29kZWQgdGhpcyBleGFtcGxlIQ0","status_url":"/payer-follow-up/8f2d4c1a-6b3e-4f7a-9c21-5d0e8b7a3f10","checkout_url":"https://checkout.stripe.com/c/pay/cs_live_example","plan":"per_application","monitoring":false,"roster_count":1,"pending_clinician_count":1,"application_count":2,"price":{"plan":"per_application","monitoring":false,"lines":[{"key":"application","label":"One payer application, checked until decided","unit_cents":7900,"quantity":2,"amount_cents":15800,"recurring":false}],"first_payment_cents":15800,"monthly_cents":0,"one_time_cents":15800,"checkout_mode":"payment"},"payment_status":"awaiting_payment","next":"Pay at checkout_url. Keep access_token: it is shown only once, and it opens GET /v1/payer-follow-ups/{account_id} (header X-Payer-Follow-Up-Token), reopens payment and reopens an application stopped with no decision; the emails carry their own links. Nothing is checked, written or submitted until the payment settles; the work starts then.","notify":"platform_only","webhook":{"url":"https://hooks.yourplatform.com/licium","secret":"lws_0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f"}}}}},"headers":{"Idempotent-Replayed":{"description":"true when this repeats the reply to an earlier request with the same Idempotency-Key.","schema":{"const":"true"}}}},"400":{"description":"Input that cannot be used, named field by field; invalid_entries lists each entry with its reason. Nothing is saved. A webhook_url that is not HTTPS on a public host is refused here too.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"One entry could not be used. Each one is listed with its reason; fix them and send again.","invalid_entries":[{"entry":"Application 2: 1234567890, Cigna","reason":"NPI: The last digit does not match the NPI check digit. Check for a typo."}]}}}},"409":{"description":"The Idempotency-Key was already used in the last 24 hours with a different body (send a new key for a new follow-up), or its first request is still being handled (Retry-After says when to try again), or a retry with the same key took this request over. Nothing is saved by this request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"This Idempotency-Key was already used with a different request in the last 24 hours. Send a new key for a new follow-up."}}},"headers":{"Retry-After":{"description":"Only while the first request with this key is still being handled: seconds to wait.","schema":{"type":"integer","minimum":1}}}},"413":{"description":"More than 500 clinicians or 300 applications (100 per bundle), or a file or request over the size limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send a readable request body of at most 4.4 MB."}}}},"429":{"description":"More than 60 requests in an hour from one address. Retry-After says how many seconds to wait.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Too many requests: at most 60 an hour from one address. Try again in 37 minutes."}}}},"502":{"description":"Saved, but the payment page did not open: data has account_id, access_token, status_url and webhook (shown only here; null in a repeated reply with the same Idempotency-Key). Open the payment page with POST /v1/payer-follow-ups/{id}/checkout.","content":{"application/json":{"schema":{"type":"object","required":["success","error","data"],"properties":{"success":{"const":false},"error":{"type":"string"},"data":{"type":"object","required":["account_id","access_token","status_url"],"properties":{"account_id":{"type":"string","format":"uuid"},"access_token":{"type":["string","null"],"pattern":"^[A-Za-z0-9_-]{43}$"},"status_url":{"type":"string"},"webhook":{"type":"object","properties":{"url":{"type":"string"},"secret":{"type":["string","null"]}}},"replayed":{"const":true},"note":{"type":"string"}}}}}}}},"503":{"description":"Payment is not available right now (nothing saved), or a temporary failure. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Could not save the request. Try again in a minute."}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/{id}":{"get":{"operationId":"payerFollowUpStatus","summary":"Read a weekly payer follow-up with the account ID and the access token returned when it was started: whether payment is settled, each application's status (not_checked, received, in_review, needs_documents, approved with its effective date, denied, no_record, or no_decision when the checks stopped without a decision, with the date it can be reopened until), whether we write and submit it (work: write_and_submit, with submitted_on empty until it is submitted) or it was already submitted (work: follow_up), what we still need from you before we submit one we write (waiting_on_you), the payer's reference or representative, missing documents, the last and next check, check_every_days, and the log of every check (date, method, who checked, what the payer said, and how many reads found the same answer); for one we write, where its submission stands (submission: step, channel email, fax, mail or web, and clinician_to_do when the clinician must sign or submit in the payer's own system); the roster's changes from weekly monitoring; the deadlines within 30 and 90 days; for an application bundle, the steps only a clinician can do for the applications we write (clinician_tasks: each step, its status upcoming, to_do, said_done or done, its deadline, the applications it is for, and contact_needed when we cannot reach the clinician); and the status webhook (webhook: its url and updated_at, or null; never its secret).","description":"The access token (X-Payer-Follow-Up-Token, Authorization: Bearer, or ?token= as in emailed links) or a session signed in with the follow-up's email; an email address alone is not accepted. Free, and it never starts a check: reading more often than the checks run returns the same answer. Each application's coverage: covered (checked until decided: every 30 minutes, day and night for payers that post their status online, the others every check_every_days days; next_check_at says when), decided, stopped (status no_decision; stopped has why and reopen_path), paused, ended (group plan, six months on the pending line), not_started (awaiting payment). checks lists each answer once: a status page read that finds what the latest check already says moves last_checked_at and next_check_at without a new entry. An application that is never decided is not checked forever: on the per-application plan and the application bundle it is closed as no_decision, and you get an email, when the payer says it has no record of the application on 3 checks in a row spanning at least 3 weeks, or 12 months after the later of the day it was submitted and the day it was paid for, without a decision. Reopen it at no charge within 30 days: reply to that email, or POST /v1/payer-follow-ups/{id}/applications/{application_id}/reopen with the access token. A reopened application is checked again right away, and the 12 months and the no-record checks count again from the reopen. calendar lists deadlines within 30 days (and past ones) and in 31 to 90 days: Medicare revalidation, group revalidation, license expiry, CAQH re-attestation. To hear of each status change instead of reading this, register a webhook: PUT /v1/payer-follow-ups/{id}/webhook.","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"account_id from POST /v1/payer-follow-ups.","schema":{"type":"string","format":"uuid"}},{"name":"token","in":"query","description":"The access token, for links (prefer the header).","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}}],"responses":{"200":{"description":"The follow-up.","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"$ref":"#/components/schemas/PayerFollowUpStatus"}}},"example":{"success":true,"data":{"account_id":"8f2d4c1a-6b3e-4f7a-9c21-5d0e8b7a3f10","created_at":"2026-10-21T13:00:12.000Z","company":"Bright Therapy Group","plan":"per_application","monitoring":false,"access":["call_only"],"standing":"active","payment":{"status":"paid","paid_at":"2026-10-21T13:02:44.000Z","first_amount_cents":15800,"monthly_amount_cents":0,"subscription_status":null,"current_period_end":null,"cancel_at_period_end":false,"manage_url":null,"billing_status":"ok"},"price":{"plan":"per_application","monitoring":false,"lines":[{"key":"application","label":"One payer application, checked until decided","unit_cents":7900,"quantity":2,"amount_cents":15800,"recurring":false}],"first_payment_cents":15800,"monthly_cents":0,"one_time_cents":15800,"checkout_mode":"payment"},"summary":{"not_checked":0,"received":0,"in_review":1,"needs_documents":0,"approved":1,"denied":0,"no_record":0,"no_decision":0},"applications":[{"id":"3c9a7e52-1f4b-4d8e-a6c0-2b7f9d1e4a83","npi":"1234567893","clinician_name":"ADA LOVELACE","payer":"Aetna","state":"TX","submitted_on":"2026-09-14","work":"follow_up","documents_from":null,"payer_reference":"APP-55102","notes":null,"status":"approved","effective_date":"2026-11-01","reference_or_rep":"Ref 55102, rep Dana","missing_documents":null,"last_checked_at":"2026-10-21T14:31:07.000Z","next_check_at":null,"check_every_days":2,"closed_at":"2026-10-21T14:31:07.000Z","coverage":"decided","stopped":null,"checks":[{"checked_at":"2026-10-21T14:31:07.000Z","reads":1,"last_read_at":null,"method":"phone","checked_by":"Licium","status":"approved","payer_said":"Approved, effective November 1, 2026.","reference_or_rep":"Ref 55102, rep Dana","missing_documents":null,"effective_date":"2026-11-01","source_note":null}],"waiting_on_you":[],"submission":null}],"roster":[{"npi":"1234567893","name":"ADA LOVELACE","caqh_attested_on":null,"pending_line":false,"pending_left_reason":null}],"monitoring_state":{"active":false,"last_run_at":null,"next_run_at":null},"calendar":{"within_30_days":[],"within_90_days":[]},"roster_changes":[],"documents":null,"firm":null,"sample":false,"notify":"platform_only","notify_email":"credentialing@yourplatform.com","webhook":{"url":"https://hooks.yourplatform.com/licium","updated_at":"2026-10-21T13:00:12.000Z"},"clinician_tasks":[],"next":"Each open application is checked until it is decided: every 30 minutes, day and night, for payers that post their status online; the others every 2 days. A missing document is emailed to credentialing@yourplatform.com within one business day.","authorized_by":"token"}}}}},"401":{"description":"No access token was sent (and no signed-in session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send the follow-up's access token, or sign in with the follow-up's email."}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Follow-up not found, or this token does not open it."}}}},"429":{"description":"More than 1200 requests in an hour from one address. Retry-After says how many seconds to wait.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Too many requests: at most 1200 an hour from one address. Try again in 37 minutes."}}}},"503":{"description":"Could not read the follow-up. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Could not read the follow-up. Try again in a minute."}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/{id}/webhook":{"get":{"operationId":"payerFollowUpWebhookRead","summary":"Read the follow-up's status webhook: its address and the latest 20 events with every try.","description":"Set the follow-up's webhook address with the account ID and its access token (header X-Payer-Follow-Up-Token, Authorization: Bearer, or body {token}) or a session signed in with the follow-up's email. Body {url}: HTTPS on a public host (port 443 or 8443), at most 300 characters. Returns url and a new secret, shown once; the previous secret stops signing at once. GET returns the address and the latest 20 events with every try (time, HTTP status, error). DELETE removes the address and cancels events still waiting (refused with 409 for a follow-up with notify webhook_only).","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"account_id from POST /v1/payer-follow-ups.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The address (null when none) and the latest events, newest first. The secret is never shown again.","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","properties":{"url":{"type":["string","null"]},"updated_at":{"type":["string","null"],"format":"date-time"},"events":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["application.status_changed","webhook.test"]},"application_id":{"type":["string","null"],"format":"uuid"},"created_at":{"type":"string","format":"date-time"},"status":{"enum":["pending","delivered","failed","cancelled"]},"next_attempt_at":{"type":["string","null"],"format":"date-time","description":"pending: when the next try is due."},"delivered_at":{"type":["string","null"],"format":"date-time"},"attempts":{"type":"array","items":{"type":"object","properties":{"attempt":{"type":"integer"},"attempted_at":{"type":"string","format":"date-time"},"status_code":{"type":["integer","null"]},"ok":{"type":"boolean"},"error":{"type":["string","null"]},"duration_ms":{"type":"integer"}}}}}}}}}}}}}},"401":{"description":"No access token was sent (and no signed-in session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send the follow-up's access token, or sign in with the follow-up's email."}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Follow-up not found, or this token does not open it."}}}},"429":{"description":"More than 300 requests in an hour from one address. Retry-After says how many seconds to wait.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Too many requests: at most 300 an hour from one address. Try again in 37 minutes."}}}},"503":{"description":"Could not read the webhook. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Could not read the webhook. Try again in a minute."}}}}},"tags":["Payer follow-ups","Payments"]},"put":{"operationId":"payerFollowUpWebhookSet","summary":"Set the follow-up's status webhook address; returns a new signing secret, shown once.","description":"Set the follow-up's webhook address with the account ID and its access token (header X-Payer-Follow-Up-Token, Authorization: Bearer, or body {token}) or a session signed in with the follow-up's email. Body {url}: HTTPS on a public host (port 443 or 8443), at most 300 characters. Returns url and a new secret, shown once; the previous secret stops signing at once. GET returns the address and the latest 20 events with every try (time, HTTP status, error). DELETE removes the address and cancels events still waiting (refused with 409 for a follow-up with notify webhook_only). Status webhooks: each time an application's status changes (received, in_review, needs_documents, approved with its effective date, denied, no_record, or no_decision when the checks stop without a decision, and back when it is reopened), Licium POSTs one application.status_changed event as JSON to the follow-up's webhook address. Headers: Licium-Signature (t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" keyed with the secret>), Licium-Event-Id and Licium-Event-Type. Answer with any 2xx within 5 seconds. Otherwise the event is sent again after 1 minute, 10 minutes, 1 hour and 6 hours (five tries in all); redirects are not followed. The same event id can arrive more than once, so treat it as idempotent. Events go to the address set when they are sent; a removed address cancels the waiting ones.","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"account_id from POST /v1/payer-follow-ups.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["url"],"properties":{"url":{"type":"string","format":"uri","maxLength":300,"description":"Optional. An HTTPS address on a public host (port 443 or 8443; no private, loopback, link-local or local addresses; at most 300 characters) that gets a signed POST each time an application's status changes. The reply carries webhook.secret, shown once."},"token":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$","description":"The access token, when it cannot go in a header."}}},"example":{"url":"https://hooks.yourplatform.com/licium"}}}},"responses":{"200":{"description":"Saved. Keep secret: it is shown only now, and the previous one stopped signing.","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","required":["url","secret","updated_at"],"properties":{"url":{"type":"string"},"secret":{"type":"string","pattern":"^lws_[0-9a-f]{64}$"},"updated_at":{"type":"string","format":"date-time"},"next":{"type":"string"}}}}}}}},"400":{"description":"Not an HTTPS address on a public host (port 443 or 8443), or no url.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"The webhook URL must be a public HTTPS address: no private, loopback, link-local or local hosts."}}}},"401":{"description":"No access token was sent (and no signed-in session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send the follow-up's access token, or sign in with the follow-up's email."}}}},"403":{"description":"Sent from a browser on another site (its Origin header is not licium.ai). Calls from a server send no Origin header and are not affected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"This change could not be saved from this address. Reload the page and try again."}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Follow-up not found, or this token does not open it."}}}},"429":{"description":"More than 30 requests in an hour from one address. Retry-After says how many seconds to wait.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Too many requests: at most 30 an hour from one address. Try again in 37 minutes."}}}},"503":{"description":"Could not save the webhook. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Could not save the webhook. Try again in a minute."}}}}},"tags":["Payer follow-ups","Payments"]},"delete":{"operationId":"payerFollowUpWebhookRemove","summary":"Remove the follow-up's status webhook address; events still waiting are cancelled.","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"account_id from POST /v1/payer-follow-ups.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"removed: false when there was no address.","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","required":["removed"],"properties":{"removed":{"type":"boolean"}}}}}}}},"401":{"description":"No access token was sent (and no signed-in session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send the follow-up's access token, or sign in with the follow-up's email."}}}},"403":{"description":"Sent from a browser on another site (its Origin header is not licium.ai). Calls from a server send no Origin header and are not affected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"This change could not be saved from this address. Reload the page and try again."}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Follow-up not found, or this token does not open it."}}}},"409":{"description":"The follow-up has notify webhook_only: its status reaches you only by the webhook, so set a new address with PUT instead of removing it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"This follow-up sends no email (notify webhook_only), so its status reaches you only by the webhook. Set a new address with PUT instead of removing it."}}}},"429":{"description":"More than 30 requests in an hour from one address. Retry-After says how many seconds to wait.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Too many requests: at most 30 an hour from one address. Try again in 37 minutes."}}}},"503":{"description":"Could not remove the webhook. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Could not remove the webhook. Try again in a minute."}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/{id}/webhook/test":{"post":{"operationId":"payerFollowUpWebhookTest","summary":"Send one signed webhook.test event to the follow-up's webhook address now.","description":"Send one webhook.test event to the follow-up's webhook address now, signed like every event, with the account ID and its access token. One try, no retries; returns whether a 2xx came back, the HTTP status, the error and how long it took.","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"account_id from POST /v1/payer-follow-ups.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"token":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$","description":"The access token, when it cannot go in a header."}}}}}},"responses":{"200":{"description":"How the one try went (it is also listed by GET .../webhook).","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","required":["event_id","delivered"],"properties":{"event_id":{"type":"string","format":"uuid"},"delivered":{"type":"boolean","description":"A 2xx came back within 5 seconds."},"status_code":{"type":["integer","null"]},"error":{"type":["string","null"]},"duration_ms":{"type":["integer","null"]}}}}},"example":{"success":true,"data":{"event_id":"5e1f0c2a-9d4b-4a7e-8c31-2f6b0d9e4a12","delivered":true,"status_code":200,"error":null,"duration_ms":184}}}}},"401":{"description":"No access token was sent (and no signed-in session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send the follow-up's access token, or sign in with the follow-up's email."}}}},"403":{"description":"Sent from a browser on another site (its Origin header is not licium.ai). Calls from a server send no Origin header and are not affected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"This change could not be saved from this address. Reload the page and try again."}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Follow-up not found, or this token does not open it."}}}},"409":{"description":"No webhook address set yet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Set a webhook URL first: PUT /v1/payer-follow-ups/{id}/webhook with {url}."}}}},"429":{"description":"More than 20 requests in an hour from one address. Retry-After says how many seconds to wait.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Too many requests: at most 20 an hour from one address. Try again in 37 minutes."}}}},"503":{"description":"Could not send the test event. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Could not send the test event. Try again in a minute."}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/{id}/checkout":{"post":{"operationId":"payerFollowUpCheckout","summary":"Open the payment page for a follow-up that is not paid yet.","description":"With the access token (header, Bearer, or body {token}) or a session signed in with the follow-up's email. An open payment page is returned again; an expired one, or one whose delayed payment failed, is replaced.","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"account_id from POST /v1/payer-follow-ups.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"token":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$","description":"The access token, when it cannot go in a header."}}}}}},"responses":{"200":{"description":"checkout_url and whether an open page was reused.","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","required":["checkout_url","reused"],"properties":{"checkout_url":{"type":"string"},"reused":{"type":"boolean"}}}}}}}},"400":{"description":"The body is not {token}.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send {token} with the follow-up's access token, or sign in."}}}},"401":{"description":"No access token was sent (and no signed-in session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send the follow-up's access token, or sign in with the follow-up's email."}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Follow-up not found, or this token does not open it."}}}},"409":{"description":"Already paid, a payment is still settling, or the payment needs a person.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"This follow-up is already paid."}}}},"429":{"description":"More than 30 requests in an hour from one address. Retry-After says how many seconds to wait.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Too many requests: at most 30 an hour from one address. Try again in 37 minutes."}}}},"503":{"description":"Payment is not available right now. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"The payment page did not open. Try again in a minute."}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/{id}/applications/{applicationId}/reopen":{"post":{"operationId":"payerFollowUpReopen","summary":"Reopen an application stopped with no decision, at no charge, within 30 days of the stop.","description":"An application that is never decided is not checked forever: on the per-application plan and the application bundle it is closed as no_decision, and you get an email, when the payer says it has no record of the application on 3 checks in a row spanning at least 3 weeks, or 12 months after the later of the day it was submitted and the day it was paid for, without a decision. Reopen it at no charge within 30 days: reply to that email, or POST /v1/payer-follow-ups/{id}/applications/{application_id}/reopen with the access token. A reopened application is checked again right away, and the 12 months and the no-record checks count again from the reopen. The access token (header X-Payer-Follow-Up-Token, Authorization: Bearer, or body {token}) or a session signed in with the follow-up's email. The application goes back to the status it had (not_checked when it was never checked) and is checked again right away; a status webhook event says so (previous_status no_decision).","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"account_id from POST /v1/payer-follow-ups.","schema":{"type":"string","format":"uuid"}},{"name":"applicationId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"applications[].id in GET /v1/payer-follow-ups/{id} (its stopped.reopen_path)."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"token":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$","description":"The access token, when it cannot go in a header."}}}}}},"responses":{"200":{"description":"Reopened.","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"object","required":["application_id","status","next_check_at","reopened_at"],"properties":{"application_id":{"type":"string","format":"uuid"},"status":{"enum":["not_checked","received","in_review","needs_documents","approved","denied","no_record","no_decision"]},"next_check_at":{"type":"string","format":"date-time"},"reopened_at":{"type":"string","format":"date-time"}}}}},"example":{"success":true,"data":{"application_id":"3c9a7e52-1f4b-4d8e-a6c0-2b7f9d1e4a83","status":"no_record","next_check_at":"2026-11-12T15:20:03.000Z","reopened_at":"2026-11-12T15:20:03.000Z"}}}}},"401":{"description":"No access token was sent (and no signed-in session).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Send the follow-up's access token, or sign in with the follow-up's email."}}}},"403":{"description":"Sent from a browser on another site (its Origin header is not licium.ai). Calls from a server send no Origin header and are not affected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"This change could not be saved from this address. Reload the page and try again."}}}},"404":{"description":"Follow-up or application not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Application not found in this follow-up."}}}},"409":{"description":"Not stopped with no decision, or the 30 days to reopen it have passed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"This application is not stopped. Only an application stopped with no decision can be reopened."}}}},"429":{"description":"More than 60 requests in an hour from one address. Retry-After says how many seconds to wait.","headers":{"Retry-After":{"description":"Seconds until the limit resets.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"Too many requests: at most 60 an hour from one address. Try again in 37 minutes."}}}},"503":{"description":"The application could not be reopened right now. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"},"example":{"success":false,"error":"The application could not be reopened right now. Try again in a minute."}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/{id}/documents":{"get":{"operationId":"payerFollowUpDocuments","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"summary":"Application bundle: read the documents we need to write and submit the applications, with the account ID and the access token. For each clinician whose documents you send: the state license, malpractice certificate, W-9 and CV with work history, a DEA registration for prescribers, and board certification if certified; for each clinician whose documents come from CAQH, or whose payer works from the CAQH profile: the CAQH ID and access for Licium; and once for the group, the IRS letter with its Tax ID. Each document has its status (needed, received, accepted, or needs_resend with the reason) and the type and size of what was sent. The list opens when payment settles.","description":"Same access as the status read: the access token (header X-Payer-Follow-Up-Token, Authorization: Bearer, or ?token= as in emailed links) or a session signed in with the follow-up's email. Only a paid application bundle has documents; any other follow-up returns an empty list and next says why. Each document: kind (state_license, malpractice, w9, cv_work_history, dea, board_certification, caqh_authorization, group_tin_letter), label, hint (what it must show), required (false: only if it applies, such as DEA while we do not know whether the clinician prescribes), status, uploaded_at, reviewed_at, note (needs_resend only: why we ask again), file (type and size of what was sent; never its name) and caqh_id (caqh_authorization only).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"token","in":"query","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}}],"responses":{"200":{"description":"The documents.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"data":{"type":"object","properties":{"account_id":{"type":"string","format":"uuid"},"accepting":{"type":"boolean","description":"Documents can be sent now: a paid application bundle."},"clinicians":{"type":"array","items":{"type":"object","properties":{"npi":{"type":"string"},"name":{"type":["string","null"]},"applications":{"type":"array","items":{"type":"object","properties":{"payer":{"type":"string"},"state":{"type":"string"},"documents_from":{"enum":["caqh","send"]}}}},"documents":{"type":"array","items":{"$ref":"#/components/schemas/PayerFollowUpDocument"}}}}},"group":{"type":"array","description":"The group's own documents (its IRS Tax ID letter).","items":{"$ref":"#/components/schemas/PayerFollowUpDocument"}},"summary":{"type":"object","properties":{"required":{"type":"integer"},"missing":{"type":"integer","description":"Required documents not sent yet or asked for again."},"received":{"type":"integer"},"accepted":{"type":"integer"},"needs_resend":{"type":"integer"}}},"request_email":{"type":"object","properties":{"sent_at":{"type":["string","null"]},"reminder_sent_at":{"type":["string","null"]}}},"upload":{"type":"object","properties":{"types":{"type":"array","items":{"enum":["application/pdf","image/jpeg","image/png"]}},"max_bytes":{"type":"integer","description":"Multipart form data."},"max_base64_bytes":{"type":"integer","description":"JSON with file_base64, once decoded."}}},"next":{"type":"string"},"authorized_by":{"enum":["token","session","ops"]}}}}}}}},"401":{"description":"Send the access token, or sign in with the follow-up's email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"429":{"description":"Too many requests. Try again in one hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer","minimum":1}}}},"503":{"description":"Could not read the documents. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}}},"tags":["Payer follow-ups","Payments"]},"post":{"operationId":"payerFollowUpDocumentSend","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"summary":"Application bundle: send one document with the account ID and the access token. kind names the document and npi the clinician (leave npi out for group_tin_letter). Send the file as file_base64: a PDF, JPG or PNG up to 3 MB, in a request of at most 4.4 MB (up to 4 MB as multipart form data to POST /v1/payer-follow-ups/{id}/documents). For caqh_authorization send caqh_id and caqh_access_granted true instead of a file. A document sent again before we review it replaces the earlier one; an accepted one stays. Returns the document's new status and the whole list.","description":"The access token (header X-Payer-Follow-Up-Token, Bearer, or the token field) or a session signed in with the follow-up's email. A file is taken as a PDF, JPG or PNG by its contents, whatever its name or stated type; its name is never stored or shown. Multipart form data: npi, kind and file (up to 4 MB). JSON: npi, kind, file_base64 (up to 3 MB once decoded) and optional file_name; or for caqh_authorization, npi, caqh_id and caqh_access_granted true. Leave npi out for group_tin_letter. A document sent again before it is reviewed replaces the earlier one; an accepted one cannot be replaced here. Up to 120 sends per hour.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["kind"],"properties":{"token":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"kind":{"enum":["state_license","malpractice","w9","cv_work_history","dea","board_certification","caqh_authorization","group_tin_letter"]},"npi":{"type":"string","pattern":"^[0-9]{10}$","description":"The clinician; leave it out for group_tin_letter."},"file_base64":{"type":"string","description":"The file, base64 encoded (a data: URL prefix is accepted). Not for caqh_authorization."},"file_name":{"type":"string","maxLength":300,"description":"Optional. Never stored or shown."},"caqh_id":{"type":"string","pattern":"^[0-9]{5,10}$","description":"caqh_authorization only: the clinician's CAQH provider ID."},"caqh_access_granted":{"type":"boolean","description":"caqh_authorization only: true once Licium has access to the clinician's CAQH profile."}}}},"multipart/form-data":{"schema":{"type":"object","required":["kind","file"],"properties":{"token":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"npi":{"type":"string","pattern":"^[0-9]{10}$"},"kind":{"enum":["state_license","malpractice","w9","cv_work_history","dea","board_certification","group_tin_letter"]},"file":{"type":"string","format":"binary","description":"A PDF, JPG or PNG, up to 4 MB."}}}}}},"responses":{"200":{"description":"saved (the document's new state, whether it replaced an earlier one, and whether every required document is in) and documents (the whole list, as GET returns it).","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"data":{"type":"object","properties":{"saved":{"type":"object","properties":{"document":{"$ref":"#/components/schemas/PayerFollowUpDocument"},"replaced":{"type":"boolean"},"complete":{"type":"boolean"},"completed_now":{"type":"boolean"}}},"documents":{"type":"object"}}}}}}}},"400":{"description":"Invalid fields: the message names the first one.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"401":{"description":"Send the access token, or sign in with the follow-up's email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"404":{"description":"Follow-up not found or not opened by this token, or this follow-up does not need that document for that clinician.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"409":{"description":"Not an application bundle, not paid yet, or the document is accepted already.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"413":{"description":"The file is larger than 4 MB (multipart) or 3 MB (base64).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"415":{"description":"The file is not a PDF, JPG or PNG.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"429":{"description":"Too many uploads. Try again in one hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer","minimum":1}}}},"503":{"description":"The document could not be saved right now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/{id}/signers":{"get":{"operationId":"payerFollowUpSigners","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"summary":"Application bundle: read who signs each clinician's written applications, with the account ID and the access token. For each clinician whose applications we write: the signer's name, their email and mobile number with most characters hidden, where the signing stands (nothing to sign yet, waiting for the signer's contact, link sent, opened, signed, or what stopped it), and when the clinician confirmed the email or mobile is their own. Only the clinician signs, from their own phone or computer, after a one-time code.","description":"Same access as the status read: the access token (header X-Payer-Follow-Up-Token, Authorization: Bearer, or ?token= as in emailed links) or a session signed in with the follow-up's email. One entry per clinician with an application we write; any other follow-up returns an empty list. Each entry: npi, clinician (the name on record), name (the signer), email and mobile with most characters hidden (null when not given), self (true when the follow-up's own email was confirmed as the clinician's), and signing: its status (none while there is nothing to sign yet; the statuses are listed in the PayerFollowUpSigner schema), with words, the number of documents, updated_at, and contact_confirmed_at (when the clinician confirmed the email or mobile is their own, before the code went to it).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"token","in":"query","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}}],"responses":{"200":{"description":"Who signs.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"data":{"type":"object","properties":{"signers":{"type":"array","items":{"$ref":"#/components/schemas/PayerFollowUpSigner"}}}}}}}}},"401":{"description":"Send the access token, or sign in with the follow-up's email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"429":{"description":"Too many requests. Try again in one hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer","minimum":1}}}},"503":{"description":"Could not read who signs. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}}},"tags":["Payer follow-ups","Payments"]},"post":{"operationId":"payerFollowUpSignerSet","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"summary":"Application bundle: say who signs one clinician's written applications, with the account ID and the access token: npi, and the clinician's own email, US mobile number, or both (name is optional; the clinician's name on record is used). When an application waits for the signature the link goes out at once (link: sent); resend_link true sends it again. Only the clinician may sign: this follow-up's own email is taken for a clinician only with i_am_this_clinician true. A changed contact ends any signing in progress.","description":"The access token (header X-Payer-Follow-Up-Token, Bearer, or the token field) or a session signed in with the follow-up's email. npi must be a clinician with an application we write. Give email, mobile (a US mobile number), or both; name is optional. When an application waits for the signature, the signing link goes out at once (link: sent, channels: where it went); with the contact unchanged it is not sent again unless resend_link is true (link: unchanged); before the application is filled in, link is nothing_to_sign and the link goes out when it is; not_sent means sending failed and it is tried again. Changing the email or mobile ends any signing in progress. The follow-up's own email is taken for a clinician only with i_am_this_clinician true (409 otherwise), and that is kept with the signature. Up to 120 per hour.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["npi"],"properties":{"token":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"npi":{"type":"string","pattern":"^[0-9]{10}$","description":"The clinician's NPI."},"name":{"type":"string","minLength":2,"maxLength":120,"description":"Optional. The signer's full name; the clinician's name on record when left out."},"email":{"type":"string","maxLength":254,"description":"The clinician's own email address."},"mobile":{"type":"string","maxLength":30,"description":"The clinician's US mobile number, such as 415-555-0100."},"i_am_this_clinician":{"type":"boolean","description":"true only when email is this follow-up's own email and the person it belongs to is this clinician."},"resend_link":{"type":"boolean","description":"true sends a waiting signing link again."}}}}}},"responses":{"200":{"description":"signer (as GET lists it), link (sent, unchanged, nothing_to_sign or not_sent) and channels (where the link went now: sms, email).","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"data":{"type":"object","properties":{"signer":{"$ref":"#/components/schemas/PayerFollowUpSigner"},"link":{"enum":["sent","unchanged","nothing_to_sign","not_sent"]},"channels":{"type":"array","items":{"enum":["sms","email"]}}}}}}}}},"400":{"description":"Invalid fields: the message names the first one (neither email nor mobile, a mobile that is not a US mobile number, a name too short).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"401":{"description":"Send the access token, or sign in with the follow-up's email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"403":{"description":"Sent from a browser on another site (its Origin header is not licium.ai). Calls from a server send no Origin header and are not affected.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"404":{"description":"Follow-up not found or not opened by this token, or no application we write has this NPI.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"409":{"description":"The follow-up's own email given for a clinician without i_am_this_clinician true, or a sample made for a demonstration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"429":{"description":"Too many requests. Try again in one hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer","minimum":1}}}},"503":{"description":"Could not save who signs. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/{id}/report":{"get":{"operationId":"payerFollowUpReport","security":[{"PayerFollowUpToken":[]},{"PayerFollowUpBearer":[]}],"summary":"Read one practice's weekly status report with the account ID and its access token, or the access token of the credentialing firm it is run for: for each application the payer, state, submitted date, status in the payer's own words, where it came from (the payer's status page with its address and read time, an automated call with the representative's name and the call reference, the payer's email reply, the payer's portal, or a person), what is missing and from whom, and the next check date. When a credentialing firm runs the follow-up, the report carries the firm's name, reply-to address and callback number. The page prints, or saves as a PDF. Add ?format=csv or ?format=xlsx for the applications as a spreadsheet, one row per application, ready to paste into Smartsheet or Excel.","description":"Send the follow-up's access token or the access token of the credentialing firm it is run for (header X-Payer-Follow-Up-Token, Authorization: Bearer, or ?token= as in emailed links), or use a session signed in with the follow-up's or the firm's email. Applications come in this order: missing documents first, then no record, then the rest by next check, decided last. source.kind: status_page (url, at = read time), call (rep_name, call_reference, at = when the call ended), email (the payer's email reply: rep_name = who signed it, call_reference = its case or ticket number), portal (the payer's portal, at = read time) or person (note = the reference or representative written down). waiting_on: payer, practice (missing says what, next_step says who sends it where) or nobody (decided). sample: a sample made for a demonstration, every name, number and status in it made up.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"token","in":"query","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}},{"name":"format","in":"query","description":"json (default), or csv / xlsx for the applications as a file to save, one row per application with these columns: Practice, Clinician, NPI, Payer, State, Submitted, Status in the payer's words, Status, Payer's status date, Reference number, Representative, Call reference or note, Missing items, Who sends them, Next step, Last checked (ET), Next check, Effective date, Status source, Source link, Application ID. Days are YYYY-MM-DD and times US Eastern.","schema":{"type":"string","enum":["json","csv","xlsx"]}}],"responses":{"200":{"description":"The report, or with format csv or xlsx the applications as a spreadsheet file.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"data":{"$ref":"#/components/schemas/PayerFollowUpReport"}}}},"text/csv":{"schema":{"type":"string","description":"UTF-8 with a byte order mark, CRLF line ends, one header row."}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"format must be json, csv or xlsx.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"401":{"description":"Send the follow-up's access token or its firm's, or sign in with the follow-up's email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"404":{"description":"Follow-up not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"429":{"description":"Too many requests. Try again in one hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer","minimum":1}}}},"503":{"description":"Could not read the report. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/firms/{firmId}":{"get":{"operationId":"payerFollowUpFirm","summary":"A credentialing firm's view, with the firm ID and the firm's access token: each client practice it runs a weekly payer follow-up for (open, decided and missing-document counts, the next check, its report) and every pending application across them in one list, the ones waiting on a practice first, each as the practice's report shows it. Add ?format=csv or ?format=xlsx for every application (pending, and decided in the last 30 days) as a spreadsheet, one row per application, ready to paste into Smartsheet or Excel.","description":"Send the firm's access token (header X-Payer-Follow-Up-Token, Authorization: Bearer, or ?token=), or use a session signed in with the firm's email. The same token opens each of the firm's practices: GET /v1/payer-follow-ups/{id} and GET /v1/payer-follow-ups/{id}/report. applications lists every pending application, missing documents first, then no record, then by next check; recently_decided lists those decided in the last 30 days.","parameters":[{"name":"firmId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Payer-Follow-Up-Token","in":"header","description":"The firm's access token.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}},{"name":"token","in":"query","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}},{"name":"format","in":"query","description":"json (default), or csv / xlsx for the applications as a file to save, one row per application with these columns: Practice, Clinician, NPI, Payer, State, Submitted, Status in the payer's words, Status, Payer's status date, Reference number, Representative, Call reference or note, Missing items, Who sends them, Next step, Last checked (ET), Next check, Effective date, Status source, Source link, Application ID. Days are YYYY-MM-DD and times US Eastern.","schema":{"type":"string","enum":["json","csv","xlsx"]}}],"responses":{"200":{"description":"The firm's practices and pending applications, or with format csv or xlsx every application (pending, then decided in the last 30 days) as a spreadsheet file.","content":{"text/csv":{"schema":{"type":"string","description":"UTF-8 with a byte order mark, CRLF line ends, one header row."}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"data":{"type":"object","properties":{"firm":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"reply_to_email":{"type":"string"},"callback_number":{"type":["string","null"]},"sample":{"type":"boolean"},"notices_to":{"enum":["practice","firm_first"],"description":"Where the practices' notices go first."}}},"generated_at":{"type":"string"},"week_of":{"type":"string","format":"date"},"summary":{"type":"object","properties":{"practices":{"type":"integer"},"open":{"type":"integer"},"needs_documents":{"type":"integer"},"changed_this_week":{"type":"integer"},"decided":{"type":"integer"}}},"practices":{"type":"array","items":{"type":"object","properties":{"account_id":{"type":"string","format":"uuid"},"practice":{"type":"string"},"sample":{"type":"boolean"},"standing":{"enum":["awaiting_payment","active","paused","ended","payment_problem"]},"open":{"type":"integer"},"decided":{"type":"integer"},"needs_documents":{"type":"integer"},"changed_this_week":{"type":"integer"},"next_check_on":{"type":["string","null"],"format":"date"},"report_path":{"type":"string"}}}},"applications":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/PayerFollowUpReportApplication"},{"type":"object","properties":{"account_id":{"type":"string","format":"uuid"},"practice":{"type":"string"}}}]}},"recently_decided":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/PayerFollowUpReportApplication"},{"type":"object","properties":{"account_id":{"type":"string","format":"uuid"},"practice":{"type":"string"}}}]}},"authorized_by":{"enum":["token","session","ops"]}}}}}}}},"400":{"description":"format must be json, csv or xlsx.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"401":{"description":"Send the firm's access token, or sign in with the firm's email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"404":{"description":"Firm not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"429":{"description":"Too many requests. Try again in one hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer","minimum":1}}}},"503":{"description":"Could not read the firm's practices. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}}},"tags":["Payer follow-ups","Payments"]},"patch":{"operationId":"payerFollowUpFirmSettings","summary":"Set where a credentialing firm's practice notices go first, with the firm ID and the firm's access token: notices_to practice sends the missing-documents alerts, the roster change alerts and the Monday status email straight to each client practice under the firm's name; notices_to firm_first sends them to the firm's reply-to address instead, each marked for its practice, for the firm to forward. Returns the firm's view with the setting saved.","description":"Send the firm's access token (header X-Payer-Follow-Up-Token or Authorization: Bearer), or use a session signed in with the firm's email. Emails already prepared keep their recipient; the next ones follow the new setting.","parameters":[{"name":"firmId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"X-Payer-Follow-Up-Token","in":"header","description":"The firm's access token.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["notices_to"],"properties":{"notices_to":{"enum":["practice","firm_first"],"description":"practice: straight to each practice under the firm's name. firm_first: to the firm's reply-to address, marked for the practice."}}}}}},"responses":{"200":{"description":"The firm's view (as GET returns it) with the setting saved in firm.notices_to."},"400":{"description":"notices_to is practice or firm_first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"401":{"description":"Send the firm's access token, or sign in with the firm's email.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"403":{"description":"The request came from another site.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"404":{"description":"Firm not found, or the token does not open it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"429":{"description":"Too many requests. Try again in one hour.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer","minimum":1}}}},"503":{"description":"Could not save the firm's settings. Try again in a minute.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}}},"tags":["Payer follow-ups","Payments"]}},"/v1/payer-follow-ups/status-check":{"get":{"operationId":"payerStatusCheckPages","summary":"The payer status pages the status check reads, and the numbers each one needs besides the NPI.","responses":{"200":{"description":"pages: id, label, states, required and optional fields, and what the page calls its application number.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"data":{"type":"object","properties":{"pages":{"type":"array","items":{"type":"object","properties":{"id":{"enum":["novitas-pst","first-coast-pst","noridian-je","noridian-jf","cgs-j15-status","ngs-enrollment-status","palmetto-enrollment-status","wps-easi","flmmis-enrollment-status","ct-cmap-enrollment-tracking","ga-gammis-enrollment-status","or-mmis-enrollment-tracking","wi-forwardhealth-enrollment-tracking","emedny-pending-listing","njmmis-application-status","bcbstx-credentialing-status","bcbsil-credentialing-status","bcbsok-credentialing-status","bcbsnm-credentialing-status","bcbsmt-credentialing-status"]},"label":{"type":"string"},"states":{"type":"array","items":{"type":"string"}},"required":{"type":"array","items":{"enum":["reference","last_name","ein","submitted_on"]}},"optional":{"type":"array","items":{"enum":["reference","last_name","ein","submitted_on"]}},"reference_label":{"type":["string","null"]}}}}}}}}}}}},"tags":["Payer follow-ups","Payments"]},"post":{"operationId":"payerStatusCheck","summary":"Read one payer's public application status page now: send the page, the clinician's NPI, the state, and the numbers that page asks for (the application number, the clinician's last name as submitted, the practice's EIN), with the submitted date if known. Returns what the page said (its status words, the date it gives, the application number it shows, an excerpt), the page's address and the time it was read. A page that needs a person (one read by hand, a sign-in, nothing or several found, a decision to confirm, a number not given) says so with the reason; nothing is guessed and nothing is recorded on any application. Needs a credentialing firm's access token, or a paid follow-up's own access token (not an emailed link's). Up to 12 checks per 10 minutes and 60 per day per caller, and up to 30 reads of one payer's page per 10 minutes in all.","description":"The access token goes in the X-Payer-Follow-Up-Token header, Authorization: Bearer, or the token field. outcome read: the page stated a status (status is received, in_review or no_record). outcome needs_person: blocker says why (captcha, bot_challenge, login_wall, shape_changed, missing_numbers, not_found, several_found, needs_detail, decision, unknown_status, unreachable) and reason says it in words; page_status still carries what the page showed, if anything. Only the NPI and what the page said are kept; the other numbers typed are not.","parameters":[{"name":"X-Payer-Follow-Up-Token","in":"header","description":"A credentialing firm's access token, or a paid follow-up's own access token.","schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["page","npi"],"properties":{"page":{"enum":["novitas-pst","first-coast-pst","noridian-je","noridian-jf","cgs-j15-status","ngs-enrollment-status","palmetto-enrollment-status","wps-easi","flmmis-enrollment-status","ct-cmap-enrollment-tracking","ga-gammis-enrollment-status","or-mmis-enrollment-tracking","wi-forwardhealth-enrollment-tracking","emedny-pending-listing","njmmis-application-status","bcbstx-credentialing-status","bcbsil-credentialing-status","bcbsok-credentialing-status","bcbsnm-credentialing-status","bcbsmt-credentialing-status"],"description":"The payer's status page (GET this path for the list)."},"npi":{"type":"string","pattern":"^[0-9]{10}$"},"state":{"type":"string","pattern":"^[A-Z]{2}$","description":"One of the states the page covers; the first is used when left out."},"reference":{"type":"string","maxLength":40,"description":"The application's number with the payer (DCN, ATN, reference number or PECOS web tracking ID)."},"last_name":{"type":"string","maxLength":60,"description":"Florida, Connecticut, Georgia and Oregon Medicaid: the clinician's last name exactly as submitted."},"ein":{"type":"string","maxLength":12,"description":"The practice's EIN (nine digits): New Jersey Medicaid needs it; NGS Medicare can search by the NPI with its last five digits."},"submitted_on":{"type":"string","format":"date","description":"Helps pick the application when the clinician has several."},"token":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}}}}}},"responses":{"200":{"description":"What the page said.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"const":true},"data":{"type":"object","properties":{"check_id":{"type":"string","format":"uuid"},"page":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"}}},"npi":{"type":"string"},"summary":{"type":"string","description":"One sentence: what the page says, or why a person needs to look."},"result":{"type":"object","properties":{"page":{"type":"string"},"url":{"type":"string"},"read_at":{"type":"string"},"outcome":{"enum":["read","needs_person"]},"status":{"enum":["received","in_review","no_record",null]},"page_status":{"type":["string","null"]},"status_date":{"type":["string","null"]},"reference":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"blocker":{"type":["string","null"]},"reason":{"type":["string","null"]}}}}}}}}}},"400":{"description":"A field is missing or not valid, or the page needs a number that was not given: the message names it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"401":{"description":"Send a credentialing firm's or a paid follow-up's access token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"403":{"description":"Not paid yet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"413":{"description":"The request is too large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}},"429":{"description":"Over a limit: the message and Retry-After say when to try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before trying again.","schema":{"type":"integer","minimum":1}}}},"503":{"description":"The status check could not run right now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayerFollowUpError"}}}}},"tags":["Payer follow-ups","Payments"]}}},"webhooks":{"payerFollowUpStatusChanged":{"post":{"summary":"Payer follow-up: an application's status changed","description":"Status webhooks: each time an application's status changes (received, in_review, needs_documents, approved with its effective date, denied, no_record, or no_decision when the checks stop without a decision, and back when it is reopened), Licium POSTs one application.status_changed event as JSON to the follow-up's webhook address. Headers: Licium-Signature (t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" keyed with the secret>), Licium-Event-Id and Licium-Event-Type. Answer with any 2xx within 5 seconds. Otherwise the event is sent again after 1 minute, 10 minutes, 1 hour and 6 hours (five tries in all); redirects are not followed. The same event id can arrive more than once, so treat it as idempotent. Events go to the address set when they are sent; a removed address cancels the waiting ones. Guide: https://www.licium.ai/payer-follow-up/api","parameters":[{"name":"Licium-Signature","in":"header","required":true,"schema":{"type":"string"},"description":"t=<unix seconds>,v1=<hex HMAC-SHA256 of \"<t>.<raw body>\" keyed with the webhook secret>. Compute it over the raw body bytes and compare in constant time; reject a t more than 5 minutes old."},{"name":"Licium-Event-Id","in":"header","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Licium-Event-Type","in":"header","required":true,"schema":{"enum":["application.status_changed","webhook.test"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["id","type","created_at","account_id","data"],"properties":{"id":{"type":"string","format":"uuid","description":"The event id (also the Licium-Event-Id header). The same id on every try."},"type":{"enum":["application.status_changed","webhook.test"]},"created_at":{"type":"string","format":"date-time"},"account_id":{"type":"string","format":"uuid","description":"The follow-up (account_id from POST /v1/payer-follow-ups)."},"data":{"type":"object","description":"application.status_changed: the application and its new status. webhook.test: {message}.","properties":{"application_id":{"type":"string","format":"uuid","description":"applications[].id in GET /v1/payer-follow-ups/{id}."},"npi":{"type":"string","description":"The clinician's NPI."},"payer":{"type":"string"},"state":{"type":"string"},"status":{"enum":["not_checked","received","in_review","needs_documents","approved","denied","no_record","no_decision"],"description":"The new status. no_decision: the checks stopped without a decision (see stopped). not_checked only after a reopen of an application never checked."},"previous_status":{"enum":["not_checked","received","in_review","needs_documents","approved","denied","no_record","no_decision"]},"effective_date":{"type":["string","null"],"format":"date","description":"Approved: the effective date the payer gave."},"missing_documents":{"type":["string","null"],"description":"Needs documents: what the payer is missing."},"decided":{"type":"boolean","description":"Approved or denied: checks of this application stop."},"checked_at":{"type":"string","format":"date-time"},"next_check_at":{"type":["string","null"],"format":"date-time"},"payer_said":{"type":["string","null"],"description":"What the payer said, in its words (null for a stop or a reopen)."},"source":{"type":["object","null"],"description":"Null for a stop or a reopen.","properties":{"method":{"enum":["portal","phone","email"],"description":"portal: the payer's status page or portal."},"automated":{"type":"boolean","description":"Recorded automatically (from the payer's status page, an automated call, the payer's email reply or its portal), not entered by a person."},"reference":{"type":["string","null"],"description":"The payer's reference number, or the representative's name."},"note":{"type":["string","null"],"description":"Where the status came from (for a page: its name, address and read time)."}}},"stopped":{"type":["object","null"],"description":"status no_decision: why the checks stopped (no_record: the payer had no record of it for at least three weeks; twelve_months: twelve months without a decision) and until when it can be reopened at no charge.","properties":{"reason":{"enum":["no_record","twelve_months"]},"reopen_until":{"type":"string","format":"date-time"}}},"message":{"type":"string","description":"webhook.test only."}}}}}}}},"responses":{"200":{"description":"Any 2xx within 5 seconds is a delivery; anything else is tried again."}}}}},"components":{"schemas":{"PayerFollowUpApplication":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"The application. Webhook events name it as data.application_id."},"npi":{"type":"string"},"clinician_name":{"type":["string","null"],"description":"As the national NPI registry has it, once read."},"payer":{"type":"string"},"state":{"type":"string"},"submitted_on":{"type":["string","null"],"format":"date","description":"Null on an application bundle item until it is submitted."},"work":{"enum":["follow_up","write_and_submit"],"description":"write_and_submit: an application bundle item we write and submit."},"documents_from":{"enum":["caqh","send",null]},"payer_reference":{"type":["string","null"],"description":"As you sent it."},"notes":{"type":["string","null"],"description":"As you sent them."},"status":{"enum":["not_checked","received","in_review","needs_documents","approved","denied","no_record","no_decision"],"description":"See the status list in the guide: approved and denied are final; no_decision is final unless reopened."},"effective_date":{"type":["string","null"],"format":"date","description":"Approved: the effective date the payer gave."},"reference_or_rep":{"type":["string","null"],"description":"The payer's reference number or the representative's name, from the latest check."},"missing_documents":{"type":["string","null"],"description":"needs_documents: what the payer is missing."},"last_checked_at":{"type":["string","null"],"format":"date-time","description":"The latest check, or the latest status page read that found the same answer."},"next_check_at":{"type":["string","null"],"format":"date-time","description":"When it is checked next (null once decided, stopped, or not covered): every 30 minutes, day and night for a payer that posts its status online, otherwise every check_every_days days."},"check_every_days":{"type":"integer","minimum":1,"maximum":7,"description":"Days between the checks that are not status page reads, as set at intake (7: weekly)."},"closed_at":{"type":["string","null"],"format":"date-time","description":"When it was decided or stopped."},"coverage":{"enum":["not_started","covered","paused","ended","decided","stopped"],"description":"covered: checked until decided; decided; stopped: closed with no decision (see stopped); paused: payment not current; ended: group plan, six months on the pending line; not_started: awaiting payment."},"stopped":{"type":["object","null"],"description":"Status no_decision: why the checks stopped, when, and until when it can be reopened at no charge (reopen_path, null once the 30 days have passed).","properties":{"reason":{"enum":["no_record","twelve_months"]},"at":{"type":"string","format":"date-time"},"reopen_until":{"type":["string","null"],"format":"date-time"},"reopen_path":{"type":["string","null"],"description":"POST it with the access token to reopen."}}},"checks":{"type":"array","description":"Every answer, newest first.","items":{"$ref":"#/components/schemas/PayerFollowUpCheck"}},"waiting_on_you":{"type":"array","items":{"type":"string"},"description":"An application we write and submit, paid and not submitted yet: what we still need from you or the clinician. Empty otherwise."},"submission":{"type":["object","null"],"description":"An application we write and submit: where its writing, signing and sending stand. Null before we start it, and on an application you submitted yourself.","required":["step","words","channel","sent_at","delivered_at","signer","clinician_to_do","events"],"properties":{"step":{"enum":["preparing","needs_signer","waiting_signature","signed","sending","sent","delivered","needs_attention"],"description":"preparing, needs_signer (we need the signer's email or mobile: POST /v1/payer-follow-ups/{id}/signers), waiting_signature, signed, sending, sent, delivered, or needs_attention (we are fixing something before it goes out)."},"words":{"type":"string","description":"The step in plain words."},"channel":{"enum":["email","fax","mail","web",null],"description":"How it goes to the payer: email, fax, mail, or web (submitted on the payer's own website or enrollment portal)."},"clinician_to_do":{"type":["object","null"],"description":"When the payer's own system needs the clinician (signing the program's own email, or submitting from their own account): where, and the steps in order. Null otherwise.","properties":{"where":{"type":"string"},"steps":{"type":"array","items":{"type":"string"}}}},"sent_at":{"type":["string","null"],"format":"date-time"},"delivered_at":{"type":["string","null"],"format":"date-time"},"signer":{"type":["object","null"],"description":"Who signs it and where the signing stands; GET /v1/payer-follow-ups/{id}/signers has the contacts.","properties":{"name":{"type":["string","null"]},"status":{"enum":["waiting_contact","sent","opened","verified","signed","declined","expired","voided",null]},"contact_needed":{"type":"boolean","description":"true: say who signs with POST /v1/payer-follow-ups/{id}/signers."}}},"events":{"type":"array","description":"What happened, oldest first.","items":{"type":"object","required":["at","words"],"properties":{"at":{"type":"string","format":"date-time"},"words":{"type":"string"}}}}}}}},"PayerFollowUpCheck":{"type":"object","description":"One answer from the payer. A status page read that finds what the latest check already says adds to reads and last_read_at instead of a new entry.","properties":{"checked_at":{"type":"string","format":"date-time"},"reads":{"type":"integer","minimum":1,"description":"How many reads found this same answer."},"last_read_at":{"type":["string","null"],"format":"date-time"},"method":{"enum":["portal","phone","email"],"description":"portal: the payer's status page or portal."},"checked_by":{"type":"string"},"status":{"enum":["received","in_review","needs_documents","approved","denied","no_record"]},"payer_said":{"type":"string","description":"What the payer said, in its words."},"reference_or_rep":{"type":["string","null"],"description":"The payer's reference number or the representative's name."},"missing_documents":{"type":["string","null"]},"effective_date":{"type":["string","null"],"format":"date"},"source_note":{"type":["string","null"],"description":"Where the answer came from (for a status page: its name, address and read time)."}}},"PayerFollowUpDocument":{"type":"object","description":"One document an application bundle needs.","properties":{"id":{"type":"string","format":"uuid"},"kind":{"enum":["state_license","malpractice","w9","cv_work_history","dea","board_certification","caqh_authorization","group_tin_letter"]},"label":{"type":"string"},"hint":{"type":"string","description":"What the document must show."},"required":{"type":"boolean","description":"false: only if it applies (DEA while we do not know whether the clinician prescribes; board certification)."},"status":{"enum":["needed","received","accepted","needs_resend"]},"uploaded_at":{"type":["string","null"]},"reviewed_at":{"type":["string","null"]},"note":{"type":["string","null"],"description":"needs_resend only: why we ask for it again."},"file":{"type":["object","null"],"properties":{"type":{"enum":["application/pdf","image/jpeg","image/png"]},"bytes":{"type":"integer"}}},"caqh_id":{"type":["string","null"],"description":"caqh_authorization only."},"version":{"type":"integer","description":"How many times it has been sent; 0 while needed."}}},"PayerFollowUpError":{"type":"object","required":["success","error"],"description":"Every error: success false and what to fix, in words. A 400 from POST /v1/payer-follow-ups lists each entry that cannot be used in invalid_entries (nothing is saved).","properties":{"success":{"const":false},"error":{"type":"string"},"invalid_entries":{"type":"array","items":{"type":"object","required":["entry","reason"],"properties":{"entry":{"type":"string","description":"Which entry, as you sent it (for example \"Application 2: 1234567890, Cigna\")."},"reason":{"type":"string"}}}}}},"PayerFollowUpPrice":{"type":"object","required":["plan","monitoring","lines","first_payment_cents","monthly_cents","one_time_cents","checkout_mode"],"properties":{"plan":{"enum":["group","per_application","application_bundle"]},"monitoring":{"type":"boolean"},"lines":{"type":"array","items":{"type":"object","properties":{"key":{"enum":["roster","pending","application","monitoring","bundle"]},"label":{"type":"string"},"unit_cents":{"type":"integer"},"quantity":{"type":"integer"},"amount_cents":{"type":"integer"},"recurring":{"type":"boolean","description":"Charged every month."}}}},"first_payment_cents":{"type":"integer","description":"Charged at checkout."},"monthly_cents":{"type":"integer","description":"Charged every month after (0 without a subscription)."},"one_time_cents":{"type":"integer"},"checkout_mode":{"enum":["subscription","payment"]}}},"PayerFollowUpReceipt":{"type":"object","required":["account_id","access_token","status_url","checkout_url","plan","monitoring","roster_count","pending_clinician_count","application_count","price","payment_status","next","webhook","notify"],"properties":{"account_id":{"type":"string","format":"uuid","description":"The follow-up. Every other call names it."},"access_token":{"type":["string","null"],"pattern":"^[A-Za-z0-9_-]{43}$","description":"Shown once. Opens this follow-up (header X-Payer-Follow-Up-Token), reopens payment and reopens an application stopped with no decision. Keep it like a password. null in a repeated reply (replayed true): it was shown only in the first one."},"status_url":{"type":"string","description":"/payer-follow-up/{id} on www.licium.ai: the status page, opened with the access token or a session signed in with the follow-up's email."},"checkout_url":{"type":["string","null"],"description":"Stripe Checkout. Nothing is checked until it is paid. POST /v1/payer-follow-ups/{id}/checkout opens a new one if it expires."},"plan":{"enum":["group","per_application","application_bundle"]},"monitoring":{"type":"boolean"},"roster_count":{"type":"integer"},"pending_clinician_count":{"type":"integer"},"application_count":{"type":"integer"},"price":{"$ref":"#/components/schemas/PayerFollowUpPrice"},"payment_status":{"const":"awaiting_payment"},"next":{"type":"string","description":"Pay at checkout_url. Keep access_token: it is shown only once, and it opens GET /v1/payer-follow-ups/{account_id} (header X-Payer-Follow-Up-Token), reopens payment and reopens an application stopped with no decision; the emails carry their own links. Nothing is checked, written or submitted until the payment settles; the work starts then."},"notify":{"enum":["practice","platform_only","webhook_only"],"description":"Who gets this follow-up's emails."},"webhook":{"type":["object","null"],"required":["url","secret"],"description":"When webhook_url was sent: the address and its signing secret. The secret is shown only in this reply (null in a repeated reply); PUT /v1/payer-follow-ups/{id}/webhook makes a new one.","properties":{"url":{"type":"string"},"secret":{"type":["string","null"],"pattern":"^lws_[0-9a-f]{64}$"}}},"replayed":{"const":true,"description":"Only in a repeated reply: the request had the Idempotency-Key of an earlier one, and this is that reply again."},"note":{"type":"string","description":"Only in a repeated reply: This repeats the reply to the first request sent with this Idempotency-Key. The access_token (and any webhook secret) were shown only in that first reply, so they are null here. If the token was lost, sign in on licium.ai with the follow-up's email to open it."}}},"PayerFollowUpReport":{"type":"object","description":"One practice's weekly status report.","properties":{"account_id":{"type":"string","format":"uuid"},"practice":{"type":"string"},"week_of":{"type":"string","format":"date"},"generated_at":{"type":"string"},"prepared_by":{"type":"object","properties":{"name":{"type":"string"},"firm":{"type":"boolean","description":"Run by a credentialing firm."},"firm_id":{"type":["string","null"],"format":"uuid"},"reply_to_email":{"type":["string","null"]},"callback_number":{"type":["string","null"]}}},"sample":{"type":"boolean"},"summary":{"type":"object","properties":{"open":{"type":"integer"},"decided":{"type":"integer"},"approved":{"type":"integer"},"denied":{"type":"integer"},"needs_documents":{"type":"integer"},"changed_this_week":{"type":"integer"}}},"applications":{"type":"array","items":{"$ref":"#/components/schemas/PayerFollowUpReportApplication"}},"authorized_by":{"enum":["token","session","ops","firm","firm_session"]}}},"PayerFollowUpReportApplication":{"type":"object","description":"One application in a weekly status report.","properties":{"id":{"type":"string","format":"uuid"},"clinician":{"type":["string","null"]},"npi":{"type":"string"},"payer":{"type":"string"},"state":{"type":"string"},"submitted_on":{"type":["string","null"],"format":"date"},"to_submit":{"type":"boolean","description":"An application we write and submit, not submitted yet."},"status":{"enum":["not_checked","received","in_review","needs_documents","approved","denied","no_record"]},"status_label":{"type":"string"},"payer_words":{"type":["string","null"],"description":"The status in the payer's own words: its page's words, the representative's, or what was written down."},"status_date":{"type":["string","null"],"description":"The date the payer's page gives with that status, as shown."},"expected_decision":{"type":["string","null"],"description":"When a representative said a decision is expected, as said."},"note":{"type":["string","null"],"description":"What the person who recorded it wrote down, when payer_words came from the payer's page."},"effective_date":{"type":["string","null"],"format":"date"},"reference":{"type":["string","null"],"description":"The application's number with the payer, or null."},"source":{"type":["object","null"],"properties":{"kind":{"enum":["status_page","call","email","portal","person"]},"label":{"type":"string"},"url":{"type":["string","null"]},"at":{"type":"string"},"rep_name":{"type":["string","null"]},"call_reference":{"type":["string","null"]},"note":{"type":["string","null"]},"method":{"enum":["portal","phone","email"]}}},"missing":{"type":["string","null"]},"waiting_on":{"enum":["payer","practice","nobody"]},"next_step":{"type":"string"},"last_checked_at":{"type":["string","null"]},"next_check_on":{"type":["string","null"],"format":"date"},"changed_this_week":{"type":"boolean"},"history":{"type":"array","items":{"type":"object","properties":{"checked_at":{"type":"string"},"status":{"type":"string"},"status_label":{"type":"string"},"payer_words":{"type":["string","null"]},"source_kind":{"enum":["status_page","call","email","portal","person"]},"source_label":{"type":"string"},"rep_name":{"type":["string","null"]},"call_reference":{"type":["string","null"]}}}},"status_check_page":{"type":["string","null"],"description":"The page POST /v1/payer-follow-ups/status-check reads for this payer in this state, or null."},"reply":{"type":["object","null"],"description":"The payer's email reply the current status came from, or null.","properties":{"received_at":{"type":"string"},"from":{"type":["string","null"]},"from_address":{"type":["string","null"]},"subject":{"type":["string","null"]},"text":{"type":["string","null"],"description":"The reply's own text, without the quoted question."},"asked_at":{"type":["string","null"]},"asked_to":{"type":["string","null"]},"inquiry":{"type":["string","null"],"description":"The status question's number."}}},"alert":{"type":["object","null"],"description":"The missing-documents alert sent for what the payer asked (needs documents only), or null.","properties":{"sent_on":{"type":"string","format":"date"},"to":{"enum":["firm","practice"]}}}}},"PayerFollowUpSigner":{"type":"object","description":"Who signs one clinician's written applications, and where the signing stands. Only the clinician signs.","properties":{"npi":{"type":"string"},"clinician":{"type":["string","null"],"description":"The clinician's name on record."},"name":{"type":["string","null"],"description":"The signer's name, once set."},"email":{"type":["string","null"],"description":"With most characters hidden."},"mobile":{"type":["string","null"],"description":"With most characters hidden."},"self":{"type":"boolean","description":"true: the follow-up's own email, confirmed as this clinician's."},"signing":{"type":"object","properties":{"status":{"enum":["none","waiting_contact","sent","opened","verified","signed","declined","expired","voided"],"description":"none: nothing to sign yet; the link goes out when the application is filled in."},"words":{"type":"string"},"documents":{"type":"integer","description":"How many documents wait for the signature."},"updated_at":{"type":["string","null"],"format":"date-time"},"contact_confirmed_at":{"type":["string","null"],"format":"date-time","description":"When the clinician confirmed, before the code was sent, that the email or mobile given is their own; null until then."}}}}},"PayerFollowUpStatus":{"type":"object","properties":{"account_id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"},"company":{"type":["string","null"]},"plan":{"enum":["group","per_application","application_bundle"]},"monitoring":{"type":"boolean"},"access":{"type":"array","items":{"enum":["portal_user","pecos_surrogate","delegation_letter","caqh_admin","call_only"]}},"standing":{"enum":["awaiting_payment","active","paused","ended","payment_problem"],"description":"awaiting_payment: nothing is checked yet. active: checks run. paused: a subscription payment is not current. ended: the subscription ended. payment_problem: the payment failed or needs a person."},"payment":{"type":"object","properties":{"status":{"enum":["awaiting_payment","paid","failed","mismatch"]},"paid_at":{"type":["string","null"],"format":"date-time"},"first_amount_cents":{"type":"integer"},"monthly_amount_cents":{"type":"integer"},"subscription_status":{"type":["string","null"]},"current_period_end":{"type":["string","null"],"format":"date-time"},"cancel_at_period_end":{"type":"boolean"},"manage_url":{"type":["string","null"],"format":"uri","description":"Billing page: card, invoices, cancel from the next period (subscriptions only)."},"billing_status":{"enum":["ok","short"],"description":"short: the subscription now bills less than the plan; checks are paused until it is fixed."}}},"price":{"$ref":"#/components/schemas/PayerFollowUpPrice"},"summary":{"type":"object","description":"How many applications have each status.","properties":{"not_checked":{"type":"integer"},"received":{"type":"integer"},"in_review":{"type":"integer"},"needs_documents":{"type":"integer"},"approved":{"type":"integer"},"denied":{"type":"integer"},"no_record":{"type":"integer"},"no_decision":{"type":"integer"}}},"applications":{"type":"array","items":{"$ref":"#/components/schemas/PayerFollowUpApplication"}},"roster":{"type":"array","items":{"type":"object","properties":{"npi":{"type":"string"},"name":{"type":["string","null"]},"caqh_attested_on":{"type":["string","null"],"format":"date"},"pending_line":{"type":"boolean"},"pending_left_reason":{"enum":["decided","six_months",null]}}}},"monitoring_state":{"type":"object","description":"Weekly roster monitoring (group plan, or added on the per-application plan).","properties":{"active":{"type":"boolean"},"last_run_at":{"type":["string","null"],"format":"date-time"},"next_run_at":{"type":["string","null"],"format":"date-time"}}},"calendar":{"type":"object","description":"Deadlines within 30 days (and past ones) and in 31 to 90 days.","properties":{"within_30_days":{"type":"array","items":{"type":"object","properties":{"kind":{"enum":["medicare_revalidation","group_revalidation","license_expiry","caqh_reattestation"]},"npi":{"type":["string","null"]},"name":{"type":["string","null"]},"date":{"type":"string","format":"date"},"days_left":{"type":"integer","description":"Negative when past."},"label":{"type":"string"},"source_url":{"type":["string","null"]}}}},"within_90_days":{"type":"array","items":{"type":"object","properties":{"kind":{"enum":["medicare_revalidation","group_revalidation","license_expiry","caqh_reattestation"]},"npi":{"type":["string","null"]},"name":{"type":["string","null"]},"date":{"type":"string","format":"date"},"days_left":{"type":"integer","description":"Negative when past."},"label":{"type":"string"},"source_url":{"type":["string","null"]}}}}}},"roster_changes":{"type":"array","items":{"type":"object","properties":{"detected_at":{"type":"string"},"npi":{"type":"string"},"provider_name":{"type":["string","null"]},"label":{"type":"string"},"before":{"type":["string","null"]},"after":{"type":["string","null"]},"source_url":{"type":["string","null"]},"read_at":{"type":["string","null"]}}}},"documents":{"type":["object","null"],"description":"Application bundle: how many documents we need, still missing, received, accepted and asked for again, and path (the documents page). The list: GET /v1/payer-follow-ups/{id}/documents.","properties":{"required":{"type":"integer"},"missing":{"type":"integer"},"received":{"type":"integer"},"accepted":{"type":"integer"},"needs_resend":{"type":"integer"},"path":{"type":"string"}}},"firm":{"type":["object","null"],"description":"The credentialing firm this follow-up is run for, or null.","properties":{"name":{"type":"string"},"reply_to_email":{"type":"string"},"callback_number":{"type":["string","null"]}}},"sample":{"type":"boolean","description":"A sample made for a demonstration: every name, number and status in it is made up, and nothing is checked."},"notify":{"enum":["practice","platform_only","webhook_only"],"description":"Optional. Who gets this follow-up's emails: practice (default) sends them to email; platform_only sends every email (payment confirmation, missing documents, document requests and reminders, roster changes, the Monday status email, stopped applications) only to notify_email, your platform's address, marked with the practice it is about, and never to email; webhook_only sends no email at all (webhook_url is required) and status reaches you by the webhook and GET /v1/payer-follow-ups/{id}."},"notify_email":{"type":["string","null"],"description":"platform_only: where every email goes."},"webhook":{"type":["object","null"],"required":["url","updated_at"],"description":"The status webhook: its address and when it was last set, or null when none is set. Never the signing secret.","properties":{"url":{"type":"string"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"clinician_tasks":{"type":"array","description":"Application bundle: the steps only a clinician can do for the applications we write (for example attesting the CAQH profile, or signing in a payer's own system). We text and email the clinician a link with each step, what to tap and its deadline, remind them, and mark a step done only once we have confirmed it. Empty otherwise.","items":{"type":"object","required":["id","npi","clinician","kind","title","status","words","due_at","applications","contact_needed"],"properties":{"id":{"type":"string","format":"uuid"},"npi":{"type":"string"},"clinician":{"type":["string","null"]},"kind":{"enum":["caqh_id","caqh_attest","ia_surrogacy","pecos_sign","tmhp_sign","pave_sign","nygov_account","emedny_submit","promise_sign","flmmis_fingerprints","payer_contract"]},"title":{"type":"string","description":"The step in the clinician's words."},"status":{"enum":["upcoming","to_do","said_done","done"],"description":"upcoming: we ask the clinician when it is time; to_do: asked and being reminded; said_done: the clinician says it is done and we are confirming it; done: confirmed."},"words":{"type":"string","description":"Where it stands, in plain words."},"due_at":{"type":["string","null"],"format":"date-time"},"asked_at":{"type":["string","null"],"format":"date-time"},"last_reminded_at":{"type":["string","null"],"format":"date-time"},"reminders":{"type":"integer"},"said_done_at":{"type":["string","null"],"format":"date-time"},"done_at":{"type":["string","null"],"format":"date-time"},"applications":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"payer":{"type":"string"},"state":{"type":"string"}}}},"contact_needed":{"type":"boolean","description":"true: we cannot reach this clinician; add their mobile number or email with POST /v1/payer-follow-ups/{id}/signers."}}}},"next":{"type":"string","description":"What happens next, in one sentence."},"authorized_by":{"enum":["token","session","ops","firm","firm_session"],"description":"What opened this read: token (the access token sent) or session (signed in with the follow-up's email). firm: the access token of the credentialing firm it is run for, read only."}}}},"securitySchemes":{"PayerFollowUpToken":{"type":"apiKey","in":"header","name":"X-Payer-Follow-Up-Token","description":"The follow-up's access_token, returned once by POST /v1/payer-follow-ups. It opens that follow-up only. GET calls also take it as ?token= (the links in our emails carry one). A session signed in on licium.ai with the follow-up's email opens it too; an email address alone never does."},"PayerFollowUpBearer":{"type":"http","scheme":"bearer","description":"The same access_token as Authorization: Bearer <access_token>."}}}}