Changelog and versioning
The Developer Platform is path-versioned. Every URL starts with /v1.
A new major version only ships when a change cannot be made additively.
Guarantees inside /v1
- New fields and endpoints may be added at any time. Your integration must ignore unknown fields.
- Existing fields will not change type or meaning.
- Enum values will only be added, never removed inside
v1. New values may appear at any time - handle unknown values gracefully. - Deprecations are announced in advance in this changelog and on the relevant reference page.
Webhook versioning
The webhook envelope carries an api_version field (currently "v1").
The same additive rules apply to webhook payloads. If Carebit introduces
another version, endpoint-level version selection and migration guidance
will be added before that version is available.
Change log
15 October 2026
- You can use AI agents as part of a private integration that your organisation deploys, controls and operates. Do not give custom-integration credentials to third-party products.
- Carebit does not email organisation staff when a PatientConnectionRequest
is created. The
202payload includeslinks.dashboard, which opens the Patient connection requests list in Carebit. Send that URL if you want someone to review pending requests.
6 October 2026
- Transmission objects include an embedded
message_templatewhen Carebit can resolve the MessageTemplate from the Workflow or Booking that sent the Transmission. Recipient (to), date sent (sent_at), and deliverystatuswere already on the object.
25 September 2026
- A Patient created with an email address gets a Patient Portal account for
that email. Carebit does not send the portal welcome email. Adding an
email later with
PATCH /v1/patients/{id}does the same when the Patient does not already have a portal account. - Letters, BookingForms, Photos, and TestResults accept
assigned_staff_member_id,created_at, andsent_aton create. Photos and BookingForms also accept them on update. Responses includeassigned_staff_memberandsent_at. Settingsent_atmarks the document complete. Omitcreated_atto use the current time. GET /v1/transmissionsacceptspatient_id,document_id,invoice_id,quote_id,booking_id,digital_form_response_id, andresource_type. Supply at least one. Apatient_idfilter with no other filter returns every Transmission for that Patient.resource_type=digital_form_responsestill limits the list to DigitalFormResponse emails.POST /v1/bookingsandPATCH /v1/bookings/{id}acceptnotify_patient. Omit it to keep the default, which istrue. Confirmation, update, and cancellation emails use this value once the Booking is confirmed.
24 September 2026
- An unconnected match from
POST /v1/patientsalways creates a PatientConnectionRequest and returns202. Carebit never connects it as part of the create call, even when a supplied contact field agrees. The previous409 patient_match_requires_reviewresponse is no longer used. GET /v1/patient_connection_requestsandGET /v1/patient_connection_requests/{id}list and retrieve those requests. Requirespatients.read. Pending payloads omitpatient_idand expose only the strongest candidate. Only matching demographic field names are disclosed; contact and NHS number classifications remain private.- Any project in the organisation can use
POST /v1/patient_connection_requests/{id}/actionswithconnect_existing_patient,create_new_patient, ordeny. If you are ready to connect the recommended Patient immediately, POSTconnect_existing_patient; Carebit connects the strongest current recommendation. Acting usespatients.create; there is no separate grant scope. - Webhook events
patient_connection_request.created,patient_connection_request.granted,patient_connection_request.denied, andpatient_connection_request.expiredare required system events. Carebit always delivers them to every enabled webhook endpoint on the project that created the request. Other projects do not receive them. You do not subscribe to them, and they do not appear in the subscription picker. Connecting an existing candidate or creating a separate Patient also emitspatient_connection.created. - See Creating and connecting Patients.
22 September 2026
GET /v1/lead_form_responseslists the forms a Lead submitted, newest first. Requiresleads.readand Carebit Pro.lead_idis required. Lost Leads are included. Enquiries a staff member recorded by hand are not returned, because they have no form.GET /v1/lead_form_responses/{id}returns one submission with its questions and answers, the referral data captured with it, and its marketing attribution intracking. Match answers onfield_namerather than onlabel, which an Organization can reword at any time. Amultiselectquestion returns its selected option values invaluesand null invalue. Layout blocks, hidden fields, and the form's bot trap are omitted. A file upload question is omitted too; the uploaded files appear in the Lead'sattachments.- Lead objects include
form_responses, a summary of each submission, oldest first, with aurlto the full response. Lead objects also includereferred_by_clinician_idandreferred_by_organization_id, taken from the Lead's first submission that identified one. Per-submission values are on the LeadFormResponse. - Webhook event
lead.form_response_submittedfires for every submission, including the one that creates the Lead. A repeat submission from someone already in the pipeline emits only this event, because reusing an existing Lead does not change it and so does not emitlead.updated. POST /v1/patientsandPATCH /v1/patients/{id}acceptnhs_number. Send a 10-digit NHS number without spaces or other formatting. The number must pass the NHS check digit. Set it tonullto clear it.
21 September 2026
POST /v1/quotescreates a draft Quote. Requiresquotes.create. Supplypatient_idfor a Patient Quote, or omit it and supplyalternative_payor_idto quote another organisation. Supplybooking_idsto generate line items from Bookings, orline_itemswithtitleandunit_pricein minor currency units. Bookings require a Patient. Sending, accepting, and converting remain in the Carebit staff and Patient Portal interfaces.- Webhook events
quote.createdandquote.acceptedare now available.quote.createdfires when a Quote is first persisted.quote.acceptedfires after acceptance creates the linked Invoice. The accepted Quote object includesinvoice_idandlinks.invoice. GET /v1/invoices/{id}returns one Invoice. Requiresinvoices.read. Use this to follow Invoice links on Quote objects.
18 September 2026
GET /v1/patients/{id}/payment_methodslists stored card PaymentMethods for a connected Patient. Requirespayment_methods.read. Only PaymentMethods that the Organization has ResourcePermissions to access are returned. Expired cards are included and marked withis_expired.POST /v1/paymentscreates a card Payment for a connected Patient. Requirespayments.create. Supplyamountin minor currency units andpayment_method_type. Supplypayment_method_idto charge a specific stored card from the Patient's PaymentMethods list. Whenpayment_method_idis omitted, Carebit charges the Patient's default stored card. If the Patient has no stored card, the request fails. Send the Patient topatient_portal_add_payment_method_urlon the Patient object so they can add a card in the Patient Portal. If Stripe requires extra authentication, Carebit emails the Patient a Patient Portal link to complete it. Other payment method types are not accepted.- Payment objects include
payment_method_idwhen a stored card was charged. - Patient objects include
patient_portal_add_payment_method_url. This is the Patient Portal URL where the Patient can add a stored card PaymentMethod for the Organization. Use this URL to collect a card before callingPOST /v1/payments. POST /v1/payments/{id}/refundscreates a Refund against a card Payment. Requiresrefunds.create. Supplyamountin minor currency units andreason. Carebit returns the funds to the original card through Stripe. The Refund starts asprocessing. Other payment method types are not accepted.- Webhook event
refund.failedfires when Stripe rejects a card or Klarna Refund to the original payment method. The Refund object includeserrorandnext_steps. Carebit does not retry the Refund automatically. Refund objects also includenext_stepson list payloads when a Refund has failed in this way. - Invoice objects include
payment_url. This is the Patient Portal URL where the Patient can pay the Invoice. The value is null when the Invoice has noinvoice_number. Webhook eventsinvoice.finalized,invoice.sent, andinvoice.settledcarry the same Invoice object.
16 September 2026
- Patient objects include
patient_number. This is the clinic-specific identifier from this Organization's PatientConnection. It is read-only. The value is null when numbering is disabled or no number has been assigned. - Webhook events
invoice.finalized,invoice.sent,invoice.settled, andpayment.paidare now available.invoice.finalizedfires when an Invoice leaves draft.invoice.sentfires when a send record is created for the Invoice.invoice.settledfires the first time the Invoice has no outstanding balance.payment.paidfires when a Payment is recorded as paid. POST /v1/invoicescreates a self-pay Invoice for a connected Patient. Requiresinvoices.create. Supplyline_itemswithtitleandunit_pricein minor currency units. Settax_rate_idon a line item to apply a TaxRate from the Organization.payor_typemust bepatient. Automated billing and insurance-submission attributes are not accepted.
15 September 2026
GET /v1/patients/{patient_id}/connectionslists PatientConnections this Organization already has ResourcePermissions for (unlocked connections). Locked connections, including a GP that has not been unlocked in Carebit, are omitted. Create and update usepatient_connections.createandpatient_connections.update. Create connects the Patient to an existing Organization, such as a GP practice. If the Patient is already connected, Carebit returns that PatientConnection and grants this Organization access. This does not create Organizations. Update may change only this Organization's PatientConnection, not an unlocked GP or other Organization's connection.GET /v1/organizationssearches active Organizations bynameorpostcode. Optionally filter withorganization_type, for examplegp_practice. At least one ofnameorpostcodeis required. Requiresorganization.search. Email, subdomain, phone, currency, and time_zone are null so a search cannot harvest contact details. Creating Organizations through the API is not permitted.POST /v1/patients/{patient_id}/payorsacceptsset_as_default_payor. Whentrue, Carebit creates the Payor and selects it on this Organization's PatientConnection in the same request.
13 September 2026
GET /v1/tokenconfirms the current access token and returns the Organization, project, granted scopes, and expiry. Any valid token can call it. It does not requireorganization.read. The response does not include the token secret.GET /v1/invoicesno longer requiresbooking_idorpatient_id. Those filters remain optional.GET /v1/paymentslists Payments. Filter optionally bypatient_idand bypaid_at_from/paid_at_to. Each Payment includesinternal_notes,invoice_id,patient_id, and nestedrefunds. Requirespayments.read.- Lead objects include
internal_notes,referral_notes, andreferral_source. These fields are writable on create and update so an API-created enquiry can match one entered in Carebit.internal_notesis the Notes box next to presenting problem.referral_sourceuses the same values as the Carebit referral source list, such asgp_practiceorwebsite.
12 September 2026
- Diary Booking lists accept a
start_timewindow of up to 30 days (90 days when filtering bypatient_id). GET /v1/bookingsno longer requiresstart_time_fromandstart_time_towhenstatusis a recall status (awaiting_recall,overdue_for_recall,recall_expired, orrecall_canceled). Those lists are ordered byrecall_due_date.did_not_attendand other diary queries still require the date window.- Booking objects include
recall_due_date. - Lists are available at
/v1/lists, including create, update, and delete. Membership is nested at/v1/lists/{list_id}/members. Add a member withmember_typeandmember_id; currentlymember_typeaccepts onlypatient. Nested List objects onlist.member_addedandlist.member_removednow match the List resource, including timestamps, notes, color, Clinician, and links. POST /v1/bookings/{id}/cancellationscancels a Booking. It requiresbookings.cancel, which is independent ofbookings.update.cancellation_reasonis required when the Organization requires cancellation reasons. API cancellations usecancellation_sourceapiand automatically apply attendance penalty invoices, except when the Booking was awaiting payment. Booking objects includecanceled_at,cancellation_reason,cancellation_information, andcancellation_source.refund.createdis emitted when a Refund is created.
Entries appear here as the platform grows. The published OpenAPI
document at /openapi.json is the source of truth for the current
surface.