Resources
Changelog
Every version of API v1 and of the TypeScript SDK, newest first. Changes that tighten behaviour are marked as a behaviour change.
API v1
1.29.0
- AddedGET /content: every block of a page carries
style.tone, the surface the section stands on:base,soft,contrastorbrand. The clinic's own site alternatesbaseandsoftdown the page unless the clinic chose a tone for a section; the colours of a tone follow from the theme tokens.getContent - AddedNew block
contact.v1: the clinic's address with the way in, phone, e-mail and opening hours (days with the same hours in one row), with a map (variant: map) or without (columns). It arrives filled from the clinic's data unlessfromClinicis false.getContent - ChangedGET /content: a sub-page's
nav.v1andfooter.v1withfromHome: truearrive with the home page's content, so a site has one menu bar and one footer; without the flag they are the page's own, as before.getContent
- AddedGET /content: every block of a page carries
1.28.1
- ChangedGET /process: the value of
setupHrefnames the panel screen that sets the action today: for an SMS, Kanały wiadomości while it waits for the clinic's SMS account (needs_setup, itsstateReasonsays the same), otherwise Powiadomienia, where it is switched on; Rezerwacja online for a booking rule. Same fields, same types; the old addresses still lead there.getProcess
- ChangedGET /process: the value of
1.28.0
- AddedGET /redirects: the old addresses the clinic's site serves now and where each leads, chains flattened. A sub-page whose address changes in the clinic's panel leaves one behind, so a frontend of its own can answer the old address instead of a 404.listRedirects
- AddedGET /pages items of type
pagecarryseoTitleandseoDescription, the title and description for search engines as the clinic set them.listPages
1.27.0
- AddedBlock props
team-grid.v1fromTeamandpricing.v1/services-grid.v1fromServices: the section takes its people or treatments from the clinic's data when it is shown. GET /content and thebodyBlocksof a treatment, a case study and a post answer such a section filled (members,items: at least one, as before), so a frontend that does not know the new props draws what the clinic's site draws; a section with nothing to show is not in the list.getContentgetServicegetCaseStudygetPost
- AddedBlock props
1.26.2
- ChangedThe clinic's panel has a trash: a treatment, a team member, a case study, a post or a page moved to it is in no list and its address answers 404, as for an unpublished one; a restore brings it back under the same address, and when its time in the trash is over it is deleted for good. No shape changes.listPageslistServicesgetServicelistDoctorsgetDoctorlistCaseStudiesgetCaseStudylistPostsgetPost
1.26.1
- Changed
ConversationMessage.statusqueued: a reply from the clinic's panel held on the server for a few seconds before it leaves. It may still vanish from the conversation when the person takes it back, and a message taken back is in no answer of the API. A message sent through the API is never held. No new enum value.listMessagessendMessage
- Changed
1.26.0
- Added
SiteProfile.vocabulary: the word family of the clinic's site on the platform,medical(dental and medical practices),optical(an optician's shop),vetorbusiness(any other business that is not a healthcare entity), so an own frontend uses the same words and schema.org types as the clinic's site.medicalis also the answer when the platform knows nothing about the business (no specialty or entity kind), so do not take it as a decision about the vertical.getSitegetContent
- Added
1.25.0
- AddedKey scope
case_studies:write: the clinic's own AI assistant, connected with the clinic's key, creates and edits case-study drafts only with it; listing the case studies needs no scope. Every key that existed on 2026-10-23 holds it, so nothing stops working; a clinic grants or takes it away in Ustawienia › Integracje › Klucz API. It is a new value ofConversationError.scope, which no conversation endpoint returns.
- AddedKey scope
1.24.0
- AddedGET /process: the clinic's patient process from the enquiry to the next visit, six steps with their actions (who, channels, timing, the SMS text or what an e-mail holds) and their state, read only. 403 with the code
feature_disableduntil the clinic has the patient process switched on.getProcess
- AddedGET /process: the clinic's patient process from the enquiry to the next visit, six steps with their actions (who, channels, timing, the SMS text or what an e-mail holds) and their state, read only. 403 with the code
1.23.1
- Behaviour change
pendingUntilof a pending visit never falls after itsstartAt: the clinic's confirmation window ends at the latest an hour before the visit (a visit booked closer than that still leaves at least 15 minutes, never past its start), and a payment window closes before the visit starts. A visit too close for an online payment (less than Stripe's minimum Checkout window before it) is booked without one, so it waits for the clinic's confirmation. Before, a 24-hour confirmation window could end after the visit itself.createAppointmentlistAppointments
- Behaviour change
1.23.0
- AddedBlock props of the patient's booking and forms on a phone:
booking.v1backLabel(the accessible name of the details step's back control),requestSubmitLabel(the button of a service the clinic confirms),addToCalendarLabelanddoneCloseLabel(the done screen), and the render-timetimeRequestoptions oflead-form.v1gainserviceSlug(the treatment the page is about) andnowMin(the clinic's clock at render, so a part of today that is over is not offered); both are injected by the clinic site, never stored.getContent - Changed
booking.v1confirmNotehas a new default wording (it no longer promises that nobody else takes the slot), and alead-form.v1withoutnoticePlacementshows the information clause under the send button; an explicitbefore-submitkeeps the old order.getContent
- AddedBlock props of the patient's booking and forms on a phone:
1.22.0
- AddedBlock props a treatment landing page uses:
feature-cards.v1variant: "list"(short sentences without icons),process-steps.v1note(a closing line under the steps),lead-form.v1noticePlacement(after-submit: the information clause under the send button), an in-pageanchoronprocess-steps.v1,lead-form.v1,booking.v1andcta-band.v1(the id the page's buttons scroll to),hero.v1media(image,videoorscene) withvideo(the clinic's film), andcase-study-teaser.v1collapsed(theresultspairs folded under a button) andfromCaseStudies.pairsOnly(only case studies whose before and after pair the patient consented to).getContent
- AddedBlock props a treatment landing page uses:
1.21.0
- AddedCase studies gain
resultsNote(the fixed note to show with every case study), and the detail gainsstory(the four-part description of the owner's wizard),pairs(every before and after pair the patient consented to; empty without that consent, and for a case study added before 1.20.0, whose library photos stay inbeforeandafter),sessionsCount,resultAfterDaysanddoctorSlug.listCaseStudiesgetCaseStudygetContent
- AddedCase studies gain
1.20.0
- Behaviour changeA case study's
image,beforeandaftercan carry a patient's photo added with consent, only when the patient agreed to show it on the clinic's site: theurlpoints to /api/case-study-photo/{id} (supports?w=and?f=, cached briefly). A case study added before 1.20.0 keeps its library image exactly as before until the patient refuses or withdraws; any other case study returns null without that consent.listCaseStudiesgetCaseStudygetContent - Behaviour changeA case study that needs the patient's consent leaves the list, the detail (404) and /content as soon as the consent is withdrawn, expires or no longer covers its photos or description.listCaseStudiesgetCaseStudygetContent
- Behaviour changeA case study's
1.19.0
- AddedA landing page's
blocks(GET /content) may carry the block typepopup-cta.v1: a window with a heading, a short text and a bar at the bottom of the screen that presents the page's one contact block (the form, the booking widget or the call band). It has no content of its own and never a second form; the contact block stays on the page, so a frontend that skips the type loses nothing.getContent
- AddedA landing page's
1.18.0
- AddedGET /conversations/{id} lists
mergedEnquiries: the enquiries of the leads the clinic merged into the conversation's lead (a form's message, the first chat message, a Lead Ads answer), oldest first, each with the merged lead's id,source,channelandcreatedAt. They are read from the merged leads while the merge lasts: after the clinic undoes a merge, its enquiry leaves the list and is that lead's ownlead.messageagain.getConversation
- AddedGET /conversations/{id} lists
1.17.0
- AddedNew refusal code
chat_disabled: the chat on the clinic's site is off, its window is gone, so the patient would not see a message there. GET /conversations/{id} shows it on thechatchannel, POST /conversations/{id}/messages answers 409 with it.getConversationsendMessage - Behaviour changeThe chat goes by the chat session on the patient's card, not by where the card came from: a card the clinic merged a chat card into can be answered in the chat (the patient's first chat question was the only message), the merged card no longer. With the chat off a chat message was stored as sent; now it is refused with
chat_disabledand nothing is stored.getConversationsendMessage
- AddedNew refusal code
1.16.0
- AddedA patient may have several numbers, e-mail addresses and Messenger or Instagram ids. GET /conversations/{id} lists them in
identities(channel, address,primary,verified,optedOut,replyDefault,lastInboundAt); POST /conversations/{id}/messages takes an optionalto, one of those addresses. Withouttoa message goes to the address the patient last wrote from on that channel. An SMS STOP opts out that number only. New refusal codesaddress_requiredandaddress_unknown.getConversationsendMessage
- AddedA patient may have several numbers, e-mail addresses and Messenger or Instagram ids. GET /conversations/{id} lists them in
1.15.0
- AddedMessenger, the clinic's Facebook Page, is a conversation channel:
messengerinchannel(filters, messages, channel states, POST /conversations/{id}/messages). A message goes out while the patient wrote on Messenger in the last 24 hours; new refusal codesfb_not_configured,fb_no_user_threadandfb_window_closed.listConversationsgetConversationlistMessagessendMessage
- AddedMessenger, the clinic's Facebook Page, is a conversation channel:
1.14.0
- AddedConversations with patients: GET /conversations (filters
status,location,channel,updated_since, cursor paging), GET /conversations/{id} (with the channels a message can go out on now and the clinic's reply templates), GET /conversations/{id}/messages and POST /conversations/{id}/messages, which sends by the rules of the clinic's inbox and answers 409 with the reason when they say no. A webhook event names a conversation or a message; read its content here.listConversationsgetConversationlistMessagessendMessage - AddedKey scopes: the clinic grants its key
conversations:readandconversations:writein Ustawienia › Integracje › Klucz API. Without them the conversation endpoints answer 403missing_scope; everything else a key could do stays as it was, with no scope.
- AddedConversations with patients: GET /conversations (filters
1.13.1
- Behaviour changeGET /booking/slots answers an empty list (and POST /booking/appointments a 409 with no slots) while the clinic says it keeps its visits in Google Calendar and has not connected it yet: busy times would be unknown. Ask for a time instead (POST /leads with
timeRequest).getSlotscreateAppointment
- Behaviour changeGET /booking/slots answers an empty list (and POST /booking/appointments a 409 with no slots) while the clinic says it keeps its visits in Google Calendar and has not connected it yet: busy times would be unknown. Ask for a time instead (POST /leads with
1.13.0
- AddedVisits the clinic confirms and online prepayments: every catalog service carries
bookingPolicy(instant,confirmorpay, already resolved) andprepay(amount in grosze, kind and a ready label, or null). POST /booking/appointments answersstatus(confirmedorpending),pendingUntilwhile the slot is held andpaymentUrl(the clinic's Stripe Checkout) when a prepayment is due. Services without a policy book exactly as before.getBookingCatalogcreateAppointment - Added
Appointment.statuscan bepending(waiting for the clinic's confirmation or the patient's payment), withpendingUntil.listAppointments - Added
SiteProfile.specialty: the clinic's specialty key (e.g.okulistyka), when one was chosen.getSitegetContent
- AddedVisits the clinic confirms and online prepayments: every catalog service carries
1.12.0
- AddedBooking by location: the catalog lists
locations(the ones someone works in) and each specialist'slocationIds; GET /booking/slots takeslocationand every slot carrieslocationId; POST /booking/appointments takeslocationId(a slot of another location answers 409). A clinic with one location answers one location and slots there.getBookingCataloggetSlotscreateAppointment
- AddedBooking by location: the catalog lists
1.11.0
- AddedLocations: GET /locations lists the clinic's active locations, the primary one first, each with its address, phone, e-mail, hours and NFZ. A clinic with one location answers one, with the values of the clinic profile.listLocations
1.10.0
- AddedAd landing pages: every item of GET /pages carries
kind(page,landingorthanks), and the optional?kind=lists ad landing pages (landing), their thank-you pages (thanks) or everything (all). Without the parameter the list is what it was: the site's pages and entity pages.listPages
- AddedAd landing pages: every item of GET /pages carries
1.9.1
- ChangedThe served OpenAPI document gains an operationId per operation (the SDK method names), six tags, English descriptions for every operation, parameter, response and property, recorded examples for every response, and
x-pp-sinceon operations, schemas and newer fields. No endpoint, field or type changed. - Fixed
MediaItem.createdAtis documented: GET /media has sent it since 1.2.0.listMedia - Deprecated
MediaItem.r2Keyis an internal storage key. It stays in the response; build addresses fromurl.listMediauploadMedia
- ChangedThe served OpenAPI document gains an operationId per operation (the SDK method names), six tags, English descriptions for every operation, parameter, response and property, recorded examples for every response, and
1.9.0
- AddedRequest a time: an optional
timeRequest(1 to 3 preferred windows, a treatment and optionally a doctor) on POST /leads, echoed asLeadCreated.timeRequest. An invalid one keeps the lead and adds the warninginvalid_time_request; with?strict=1it is a 400 with that code.createLead
- AddedRequest a time: an optional
1.8.1
- Behaviour change
BookingCatalogService.priceLabelis the booking service's own price first, then the linked treatment'spriceFromLabel. Before, the treatment's price won, so a consultation linked to orthodontics showed the orthodontics price instead of its own.getBookingCatalog
- Behaviour change
1.8.0
- Added
BookingCatalogService.nfz: services under the public health fund (NFZ) are listed for information and booked by phone only.getBookingCatalog - Behaviour changeA service the clinic marks as NFZ answers 400 with the code
nfz_phone_onlyon GET /booking/slots and POST /booking/appointments; nothing is stored.getSlotscreateAppointment
- Added
1.7.0
- AddedGET /privacy: the clinic's privacy policy and the information clause for its forms, with a version to send back.getPrivacy
- AddedOptional
privacyNoticeVersionandmarketingConsenton POST /leads and POST /booking/appointments;SiteProfile.privacy.createLeadcreateAppointmentgetSite
1.6.3
- ChangedEvery booking sends reception a "Nowa wizyta" e-mail with an .ics file; a lead created by a booking no longer sends a second e-mail of its own. The response is unchanged.createAppointment
1.6.2
- Fixed
Site.noindex: keep robots.txt open (Allow: /, no Sitemap line) so crawlers can see the noindex and drop pages they indexed before. The description used to recommendDisallow: /.getSitegetContent
- Fixed
1.6.1
- Behaviour changePOST /media refuses SVG files with 415. SVG files uploaded before are still served, with a sandboxing Content-Security-Policy header.uploadMedia
1.6.0
- AddedPOST /feedback: remarks about the clinic's site or the API for the platform team, with personal data removed before storing and 20 remarks per hour per clinic and source.sendFeedback
1.5.0
- Added
Site.noindex: the clinic keeps its site out of search engines, and your frontend follows.getSitegetContent
- Added
1.4.0
- AddedGET /site and
Site.profile: contact, address, map point, opening hours, NFZ, payments, social links, logos and registry numbers.getSitegetContent - AddedImage variants of library files (
?w=on a fixed width ladder,f=auto, avif or webp) andwidth,height,aiGeneratedandcaptionon MediaRef and MediaItem;captionandaiGeneratedon POST /media.uploadMedialistMedia
- AddedGET /site and
1.3.0
- AddedGET /booking/catalog, and
bookingServiceIdon treatments andbookingResourceIdon team members to link pages to booking.getBookingCataloglistServicesgetServicelistDoctorsgetDoctor - AddedRateLimit-Limit, RateLimit-Remaining and RateLimit-Reset on every response to a valid key;
codeon errors that have one. - AddedPOST /leads answers
warnings: ["missing_contact"]for a lead without a phone or e-mail, and rejects it with?strict=1.createLead - FixedPOST /leads answers 400
invalid_jsonorinvalid_bodyfor a body that is not a JSON object, instead of failing.createLead
- AddedGET /booking/catalog, and
1.2.0
- AddedBooking: free slots, booking an appointment (409 with fresh slots when it was taken) and the appointment list.getSlotscreateAppointmentlistAppointments
- AddedThe media library: upload an image and list the files.uploadMedialistMedia
1.1.0
- AddedTreatments, team members, case studies and posts, each with a list and a detail endpoint; the page of GET /content told apart by
kind; a schema for every response.listServicesgetServicelistDoctorsgetDoctorlistCaseStudiesgetCaseStudylistPostsgetPostgetContent
- AddedTreatments, team members, case studies and posts, each with a list and a detail endpoint; the page of GET /content told apart by
1.0.0
- AddedThe first public API: a page with its site, the published paths and creating a lead, with a secret Bearer key and 120 requests per minute.getContentlistPagescreateLead
SDK
0.28.0
for API 1.29.0- AddedA page's blocks are typed with
style?: { tone? }(SectionTone), and the block union gainscontact.v1(API 1.29.0). No change in the client's methods.
- AddedA page's blocks are typed with
0.27.1
for API 1.28.1- ChangedNo change in the client:
getProcess()returns the new values ofsetupHrefandstateReason(API 1.28.1).
- ChangedNo change in the client:
0.27.0
for API 1.28.0- Added
listRedirects()and the typeRedirectRule: the old addresses the clinic's site serves now.PageListItemgainsseoTitleandseoDescription.
- Added
0.26.0
for API 1.27.0- AddedBlock prop types of API 1.27.0:
TeamGridV1PropsfromTeam,PricingV1PropsandServicesGridV1PropsfromServices. A section with them comes filled inmembersanditems.
- AddedBlock prop types of API 1.27.0:
0.25.2
for API 1.26.2- ChangedFollows API 1.26.2: a treatment, a team member, a case study, a post or a page the clinic moved to its panel's trash is in no list and answers 404 until restored. No type changes.
0.25.1
for API 1.26.1- ChangedThe doc comment of
MessageStatusfollows API 1.26.1:queuedis a reply from the clinic's panel held on the server for a few seconds, which may still vanish when the person takes it back. No type changes.
- ChangedThe doc comment of
0.25.0
for API 1.26.0- Added
SiteProfile.vocabularyand the constantVOCABULARY_FAMILIESwith its typeVocabularyFamily(API 1.26.0).
- Added
0.24.0
for API 1.25.0- Added
ApiKeyScopegainscase_studies:write(API 1.25.0), the scope the clinic's AI assistant needs for case-study drafts.
- Added
0.23.0
for API 1.24.0- Added
getProcess()and the typesPatientProcess,ProcessStep,ProcessAction,ProcessTiming,ProcessInfoandProcessError(API 1.24.0).
- Added
0.22.1
for API 1.23.1- ChangedThe doc comments of
pendingUntil(AppointmentCreated,Appointment) follow API 1.23.1: never later than the visit'sstartAt. No type changes.
- ChangedThe doc comments of
0.22.0
for API 1.23.0- AddedBlock prop types of API 1.23.0:
BookingV1PropsbackLabel,requestSubmitLabel,addToCalendarLabelanddoneCloseLabel;TimeRequestOptionsserviceSlugandnowMin.
- AddedBlock prop types of API 1.23.0:
0.21.0
for API 1.22.0- AddedBlock prop types of API 1.22.0:
FeatureCardsV1Propsvariant: "list",ProcessStepsV1Propsnoteandanchor,LeadFormV1PropsnoticePlacementandanchor,BookingV1Props/CtaBandV1Propsanchor,HeroV1Propsmediaandvideo,CaseStudyTeaserV1PropscollapsedandfromCaseStudies.pairsOnly.
- AddedBlock prop types of API 1.22.0:
0.20.0
for API 1.21.0- Added
CaseStudySummary.resultsNote;CaseStudyDetailgainsresultsNote,story(CaseStudyStory),pairs(CaseStudyPair),sessionsCount,resultAfterDaysanddoctorSlug.
- Added
0.19.0
for API 1.20.0- ChangedNo type changes. A case study's
image,beforeandaftercarry a patient's photo added with consent (a/api/case-study-photo/{id}URL) only under the patient's consent; a case study added before API 1.20.0 keeps its library image until the patient refuses or withdraws.
- ChangedNo type changes. A case study's
0.18.0
for API 1.19.0- Added
PopupCtaV1Props(the props ofpopup-cta.v1) andLANDER_CTA_ANCHOR, the id of a landing page's contact block that the popup and the page's buttons point to.
- Added
0.17.0
for API 1.18.0- Added
ConversationDetailgainsmergedEnquiries(ConversationMergedEnquiry): the enquiries of the leads merged into the conversation's lead.
- Added
0.16.0
for API 1.17.0- Added
SendRefusalCodegainschat_disabled(the chat on the clinic's site is off).
- Added
0.15.0
for API 1.16.0- Added
ConversationDetailgainsidentities(ConversationIdentity),SendMessageInputgainsto;SendRefusalCodegainsaddress_requiredandaddress_unknown.
- Added
0.14.0
for API 1.15.0- Added
ConversationChannelgainsmessenger;SendRefusalCodegainsfb_not_configured,fb_no_user_threadandfb_window_closed.
- Added
0.13.0
for API 1.14.0- Added
listConversations(),getConversation(),listMessages()andsendMessage()with their types (Conversation,ConversationMessage,SendMessageInput,SendRefusalCode…), andisSendRefused()for the 409 of a refused send.
- Added
0.12.0
for API 1.13.1- Added
BookingCatalogService.bookingPolicyandprepay(BookingPrepay),appointment.status,pendingUntilandpaymentUrlfromcreateAppointment(),pendinginAppointmentStatus,SiteProfile.specialty.
- Added
0.11.0
for API 1.12.0- Added
getSlots({ locationId }),AppointmentInput.locationId,BookingCatalog.locationsandBookingCatalogResource.locationIds.
- Added
0.10.0
for API 1.11.0- Added
listLocations()and theLocationtype.
- Added
0.9.0
for API 1.10.0- Added
listPages({ kind })lists ad landing pages, their thank-you pages or everything;PageListItem.kindand thePageListKindtype.
- Added
0.8.1
for API 1.9.1- Added
MediaItem.createdAtis typed.
- Added
0.8.0
for API 1.9.0- Added
createLead({ …, timeRequest })andLeadCreated.timeRequest;TIME_OF_DAYandwindowFromPartbuild windows from the parts of the day the clinic's form offers.
- Added
0.7.2
for API 1.8.1- ChangedDocuments the new
priceLabelorder; types unchanged.
- ChangedDocuments the new
0.7.1
for API 1.8.0- Added
BookingCatalogService.nfz;getSlotsandcreateAppointmentthrow ApiError withcode: "nfz_phone_only"for an NFZ service.
- Added
0.7.0
for API 1.7.0- Added
getPrivacy();privacyNoticeVersionandmarketingConsentoncreateLeadandcreateAppointment;SiteProfile.privacy.
- Added
0.6.0
for API 1.6.0- Added
sendFeedback().
- Added
0.5.1
for API 1.5.0- Added
Site.noindex.
- Added
0.5.0
for API 1.4.0- Added
getSite()andSite.profile; media fields;uploadMedia(file, { caption, aiGenerated });mediaVariantUrl,mediaSrcSet,phoneHref,WEEKDAYSandSCHEMA_ORG_DAYS.
- Added
0.4.1
for API 1.3.0- FixedThe tarball installs on its own (types inlined, no dependency outside the public registry).
- Added
createLead(lead, { strict })andLeadCreated.warnings.
0.4.0
for API 1.3.0- Behaviour change
baseUrlis required: there is no default, so a test frontend never talks to production by accident. - AddedNon-2xx answers throw
ApiError(SlotTakenErrorfor a taken slot, with freshslots); booking and media methods; ESM and CommonJS builds.
- Behaviour change
0.3.0
for API 1.3.0- Added
getBookingCatalog(),bookingServiceIdandbookingResourceId.
- Added
0.2.0
for API 1.1.0- AddedThe eight entity methods;
SiteContent.pageis theContentPageunion.
- AddedThe eight entity methods;
0.1.0
for API 1.0.0- Added
getContent,listPagesandcreateLead.
- Added