Changelog
Every API change is listed here with version and date. Breaking changes only ship as a new path version with at least twelve months notice.
v1.411.0 · November 10, 2026
- New: attendance reports for a selection.
learning.createAttendanceReportacceptscontactListId(a class; its members who are participants count) orcontactIds(1 to 500 participants), not both; without either, all participants as before. PDF and CSV name only those selected. Two reports in force may not overlap only for the same person (409period-overlaps), andattendance-finalizedapplies only to the people in the report. If nobody in the selection is a participant:no-participants. Every report carriesselection(course,contactList,contacts),contactListIdandcontactIds.
v1.410.0 · November 10, 2026
- New: events
learning.attendance.minimumAtRisk(a course's minimum attendance can only be reached by attending all remaining sessions) andlearning.attendance.minimumUnreachable(it can no longer be reached), once per stage, course and contact, checked daily, only for your organization's courses. Payload contains only IDs and numbers:courseId,sharedCourseId(null),contactId,attendedCount,pastCount,totalCount,requiredCount,minimumPercent; the same calculation asstatusinlearning.getCourseAttendance.
v1.409.0 · November 10, 2026
- New: finalised attendance reports.
learning.createAttendanceReport(POST /learning/courses/{id}/attendance-reports) freezes a course's list for a period (from,to, calendar days inclusive) or, without them, for the whole course, and issues a PDF with verification code (document); every dated session in the period must be over (409sessions-pending), at least one must fall into it (no-sessions), and no report in force may share a day (409period-overlaps).learning.listAttendanceReports,learning.getAttendanceReport(with frozensessionsanddata),learning.getAttendanceReportCsvandlearning.cancelAttendanceReport(also cancels the PDF). Entries for sessions of a report in force are rejected bylearning.createAttendanceEntryandlearning.revokeAttendanceEntrywith409attendance-finalized. While reports are not enabled in an environment, finalising returnsfeature-not-availablewithreason: "attendance-reports-disabled".
v1.408.0 · November 10, 2026
- New: attendance list of a class.
learning.getContactListAttendance(GET /contact-lists/{id}/learning-attendance) returns, per current class member and appointment lesson of all courses the class has through an access, the same cells aslearning.getCourseAttendance, plus attended andstatusper course and attended and rate across all courses. Every session carriescourseIdandsharedCourseId(nullfor your own courses); a member without a grant of a course hasnotParticipant: trueand no cells there.learning.getContactListAttendanceCsvreturns the same list as CSV. Read-only; entries and reports are per course.
v1.407.0 · November 10, 2026
- New: manage finder profiles.
finder.listProfiles(GET /finder/profiles) returns all practitioner profiles of the organization in every state, filterable bystatusandcontactId; the public view staysGET /finder/practitioners.finder.deleteProfile(DELETE /finder/profiles/{id}, scopefinder:write) permanently deletes an archived profile together with its enquiries, review rounds, certificates and locations and says in the response how many there were; a profile in any other state returns409 conflictwithreason: "profile-not-archived". - Changed:
contacts.merge(POST /contacts/{id}/merge) no longer fails because of an archived finder profile. It is deleted during the merge, together with its enquiries, review rounds, certificates and locations; at most one profile remains (the one that is not archived, otherwise the survivor's, otherwise the most recently changed).409withpractitioner-profiles-on-multiplenow only comes when two profiles that are not archived would meet.
v1.406.0 · November 9, 2026
- New: attendance entries.
learning.createAttendanceEntryadds “on site” (onSite, counts as attended and completes the lesson) or “excused” (excused) with a reason to an appointment lesson; at most one per participant and lesson (409already-recorded).learning.revokeAttendanceEntryrevokes it and returns it withrevokedAt. Every cell of the attendance list carriesentry. The list, its CSV and the entries also accept thecourseIdof a shared course (learning.listSharedCourses) as{id}, without the provider's appointment. While entries are not enabled in an environment, adding one returnsfeature-not-availablewithreason: "attendance-entries-disabled".
v1.405.0 · November 9, 2026
- New: attendance list of a course.
learning.getCourseAttendancereturns, per participant and appointment lesson, minutes and share within the appointment (measured in the live room, only the time from start to end),measurement(upcoming,measured,absent,notMeasured,cancelled), attended, rate andstatusagainst the completion's minimum attendance (onTrack,atRisk,unreachable);learning.getCourseAttendanceCsvreturns the same list as CSV. Only for your organization's courses; a shared course still returnsnot-found(comes with the manual entries). - Changed: an appointment lesson counts as attended only if the person was in the live room during the appointment (only the time from start to end), not merely in the open room before or after. This affects the lesson state in
learning.getCourseParticipantright away, andcompletedCountinlearning.getCourseProgress,learning.listCompletionsand thelearning.course.completedevent once completion depends on appointment lessons. Lessons already recorded stay completed; the rule applies from the next recording on.
v1.404.0 · November 9, 2026
- New: resend invoices that were released but not sent.
POST /invoices/plan-runs/resend(body likerelease,runId) andPOST /invoices/resend-released(ids, 1 to 200) send only invoices that are released but not yet sent, with 200 and{ sent, notSent, notSentInvoices, skipped }:notSentas in the release (reason → count),notSentInvoicesper invoice withid,numberandreason(key of the dispatch logic),skippedfor ids without such an invoice. ORG_ADMIN only. New onGET /invoices/plan-runs:releasedNotSentper run. - Changed:
GET /invoices/plan-runsalso lists a run whenwaitingis 0 andreleasedNotSentis greater than 0. Automatically sent invoices (subscription follow-ups, release of submitted and plan invoices, initial collection) areSENTafter sending and emitinvoices.invoice.sent, like sending withPOST /invoices/{id}/send; previously they stayedISSUEDwithout an event.
v1.403.0 · November 9, 2026
- New: payment terms for many contacts.
POST /contacts/billing-defaults/update(scopecontacts:write) sets the default payment terms oncontactIds(1 to 500) or on all matches of afilterwith the fields ofGET /contacts(q,type,tag,responsible,directDebitMandate), exactly one of the two;paymentTermId: nullremoves their own. Response{ matched, unchanged, overwritten, updated }with 200.POST /contacts/billing-defaults/update/preview(scopecontacts:read) counts with the same body without changing anything,{ matched, unchanged, overwritten }. More than 5,000 matches: 422precondition-failed,reason: too-many-contacts, withmatched. Archived payment terms count as not found (404). LikePATCH /contacts/{id}/billing-defaults, the run emits no event. New onGET /contacts:directDebitMandate=valid|notValid, contacts with or without a valid SEPA direct debit mandate (status GUELTIG and not expired after 36 months without use).
v1.402.0 · November 7, 2026
- Changed: accesses, grants, classes on an access and accesses on an article now work with either right
LERN_BIBLIOTHEK(library) orLERN_KURSE(courses), as shown byGET /organization/entitlements; previously only withLERN_BIBLIOTHEK. Affected:learning.listAccesses,learning.createAccess,learning.updateAccess,learning.archiveAccess,learning.unarchiveAccess,learning.listGrants,learning.grantAccess,learning.revokeAccess,learning.revokeAccessOfContact,learning.getAccessContactLists,learning.setAccessContactLists,learning.getArticleAccesses,learning.setArticleAccesses. A collection in an access still needsLERN_BIBLIOTHEK, a course needsLERN_KURSE; creating an access with a collection AND a course needs both, otherwisefeature-not-available. Exception:learning.setAccessCollectionsandlearning.setAccessCourseswith an empty list work with either right. The automation actionslern-zugang-gewaehrenandlern-zugang-entziehencalllearning.grantAccessandlearning.revokeAccessOfContactand follow the same rule.
v1.401.0 · November 7, 2026
- New:
responsibleContactId(nullable) on the course (learning.getCourse,learning.listCourses,learning.updateCourse): a contact listed as a teacher who answers questions and submissions in the portal under “As teacher”. The two fields exclude each other; setting one clears the other. Both with a value at once givesinvalid_combination, a contact not listed as a teacher givesnot-foundatbody.responsibleContactId. - New:
feedback.contactId(nullable) on every round inlearning.getSubmission: the contact teacher if they gave the feedback in the portal;userIdis thennull.
v1.400.0 · November 7, 2026
- New:
sharedCourseId(nullable) on every submission (learning.listSubmissions,learning.getSubmission) and every completion (learning.listCompletions) and in the eventslearning.submission.submitted,learning.submission.reviewedandlearning.course.completed: the share if the course belongs to another organization (go straight tolearning.getSharedCourse),nullfor your own courses. - New:
certificateTemplateIdalso on every entry oflearning.listSharedCourses, not only inlearning.getSharedCourse.
v1.399.0 · November 7, 2026
- New:
learning.setSharedCourseCertificatesets your own certificate template for a shared course or removes it (null); participants who already completed without a certificate get it afterwards (issuedCount). PluscertificateTemplateIdonlearning.getSharedCourse. The providing organization's template does not apply to you. - Changed:
learning.listCourseParticipants,learning.getCourseParticipant,learning.completeParticipantLesson,learning.reopenParticipantLesson,learning.getCourseProgressandlearning.resetQuizAttemptsalso accept thecourseIdof a shared course (fromlearning.listSharedCourses); participants are your contacts with a grant through that share.learning.getCoursestill returns 404 for this ID. - Changed:
learning.listSubmissionsandlearning.listCompletionsalso return submissions and completions of shared courses; theircourseIdis the ID of the providing organization's course, and thecourseIdfilter applies to both. The same ID appears inlearning.submission.*andlearning.course.completed.
v1.398.0 · November 6, 2026
- New:
learning.releaseSharedCourseItemreleases an item (course,module,lesson) of a shared course for everyone who currently has it through an access, one “release now” intervention with a reason per person (releasedcounts them; 0 is not an error). PluswaitsForAppointmenton the course, every module and every lesson inlearning.getSharedCourse. - Changed: in shared courses, a condition “after an appointment” of the providing organization appears with you as
manual(neverafterAppointment). It is marked bywaitsForAppointmentinlearning.getSharedCourse; release it withlearning.releaseSharedCourseItemorlearning.createIntervention. - Changed:
learning.createInterventionnow also accepts the course, a module and a lesson of a shared course when the grant's access carries that share.
v1.397.0 · November 6, 2026
- New: courses other organizations have shared with your organization.
learning.listSharedCourses(withproviderName,createdAt,endedAt,active; ended shares while access is still running with you),learning.getSharedCourse(header and outline, read only, in the shape of your own courses) andlearning.setAccessSharedCourses.sharedCourseIdson every access and onlearning.createAccess. An ended share can't be newly added (422shared-course-ended); an unknown one is reported atbody.sharedCourseIds.
v1.396.0 · November 6, 2026
- New: share courses with other organizations, provider side.
learning.listCourseShareConnections(active course-sharing connections),learning.listCourseShares(shares of a course withparticipantCount, the number of participants with active access at the other organization, no names),learning.shareCourse(201,created) andlearning.endCourseShare(access already running there continues until it ends; already ended: 409already-ended). Administrators only. Errors: 404connection-unknown, 422connection-not-active,connection-revoked,connection-wrong-purpose,course-not-published. - Changed:
learning.archiveCourseends the course's shares with other organizations; access already running there continues until it ends. Restoring (learning.unarchiveCourse) does not reopen them.
v1.395.0 · November 6, 2026
- New on every collection (
learning.listCollections,learning.createCollection,learning.updateCollectionand every response carrying a collection):recommendation(“Related”, the same shape as on courses: another collection, a course or your own link), writable on create and update;nullremoves it, if the field is missing it stays. A collection cannot recommend itself (422 atrecommendation.collectionId).
v1.394.0 · November 6, 2026
- New on every course (
learning.*Course*):withoutLearningControl(“without learning control”: no questions to the teacher and no assignment lessons; quizzes and appointment lessons stay; defaultfalse), writable onlearning.createCourseandlearning.updateCourse. Switching it on while the course has assignment lessons (drafts included): 422precondition-failedwithassignments-present,lessonIds(at most 100) andassignmentCount. - Changed: In a course with
withoutLearningControl,learning.createLessonwithtype: "assignment"is refused (422precondition-failed,without-learning-control), and the course import doesn't create assignment lessons from the source or switch any to assignment; they are listed underkeptwithreason: "without-learning-control". Clients should treat unknown reasons inkeptgenerically.
v1.393.0 · November 6, 2026
- New on
learning.getAppointmentMaterialandlearning.updateAppointmentMaterial:recordingCollectionId(effective collection of the recording) and the overriderecordingCollectionOverride({ collectionId }ornull= as the appointment type; there is no “no collection” on the appointment, unknown: 422 atbody.recordingCollectionOverride.collectionIdwithnot-found). If the effective collection changes withoutrecordingFolderOverride, the appointment uses the appointment type's folder again. - New:
learning.addAppointmentRecordings(POST /appointments/{id}/learning-material/recordings) puts finished video recordings of the appointment without learning content into the appointment's collection, folder and period as drafts after the fact; answers 200 withcreatedandrecordings. 422recording-consent-incomplete(fixable withconfirmIncompleteConsent: true) andno-target-collection. Plus the listrecordingsonlearning.getAppointmentMaterial(only what the access may see). - Changed:
visibleDaysAfterReleaseis now writable onlearning.createContentandlearning.updateContent(1 to 3650 ornull) and applies to any content, not only recordings; previously read-only on recordings. Invalid: 422 atbody.visibleDaysAfterRelease.
v1.392.0 · November 6, 2026
- New on the signer slots of a PDF template (
templates.getPdf,templates.updatePdf,signerSlots):contactId, a suggested contact with an email address who signs via the e-signature link (for example a teacher who isn't a member). A slot carriesuserIdorcontactId, never both. If the contact is missing or has no email address: 422 onbody.signerSlotswithinvalid_reference. - New on issued documents (
letters.getIssuedand the other responses with the document,signature.slots):suggestedContactId, the contact the template suggests for the slot (nullif it suggests a member or no one).
v1.391.0 · November 6, 2026
- Changed behaviour: if a task belongs to a follow-up from the call list (the pipeline creates it), the card follows it:
PATCH /tasks/{id}with a newdueDatemoves the card's follow-up;statusDONE,DELETE /tasks/{id}ordueDate: nullwithdraw it (a parked card keeps it); reopened, it returns with the task's due date. Also applies toPOST /tasks/{id}/status. Other fields don't change the card.
v1.390.0 · November 6, 2026
- Changed: For a Metabolic Balance case, the most recent submission of the questionnaire that hasn't served an earlier case of this client record counts, even if it came before the start; previously only one after the start.
form.responseId/form.submittedAtonclients.listMetabolicBalanceCasesandstartMetabolicBalanceCaseand the handover (…/handover,…/handover/send) follow this rule;submittedAtcan be beforestartedAt. This also applies to cases already running. - Changed: The handover to Metabolic Balance (
…/handover,bloodValues, and…/handover/send) only takes values from approved reports, read or entered by hand; previously a read report was enough, even as a draft. Rejected reports count nowhere. In the case (report), reports entered by hand count once submitted; if everything is read but not everything approved yet, thereportstep says so.
v1.389.0 · November 5, 2026
- New on
learning.getAppointmentTypeMaterialandlearning.setAppointmentTypeMaterial:recordingFolderId(folder of the target collection for the recording,null= top level; not in the collection: 422) andrecordingVisibleDays(visible for N days after release, 1 to 3650,null= unlimited). IfrecordingCollectionIdchanges without a new folder, the folder becomesnull. - New on
learning.getAppointmentMaterialandlearning.updateAppointmentMaterial: effectiverecordingFolderIdandrecordingVisibleDays, plus the overridesrecordingFolderOverride({ folderId }ornull= as the appointment type) andrecordingVisibleDaysOverride({ days }ornull). A folder no longer in the collection acts as top level. - New on content:
visibleDaysAfterRelease(read-only, recordings only, otherwisenull). Changed behaviour in the contact view: a recording with a period no longer appears after that many days from the contact's release (search withcontactId, media); the release stays inlearning.listReleases, and the content stays in the organization's library.
v1.388.0 · November 5, 2026
- Changed behaviour: material after the lesson (the run at the end of the appointment and
learning.releaseAppointmentMaterial) goes per content to everyone with running access to its collection, registered for the appointment or not; withattendeesOnlyto those measured as present who have access. Previously it went to the registered participants, and anyone without a reply was left out.recipientCountcounts distinct contacts. - Changed behaviour: releasing the material publishes unpublished contents (drafts excepted). With
attendeesOnlythey stay unpublished and are visible in the contact view only to the recipients; such a content does not appear for absentees, not even by the collection's schedule.
v1.387.0 · November 5, 2026
- Teachers hold appointments:
resourceIdonappointments.create(and on recurrences) now also accepts a teacher (teacheron the resource), for any appointment type and at any time, without staffing and without working hours; the only check is whether they already have an appointment then (otherwise409 conflictwithslot-taken).appointments.reschedulekeeps an appointment's teacher even withoutresourceId. Online appointments of a teacher get the live room. Previously such aresourceIdreturned the error that the resource does not hold the appointment type.
v1.386.0 · November 5, 2026
- Teachers (a contact hosting lessons, without free slots):
GET,PUTandDELETE /appointment-teachers/{contactId}(appointments.getTeacher,appointments.setTeacher,appointments.removeTeacher).getTeacherreturnsisTeacher,resourceId,removable,upcomingCountand the next at most 20 appointments (upcomingwithparticipantCount, without names); a contact that is not a teacher responds withisTeacher: false.setTeacheris idempotent and responds with200;removeTeacherresponds with204, with upcoming appointments409 conflictwithreasonupcoming-appointmentsandextra.count. A missing or foreign contact returns404, a companyvalidation-failedatparams.contactIdwithcodenot-a-person. Every resource gainsteacher(appointments.listResources,appointments.getResource).
v1.385.0 · November 5, 2026
- New:
POST /clients/{id}/metabolic-balance-client/plans/{planId}/copy-pdf(clients.copyMetabolicBalancePlanPdf, no body, 200) copies the PDF of a plan of the linked client at Metabolic Balance into the record as a protected copy, only on this explicit call per plan. Response{ planId, documentId, copiedAt, created }; if the PDF is already in the record (own copy or a case's PDF), the same id comes back withcreated: falseand nothing is fetched again. Reasons: 404 if the plan doesn't belong to the linked client; 422metabolic-balance-client-not-linkedandmetabolic-balance-plan-without-pdf(withextra.planState); 409metabolic-balance-pdf-failed(withextra.error) andmetabolic-balance-copy-in-progress(a stuck attempt expires after five minutes). - New on
clients.listMetabolicBalanceClientPlansper plan:documentId, the plan's PDF in the record (a case's PDF or a copied one), otherwisenull; the file viadocuments.downloadUrl.
v1.383.0 · November 5, 2026
- New: existing records at Metabolic Balance on the client record.
GET /clients/{id}/metabolic-balance-client(clients.getMetabolicBalanceClient) reads which client at MBG the record is linked with (not linked: 200 withlinked: false).GET …/metabolic-balance-client/candidates(clients.searchMetabolicBalanceClients,search2 to 100 characters) searches the whole MBG account: at most 10 candidates, never anonymized ones, ranked withmatch.PUT …/metabolic-balance-client(clients.linkMetabolicBalanceClient,{ patientId }, 200) links only on this explicit call; claritos reads the client at MBG first: 422validation-failedatbody.patientId, 409metabolic-balance-client-linked-elsewherewithextra.clientId.DELETE …/metabolic-balance-client(clients.unlinkMetabolicBalanceClient, 204) removes only the link at claritos.GET …/metabolic-balance-client/plans(clients.listMetabolicBalanceClientPlans) and…/blood-tests(clients.listMetabolicBalanceBloodTests, newest first, at most 20) read at MBG on every call, nothing is stored; without a link{ data: [] }. - If the record is linked,
…/handover/sendtakes that client and doesn't check for duplicates; if the coach chooses or creates a client when sending, a record without a link is linked with it.
v1.381.0 · November 5, 2026
- New:
POST /clients/{id}/metabolic-balance-cases/{caseId}/handover/release-plan(clients.releaseMetabolicBalancePlan,{ phase, allowedTreatMeals, allowedOils }, 200) approves the plan at MBG and shares it with the client; claritos sends the client an email without health information and shows the plan in their client portal. Whether MBG notifies them itself is open; claritos doesn't undo a release; never twice, and calling again after a partial failure continues. Reasons: 422metabolic-balance-not-generated(withextra.planState), 409metabolic-balance-already-released, plus the known ones. - New on the handover's
mbg:releaseDefaults(the plan's values at MBG as defaults) andreleasedAt.
v1.380.0 · November 5, 2026
- New: the review chat with the Metabolic Balance back office.
GET /clients/{id}/metabolic-balance-cases/{caseId}/handover/chat(clients.listMetabolicBalanceChatMessages) reads the last 100 messages, oldest first, at MBG on every call (claritos stores no messages; reading marks nothing as read; without a chat an empty list).POST …/handover/chat(clients.postMetabolicBalanceChatMessage,{ text }, 200) sends a message; 409metabolic-balance-no-chatwithout a chat. TheIdempotency-Keyprotects against sending twice. - New on the handover's
mbg:chatAvailableandchatUnreadSince.
v1.379.0 · November 5, 2026
- New on the handover's
mbg:planDocumentId(the plan PDF in the record, copied into the protected storage as soon as the plan is generated at MBG; if MBG generates it again, claritos replaces the file under the same id, and if that fails, the previous one stays) andplanPdfError(no-pdf,fetch-failed,not-a-pdf,too-large; no further attempt after five failures). Get the file viadocuments.downloadUrlwith this id, only for keys with the client data permission; claritos never hands out MBG's own links.
v1.378.0 · November 5, 2026
- New:
POST /clients/{id}/metabolic-balance-cases/{caseId}/handover/generate-plan(clients.generateMetabolicBalancePlan) generates the plan at Metabolic Balance. Every call that generates costs one plan on the organization's account at MBG; the body requiresconfirmCost: true, and a repeated call never generates twice. Responds 200 with the handover. Reasons: 422metabolic-balance-not-sent,metabolic-balance-not-ready(withextra.checkErrors); 409metabolic-balance-already-generated(withextra.planState), plus the known ones. - New on the handover's
mbg:generationRequestedAt,verificationReason(our own keys),blockReason(text from MBG, at most 500 characters) andlastCheckedAt. claritos checks plans that are waiting for something (generation, review): shortly after generating and every five minutes.
v1.377.0 · November 5, 2026
- New:
POST /clients/{id}/metabolic-balance-cases/{caseId}/handover/laboratory(clients.createMetabolicBalanceLaboratory) creates a new laboratory in the coach's laboratory management at Metabolic Balance and selects it in the case. The input profile comes from the report: unit and normal range for the client's sex, otherwise MBG's presets; no personal data. Responds 200 with the handover. 409metabolic-balance-laboratory-existswithextra.laboratoryIdif a laboratory with the same name already exists (select it withPATCH …/handover); if only the profile fails, calling again continues. Further reasons: 422metabolic-balance-not-connected,validation-failed(for examplebody.countryId); 409case-closed,metabolic-balance-rejected,metabolic-balance-unavailable. - New on the handover (
GET,PATCH,send):options.countries(countries from MBG) andoptions.reportLaboratory(name,matchedLaboratoryId,suggestedCountryId).
v1.376.0 · November 5, 2026
- Changed:
affiliates.createCoupon(POST /affiliate-coupons),affiliates.updateCoupon(PATCH /affiliate-coupons/{id}) andaffiliates.updateClimateContribution(PUT /affiliate-climate-contribution) require the rightAFFILIATE_VERWALTUNG(seeGET /organization/entitlements). Without it they answer403 feature-not-availablewithreasonaffiliate-license, likeaffiliates.activity. Exception:updateCouponwithactive: false(switching off) keeps working without the right, as doaffiliates.deleteCouponandaffiliates.disableTracking. The same rule applies in the app.
v1.375.0 · November 5, 2026
- New:
POST /clients/{id}/metabolic-balance-cases/{caseId}/handover/sendsends the handover to Metabolic Balance: create the client and plan or take the existing ones, transfer all sections and the blood test, ask MBG whether a plan can be generated. Nothing is generated. Calling again continues and never creates anything twice. Beforehand claritos searches the client in the MBG account; a match is never taken over silently: 409metabolic-balance-duplicatewith up to five candidates inextra.candidates, then choose withpatient({ mode: "existing", patientId }or{ mode: "new" }). After that claritos asks about an open draft at MBG that did not come from this case (MBG allows one per client): 409metabolic-balance-draft-existswithextra.draft(planId,createdAt,state), here too before anything is written; take it over and overwrite it withoverwriteDraftPlanId, on the second call together withpatient. Further reasons: 422handover-incomplete(withextra.missing),collection-too-old,metabolic-balance-not-connected; 409case-closed,metabolic-balance-rejected(withextra.providerMessage),metabolic-balance-unavailable. - New on the handover (
GET,PATCH,send):mbgwith the client and plan at MBG (patientId,planId),planStatein our own keys,canGenerate,checkErrorsas delivered by MBG,sentAt,outOfGlobalRange;nulluntil sent.
v1.374.0 · November 5, 2026
- Changed:
couplings.prospectsRequiredonpipelines.update(PATCH /pipelines/{id}) counts as met as soon as the prospect has any card in a pipeline of the organization, whatever its state (open, parked, closed), no longer only a card in this pipeline. Only a prospect with no card at all gets the request to assign it or, withprospectsAutomatic, a card. This prevents duplicate cards for the same person. - Changed: The backfill of the requirement (
pipelines.getBackfillandpipelines.startBackfill,GET/POST /pipelines/{id}/backfill) now only takes prospects without any card in the organization; prospects that already have a card in another pipeline, even a closed one, are no longer added.candidatescounts accordingly.
v1.373.0 · November 5, 2026
- Imprint and privacy policy: supplements to the continuously generated template.
GET /organization/legal-textslistsmode,supplementsandsectionson every entry (nullfor other kinds) as well asdpoNotAppointed. NewPUT /organization/legal-texts/{kind}/supplements.DELETE /organization/legal-texts/{kind}discards the own text; supplements are kept, without supplements as before.PATCH /organization/legal-textsacceptsdpoNotAppointed.isCustomizedis still only true for an own text (same asmodeown), supplements alone do not change it;versionalso increases when the supplements change.
v1.371.0 · November 5, 2026
- New: read and prepare the handover of a case to Metabolic Balance.
GET /clients/{id}/metabolic-balance-cases/{caseId}/handoverreturns the sections as in the MB portal with a status (ready,unclear,optional,attention), the plan settings, the choices (options: laboratories, languages, MBG's lists), the blood values with the report's unit in MBG's spelling (no conversion) and two levels (outside-norm,outside-global), the questionnaire's free-text answers to assign, andblockers.PATCHon the same path changes settings and assignments partially. Our own keys:dietGoalnone/lose/regulation/gain,healthTriggerin camelCase; IDs at Metabolic Balance come fromoptions. Nothing is sent yet.
v1.370.0 · November 5, 2026
- New:
POST /clients/{id}/metabolic-balance-cases/{caseId}/request-reportasks the client for the lab report again. The call messages the client immediately through the case's channel, with the upload link; once a report has been read, the message names the missing required values. If the previous file request no longer accepts uploads, a new one is created (then infileRequest). Every call messages again. Response 200 with the case; 409case-closedorsend-failed, 422case-not-sent,contact-without-email,sender-missing,metabolic-balance-not-connected. - New on the case object (
GETandPOST /clients/{id}/metabolic-balance-cases):reportwith phase (none,reading,redaction,failed,read),requiredCount,receivedCount,missing,optionalRequested,optionalReceivedas{ key, name }(keylikemarkerKeyinbiomarkers.listProfileItems) andlastRequestedAt. Reports linked to the case's lab request in the lab tab count as well.
v1.369.0 · November 5, 2026
- New: Metabolic Balance cases on the client record.
GET /clients/{id}/metabolic-balance-caseslists the cases with their state (delivery, intake questionnaire, lab report, handover, plan).POST /clients/{id}/metabolic-balance-casesstarts a case: releases the lab request from the profile, issues the link to the intake questionnaire and creates the file request for the lab report (channelemailorportal). The message to the client is sent in the background as soon as the lab request PDFs are ready;delivery.sentAtis therefore set later and can be read with the GET. Requires the rightMETABOLIC_BALANCE(otherwise 403metabolic-balance-license) and a connected account (otherwise 422metabolic-balance-not-connected); one open case per record (409case-open).
v1.368.0 · November 5, 2026
- New right
METABOLIC_BALANCE(connection to the Metabolic Balance portal) inGET /organization/entitlementsand in the license endpoints. It has no prerequisite and unlocks the connection to the portal in the organization's settings; the key is entered there, not via the API. GET /organization/integrationslists the integrationmetabolicBalancefor business organizations (settings underbereich=schnittstellen): without the rightMETABOLIC_BALANCEwithstatenot-enabled, otherwisenot-connected,faulty(last check failed) orconnected.
v1.367.0 · November 4, 2026
- New:
courseIdonlearning.searchCourseslimits the search to one course. - Course search now also finds pages of a lesson's PDF files (
matchIn: "pdfPage"), with the new fieldlessonMaterialId; for pages of the lesson's own PDF medium it staysnull.
v1.366.0 · November 4, 2026
- Appointment types can be duplicated:
POST /appointment-types/{id}/duplicate(appointments.duplicateType, scopeappointments:write, the same permission ascreateType) creates an inactive copy, with “(Kopie)”, “(copy)” or “(копия)” added to the name in every stored language and a newslug(…-kopie,…-kopie-2); response 201 with the copy. The setup is copied including staffing and services; brand, form, call guide, place, phone, reminder plan and checkout link point to the same objects. Appointments, booking links and the partner release are not copied (partnerReleaseNONE). If the original points to a call guide, checkout link or reminder plan thatcreateTypewould not accept, the same error as there is returned.
v1.365.1 · November 4, 2026
- Fixed:
includeArchived=falseonpipelines.list(GET /pipelines) andpipelines.listSlas(GET /pipelines/slas) used to return archived items as well (any non-empty value counted astrue). The parameter now takestrueorfalse.
v1.365.0 · November 4, 2026
- Courses can name their two outline levels (
levelNames:firstfor modules,secondfor submodules), set in the request language and translated like other course texts;nullor an empty string returns all languages to the default. Names carry no number: the portal numbers items itself only where the titles carry none.
v1.364.0 · November 4, 2026
- Learning platform, courses:
descriptionandinstructor.descriptionare formatted text (HTML; plain text remains allowed and becomes paragraphs) and accept up to 20,000 characters instead of 5,000 inlearning.createCourseandlearning.updateCourse. claritos sanitizes the HTML on save. Behaviour: anyone who displayeddescriptionas plain text so far now sees markup such as<p>; treat it as HTML before displaying. The course import (learning.startCourseImport) now also sanitizes both texts on save and turns plain text into paragraphs; the 20,000 limit does not apply there. If a text only exceeds 20,000 characters after sanitizing,createCourse/updateCoursereportstoo_bigon the field.
v1.363.0 · November 4, 2026
- Learning platform, course folders and courses in collections: new endpoints
learning.listCourseFolders,createCourseFolder,updateCourseFolder,moveCourseFolder,deleteCourseFolder(folders of courses, at most two levels, without release rule),learning.orderCourseItems(POST/learning/courses/order) andlistCollectionCourses,addCollectionCourse,updateCollectionCourse,removeCollectionCourse(course as a tile in a collection; grants no access). New on the course:folderId,positionandcollections;learning.updateCourseacceptsfolderId. New on collection folders:courseCount;learning.deleteFolderreportsmovedCourseCount;learning.orderItemsknowstypecourse. Behaviour: folders, contents and course tiles of one collection level now share the numbers inposition. An import creates no course folders and moves nothing that was sorted in.
v1.362.0 · November 4, 2026
- Learning platform, searching courses: new endpoint
learning.searchCourses(GET/learning/courses/search), additive. Searches courses, modules and lessons (titles, descriptions, the instructor's name, line and text, lesson texts, speech and PDF pages of their media); flat rows likelearning.searchContents, withtype(course,module,lesson),modulePathandlessonType; withcontactIdfrom the contact's point of view (locked,unlockReasons), without it withdraft.learning.searchContentsstays unchanged and returns NO course hits; to get both, call both searches.
v1.361.0 · November 4, 2026
- Learning platform, courses:
instructorhas two new fields,jobTitle(line below the name on the card in the portal, per language) andimageAssetId(photo from the media library,null= initials); always in the response, optional inlearning.updateCourse. The import tree (learning.startCourseImport) carries neither photo norjobTitle; a later import leaves both as they are. New fieldrecommendation(“Related”, at most one entry,oneOfbytype: collection, another course or a custom link with title and image), always in the response (nullwithout an entry), optional inlearning.updateCourse(nullremoves it);learning.createCoursedoes not set it. If the target is deleted, the entry isnull.
v1.360.0 · November 4, 2026
- Learning platform, skipping ahead: new field
allowSeeking(boolean, defaulttrue) on the collection (read,learning.createCollection,learning.updateCollection) and on the course (read,learning.updateCourse). Withfalsethe portal only allows jumps in video and audio up to the furthest point already watched. Behaviour: progress then rises per report by at most the time elapsed since the previous report (times 1.25, plus 15 seconds); a single report no longer marks a video as viewed. Withtrue, that is for all existing collections and courses, progress behaves as before; the limit applies only withfalse.
v1.359.0 · November 3, 2026
- Body size per endpoint:
learning.startCourseImport(POST/learning/course-imports) now accepts up to 4 MB (4,194,304 bytes), all other calls still up to 1 MB. Until now the framework rejected every body over 1 MB with413, including on the course import, which promises 4 MB; a course with about 250 lessons failed on this. Every operation with a body states its limit in the spec asx-max-body-bytes, and the413response (payload-too-large) states it asmaxBodyBytes. Size is counted in bytes (UTF-8), also for a request withoutContent-Length.
v1.358.0 · November 3, 2026
- Learning platform, lesson materials:
learning.createLessonMaterial(POST/learning/lessons/{id}/materials, 201) attaches a file from the media library (withouttitlethe title of the media file, at most 50, beyond thatconflictwithtoo-many-materials),learning.updateLessonMaterialandlearning.deleteLessonMaterial(/learning/lesson-materials/{id}),learning.orderLessonMaterials(POST…/materials/order). A material from an import is not changed (conflict,material-from-import); if removed it returns with the next import, materials added by hand stay with every import. Newmaterialson every response with a lesson, always present ([]without material), each withmediaas on the lesson.
v1.357.0 · November 3, 2026
- Biomarkers, renamed before delivery: the count fields on
biomarkers.listAxes(and in the responses ofcreateAxis,updateAxis,orderAxes) aredraftEntryCount,lockedEntryCountandruleCountinstead ofdraftEntries,lockedEntriesandrules, likemarkerCountandruleCountin this domain (1.356.0 was never on any environment).
v1.356.0 · November 3, 2026
- Biomarkers, axes by hand: the axes of biomarker profiles can now be maintained without importing the profile workbook. New
biomarkers.listAxes(GET/biomarker-axes, with the number of entries in draftsdraftEntryCountand in released, retired or adopted profileslockedEntryCount, rulesruleCount,deletable,deleteBlockedBy),biomarkers.createAxis(POST; withoutkeythe next free one such as "A18"; a key in use gives 409axis-key-taken, the keyorderis not allowed),biomarkers.updateAxis(PATCH/biomarker-axes/{key}, name and note; the key stays),biomarkers.orderAxes(PUT/biomarker-axes/order, every key exactly once, returns the ordered list) andbiomarkers.deleteAxis(DELETE; entries in drafts lose the axis; 409axis-in-locked-profilewhile a released, retired or adopted profile names it,axis-in-rulewhile a rule calculates with it). On entries:biomarkers.listProfileItems(GET/biomarker-profiles/{id}/items, marker, sex,axisKey,familyKey,assignment) andbiomarkers.setItemAxis(PUT/biomarker-profiles/{id}/items/{itemId}/axis, only in own drafts, otherwise 409profile-not-draftorprofile-licensed;axisKey: nullremoves the assignment; returns the entry aslistProfileItemsdoes); a change setsassignmenttoACHSE_FESTGELEGT.
v1.355.0 · November 3, 2026
- Learning platform, courses on an access:
learning.setAccessCourses(PUT/learning/accesses/{id}/courses) sets the courses of an access, replaces the list in the given order and leaves the collections untouched; an unknown course givesnot-foundatbody.courseIds, without the right for coursesfeature-not-available. NewcourseIdsin the responses of access and grant, always present ([]without courses), and optional inlearning.createAccess(an empty list needs no right). Drafts and archived courses as with collections. Events unchanged.
v1.354.0 · November 3, 2026
- Learning platform, create course:
learning.createCourse(POST/learning/courses, 201) creates an empty course, as a draft released immediately and withoutsource; a later import does not touch it. Fieldstitle(required),description,typeandselfPacedStartas inlearning.updateCourse, response aslearning.getCoursewith an empty outline.
v1.353.0 · November 3, 2026
- Conversations, assignee and relation:
inbox.listConversationsandinbox.getConversationnow carryassigneeUserId, the responsible person (member of the organization; only while they are a member), andrelatedTo, what the conversation relates to, as a union distinguished bytype. Currently there is only{ type: "lesson", courseId, lessonId }: a question a customer asked about a lesson in the portal; the responsible person is then the teacher of the course (responsibleUserId, 1.352.0). If the course or lesson is deleted, that value isnull. Without an assignee or relation both fields arenull, so for all existing conversations. New filterassigneeUserIdoninbox.listConversations,assigneeUserId=nonefor nobody assigned. Setting the assignee comes with a later version.
v1.352.0 · November 3, 2026
- Learning platform, teacher on the course: courses carry
responsibleUserId, the member of the organization who receives questions from the portal about lessons of this course (assigneeUserIdof the conversation);null= nobody. Settable vialearning.updateCourse; a non-member givesnot-foundatbody.responsibleUserId. If the person leaves the organization, the value stays but counts as nobody. Independent ofinstructor(the displayed instructor). - License, behaviour (spec unchanged): for licenses with a version (
model: version), the rightLIVE_RAUMnow follows from the organization’s video tier (included, booked, or as a single exception on the tenant with Start); a separate release on the organization is no longer needed. Versions no longer listLIVE_RAUMinchoiceListnor as a bookable module (bookable); this applies on reading to every version, including ones already published, and booking the module is rejected (conflict,reasonrejected). Newly saved versions no longer contain it either. The video tiers are what can be booked. Licenses without a version (model: existing) are unchanged.
v1.351.0 · November 3, 2026
- License, video tiers with name and version: next to the key (
tier) there is the name in the language of the request (tierName; custom tiers with their own name,START,PLUS,PROwith a fixed text) onorganization.getLicenseChoices(also in the responses ofsetLicenseChoicesandsetVideoTier:video.tierName,video.booked[].tierName),organization.getLicense(modules[].tierName,bookable[].tierName,perOrganization[].videoTierName) and the preview of a cycle change (modules[].tierName). The number of the tier's version appears where an organization sees its tier:video.tierVersionNumber,perOrganization[].videoTierVersionNumber, and onbookable[]the version a new booking would get today (tierVersionNumber). A custom tier has a key made from its first name that never changes afterwards, so display the name.
v1.350.0 · November 3, 2026
- Conversations: new channel
portal(channeloninbox.listConversationsandinbox.getConversation, filterchannel=portal,channels.portalininbox.getConversationCounts). It covers messages in the customer portal in the communication area, one conversation per thread; protected record post does not appear.subjectis the thread's subject,counterpartisnull, messages in the history carry HTML. Clients that branch onchannelreceive a new value.
v1.349.0 · November 3, 2026
- Learning platform, fill in the blanks and question pool: the
typeof a quiz question gains the valueblanks(fill in the blanks); clients that branch on the type need a branch for it. New on the question:blanks(per blankanswers, the accepted answers;nullforsingleandmultiple, forblanksoptionsis empty). Blanks appear in the text as {{1}}, {{2}} …, counting from 1; comparison ignores upper and lower case and collapses whitespace.learning.createQuestionandlearning.updateQuestionaccepttypeblankswithblanks(1 to 20 blanks, 1 to 10 answers each of up to 100 characters); placeholders that don't match the blanks giveinvalidatbody.blanks, a blank without an answerrequiredatbody.blanks[i].answers, too many or too long answerstoo-large.PUT /learning/questions/{id}/answersgiveswrong-typeatparams.idfor fill-in-the-blank questions. New on the quiz:questionsPerAttempt(question pool: each attempt draws this many questions at random,nullall; when saving at most as many as the quiz has, otherwiseinvalidatbody.questionsPerAttempt; if questions are deleted later, each attempt takes all). Import andgetCourseMissingstay withsingleandmultiple.
v1.348.0 · November 3, 2026
- Learning platform, extended quiz: The quiz of a lesson (
learning.updateQuiz, readable on the lesson) gainsmaxAttempts(maximum attempts per person, 1 to 100,nullunlimited; reset attempts don't count),timeLimitMinutes(1 to 600,nullnone; counted on the server from “Start quiz” in the portal, after it runs out and a short tolerance a submission counts as not passed) andshowSolution(neverdefault as before,afterSubmit,afterPass: when the portal shows the correct answers). Out of range givesinvalidatbody.maxAttemptsorbody.timeLimitMinutes.learning.getCourseParticipantcarriesquizwithattemptCount,lastScore,passed,remainingAttemptsper quiz lesson (otherwisenull). NewPOST /learning/courses/{id}/participants/{contactId}/lessons/{lessonId}/quiz-attempts/reset(learning.resetQuizAttempts): attempts stay in the history but no longer count; a running attempt ends; a lesson that is not a quiz giveswrong-typeatparams.lessonId.
v1.347.0 · November 3, 2026
- Certificates and PDF templates: new field kind
TRIGGER_VALUEinpdfFieldKind(templates.*,letters.getIssued) for a value the process supplies when issuing;bindingis currently onlycourse.title, the course title on course completion on the learning platform. Issued by hand, such a field stays empty. Clients that branch onkindreceive a new value. Certificates gainsourceKind(COURSE_COMPLETION) andsourceId(theidfromlearning.listCompletionsorcompletionIdfromlearning.course.completed) when a process issued them without a signed-in person, otherwise bothnull. One completion yields at most one certificate.
v1.346.0 · November 3, 2026
- Learning platform, participants:
GET /learning/courses/{id}/participants(learning.listCourseParticipants, by name, filteractiveastrue/false, withlessonCount,completedLessonCount,progressPercent,lastActivityAt,completedAt,grantIdof the applicable grant) andGET /learning/courses/{id}/participants/{contactId}(learning.getCourseParticipant: per lessonstatuscompleted/open/locked,completedAt,completedManually,unlocksAt,unlockReasons, plusinterventions). Tick off by hand:POST …/participants/{contactId}/lessons/{lessonId}/completewithreason(learning.completeParticipantLesson, already completed stays unchanged) and…/reopen(learning.reopenParticipantLesson, only lessons ticked off by hand, otherwise 422precondition-failedwithreasonnot-manual). Interventions in the personal schedule (also for the library):POST /learning/grants/{id}/interventions(learning.createIntervention, 201, union overtype:pausewithstartDate/endDate,movewithtargetType/targetId/date,releaseNowwithtargetType/targetId,extendEndwithendDate;reasonrequired; an item not belonging to the grant returnsnot-foundatbody.targetId),GET /learning/grants/{id}/interventions(learning.listInterventions) andPOST /learning/interventions/{id}/revoke(learning.revokeIntervention, repeatable).GET /learning/courses/{id}/progress(learning.getCourseProgress): per lessonstartedCountandcompletedCount, plusparticipantCount.unlockReasonsnow carrytargetTypewithafterItem.
v1.345.0 · November 3, 2026
- Learning platform, completion and certificate: The course (
learning.getCourse, writable viaPATCH /learning/courses/{id}) gainscompletionRulewithrequiredLessons(allall lessons except drafts,selectedonlyrequiredLessonIds) andminAttendancePercent(1 to 100 % of appointment lessons, rounded up; withall, appointments then count through the share;nullnone), always set, in a PATCH it replaces the whole rule; pluscertificateTemplateId(PDF template,templates.getPdf). A lesson outside the course returnsnot-foundatbody.completionRule.requiredLessonIds[i], a percentage out of rangeinvalid, an unknown templatenot-found, an archived oneinvalidatbody.certificateTemplateId. NewGET /learning/completions(learning.listCompletions): completions, most recently changed first, filterscourseId,contactId,updatedSince, withcertificate(statusnone/pending/issued/failed,issuedDocumentIdreadable vialetters.getIssued,failureReason). New eventlearning.course.completed(once per participant and course). If the course has a template, the certificate is issued on completion (statusissuedwithissuedDocumentId, on failurefailedwithfailureReason); when the team sets a template, completions without a certificate receive it retroactively. - Automations: the triggers
learning.course.completed,learning.submission.submittedandlearning.submission.reviewedcan be limited to courses (filtercourseId, kindcourse, “one of”), for instance to start a next step only when a particular course is completed.
v1.344.0 · November 3, 2026
- Learning platform, submissions:
GET /learning/submissions(learning.listSubmissions) lists participants’ submissions in lessons of typeassignment, most recently changed first, with filterscourseId,lessonId,contactId,status(submitted,returned,accepted) andupdatedSince; never drafts.GET /learning/submissions/{id}(learning.getSubmission) returns the submitted rounds with text, files (documentId,filename,mimeType,sizeBytes; download viaGET /documents/{id}/download-url) and the feedback per round.POST /learning/submissions/{id}/feedback(learning.createSubmissionFeedback, 201) gives feedback on the last submitted round:resultacceptedcompletes the lesson,returnedsends it back,gradeoptional; without a submitted round 422precondition-failedwithreasonnot-submitted, with feedback already givenalready-answered. New eventslearning.submission.submittedandlearning.submission.reviewed. - Automations: the trigger
learning.submission.reviewedcan be filtered by the result of the feedback (result:accepted,returned), for instance to start a next step only for accepted submissions.
v1.343.0 · November 3, 2026
- Learning platform, course types:
type(selfPaced,class) is writable onPATCH /learning/courses/{id}(learning.updateCourse); newselfPacedStart(accesswith the participant’s access, default;firstOpenwhen they first open it in the portal), readable on the course and writable. It only applies toselfPacedand stays stored on a class course; a class course starts on the shared start date of the class the participant came through, or with their access if the class has none. “From day n” andimmediatelycount from this start; a start in the future locks until then. - Learning platform, appointment lessons:
POST /learning/courses/{id}/lessons(learning.createLesson) takestype: "appointment";appointmentIdoncreateLessonandPATCH /learning/lessons/{id}(learning.updateLesson,nullremoves it); on a lesson of another typeinvalid, an appointment that does not exist in the organizationnot-found, each atbody.appointmentId. NewGET /learning/lesson-appointments/options(learning.lessonAppointmentOptions: active appointment types withkindandcapacity, running recurring series) andGET /learning/lesson-appointments(learning.listLessonAppointments: appointments to choose with exactly one ofappointmentTypeIdandrecurrenceId, nonerequired, bothinvalid; upcoming first, paged viacursor).afterAppointmentcan now be chosen in course rules; an appointment outside the organization returnsnot-foundatbody.rule.conditions[i].appointmentId.
v1.342.0 · November 3, 2026
- Classes, shared start:
GET /contact-lists,GET /contact-lists/{id},POST /contact-listsandPATCH /contact-lists/{id}carrystartDate, the class's shared start as a calendar dayyyyy-mm-ddin the organisation's time zone (null: no start yet); learning platform courses for this class start on this day.PATCH /contact-lists/{id}(contacts.updateList) now takes{ name?, startDate? }, at least one of the two (otherwisevalidation-failedwithrequired);startDate: nullclears the start, a day that doesn't exist or a year outside 2000 to 2100 givesvalidation-failedatbody.startDate, and then the name isn't changed either. Subgroups have no start.
v1.341.0 · November 2, 2026
- Learning platform, release rules per course item:
ruleanddisplayonPATCH /learning/courses/{id}(learning.updateCourse; always set on the course, default immediately),PATCH /learning/modules/{id}andPATCH /learning/lessons/{id}(learning.updateModule,learning.updateLesson;null= none of its own, the one above applies) and in their responses;hasOwnRuleon modules and lessons inlearning.getCourse. In a course,afterItempoints tomoduleorlesson, andafterQuiz.quizIdis the ID of the lesson of typequiz. A reference that does not exist in the course returnsnot-found, an item waiting for itself or for something below itcycle, a lesson of another type forafterQuizwrong-type, each atbody.rule.conditions[i].POST /learning/releases/preview(learning.previewRule) also takescourseId(withmoduleIdorlessonId) instead ofcollectionId; exactly one of the two. - The condition schema is shared and gets wider:
afterItem.targetTypenow also knowsmoduleandlesson. Rules of a collection, its folders and contents never containmodule/lesson(they are rejected there withinvalidatbody.rule.conditions[i].targetType), rules of a course nevercollection/content. The release endpoints (targetTypeonlistReleases,release,withdrawRelease) stay withcollection/content.
v1.340.0 · November 2, 2026
- Appointment types now carry
waitingRoominliveRoom(AUTO,ON,OFF; defaultAUTO): the waiting room in the claritos live room. Anyone who isn't the host or a co-moderator waits until the appointment goes live.AUTOlets the live room decide by type: on for lessons and group appointments, otherwise off. If the field is omitted in a PATCH, the stored value stays. Applies at every entry, so also to appointments already booked; if the host switches it in the room, that comes first. Read viaappointments.getType/listTypes, set viacreateType/updateType.
v1.339.0 · November 2, 2026
- Learning platform: a course from GoHighLevel can also be imported in the app as a library collection; each lesson becomes an open entry until a file is assigned. New:
GET /learning/collections/{id}/missing(learning.getCollectionMissing, open and dismissed entries withpathandexpectedType),PUT /learning/collection-entries/{id}/media(learning.setCollectionEntryMedia, creates the content; idempotent for the same file,409for a different one,wrong-typeormedia-not-readyatbody.assetId),POST /learning/collection-entries/{id}/dismissand/reopen(learning.dismissCollectionEntry,learning.reopenCollectionEntry,204). - Course import runs (
learning.getCourseImport,learning.listCourseImports,learning.startCourseImport) now havetargetType(courseorcollection) andcollectionId. Runs can now also be collections (only from the GoHighLevel importer in the app): thencourseIdis empty without the run having failed, andmissingVideoscounts the open entries.listCourseImportsfilters withtargetType; collection runs emit nolearning.courseImport.*events.
v1.338.0 · November 2, 2026
- Learning platform, course outline: modules with
POST /learning/courses/{id}/modules(learning.createModule),PATCH /learning/modules/{id}(learning.updateModule),POST /learning/modules/{id}/move(learning.moveModule),DELETE /learning/modules/{id}(learning.deleteModule; withoutcascadesubmodules and lessons move one level up, with?cascade=truethey are deleted, response withmovedLessonCount,movedModuleCount, withcascadealsodeletedLessonCount,deletedModuleCount),POST /learning/courses/{id}/modules/order(learning.orderModules). Lessons withGET/PATCH/DELETE /learning/lessons/{id}(learning.getLesson,learning.updateLesson,learning.deleteLessonwith204),POST /learning/courses/{id}/lessons(learning.createLesson),POST /learning/lessons/{id}/move(learning.moveLesson),POST /learning/courses/{id}/lessons/order(learning.orderLessons). Quiz withPATCH /learning/lessons/{id}/quiz(learning.updateQuiz:passMark,passedText,failedText),POST /learning/lessons/{id}/questions(learning.createQuestion),PATCH/DELETE /learning/questions/{id}(learning.updateQuestion,learning.deleteQuestionwith204),POST /learning/lessons/{id}/questions/order(learning.orderQuestions). A third module level returnsvalidation-failedwithcodetoo-deepatbody.parentId, unfitting answersinvalidatbody.options. - Fixed:
includeArchived=falseonlearning.listAccesses,learning.listCollections,learning.listContentsandlearning.listCoursesused to return archived items as well (any non-empty value counted astrue). The parameter now takestrueorfalse.
v1.337.0 · November 2, 2026
- Learning platform, courses: new endpoints
GET /learning/courses(learning.listCourses),GET/PATCH /learning/courses/{id}(learning.getCoursewith outline,learning.updateCourse),POST /learning/courses/{id}/publish(learning.publishCourse; if videos or correct answers are missing,422withreasoncourse-incomplete,missingVideoCount,missingAnswerCount, fixable withconfirmIncomplete: true),POST /learning/courses/{id}/archiveand/unarchive,GET /learning/courses/{id}/missing(learning.getCourseMissing),PUT /learning/lessons/{id}/media(learning.setLessonMedia,409if media is already set) andPUT /learning/questions/{id}/answers(learning.setQuestionAnswers,correctIndexesas positions from 0).
v1.336.0 · November 2, 2026
- Learning platform, course import: claritos now fetches an import’s files (images, videos, audio, materials) into the media library. New on each entry of
files[](GET /learning/course-imports/{id},learning.listCourseImports):failureReason(only withfailed:not-https,blocked-network,too-large,timeout,wrong-type,source-error,invalid-url,dns-failed,too-many-redirects,connection-aborted,empty,internal-error),httpStatus(only withsource-error) andassetId(withdone). Newcounts.filesPending, also in the eventlearning.courseImport.completed: files arrive after this event,filesPending> 0 means it is still running. Video and audio up to 2 GiB, otherwise 200 MB.
v1.335.0 · November 2, 2026
- Learning platform, classes on an access: new endpoints
GET /learning/accesses/{id}/contact-lists(learning.getAccessContactLists) andPUT /learning/accesses/{id}/contact-lists(learning.setAccessContactLists, complete setcontactListIds, response withgrantedCountandrevokedCount). A selected class grants the access to all current members (sourceclass), a removed one ends only those grants (eventlearning.access.endedwithreasonclass); grants from other sources stay. NewcontactListIdson the access.learning.listAccessesnow also returnsnotifyOnGrant, like the single read.
v1.334.0 · November 2, 2026
- Learning platform, folders in collections (two levels: folder and subfolder): new endpoints
GET/POST /learning/collections/{id}/folders(learning.listFolders,learning.createFolder),PATCH/DELETE /learning/folders/{id}(learning.updateFolder,learning.deleteFolderwithmovedContentCountandmovedFolderCount; items and subfolders move up one level),POST /learning/folders/{id}/move(learning.moveFolder) andPOST /learning/collections/{id}/items/order(learning.orderItems, folders and items of one level). NewfolderIdon items (read,createContent,addContents,updateContent;null= top level),folderPathon search hits andfolderIdinlearning.previewRule. A third level is rejected with the codetoo-deep.learning.orderContentsstill orders only the given items.
v1.333.0 · November 2, 2026
- New: the contact's customer portal passkeys
GET /contacts/{id}/portal-passkeys(contacts.getPortalPasskeys,contacts:read):passkeyCount,lastUsedAtand per passkeydata[]withid(ID of the entry at claritos, not the credential ID),label(provider or device),createdAt,lastUsedAt. The API never returns public keys or credential IDs. PlusDELETE /contacts/{id}/portal-passkeys(contacts.removePortalPasskeys,contacts:write): removes all passkeys, for example after a lost phone; the person then signs in with a code again. Response{ removedCount }with status 200,removedCount: 0without passkeys; unknown contactnot-found.
v1.332.0 · November 2, 2026
- Conversations, sentiment: every conversation in
GET /inbox/conversationsandGET /inbox/conversations/{id}carriessentiment(positive,neutral,negative,null= not rated yet), the sentiment of the most recently rated incoming email. New filtersentiment(positive,neutral,negative,none= not rated yet); it sets the channel toemail, because text messages are never rated.GET /inbox/conversation-countsaddssentiments{ positive, neutral, negative, none }, counted over open email conversations.
v1.331.0 · November 2, 2026
- Learning platform, course import: new endpoints
POST /learning/course-imports(learning.startCourseImport, 202),GET /learning/course-imports/{id}(learning.getCourseImport) andGET /learning/course-imports(learning.listCourseImports, filterssourceSystem,sourceCourseId). A program sends a complete course (modules, submodules, lessons, quizzes with correct answers; files as addresses), claritos imports it in the background as a draft; a second import from the same origin adds to it. New eventslearning.courseImport.completedandlearning.courseImport.failed(withreason).
v1.330.0 · November 2, 2026
- Learning platform, several contents at once: new endpoint
POST /learning/collections/{id}/contents(learning.addContents) withassetIds(1 to 50 media library files). One unpublished content is created per file at the end of the collection, in the order ofassetIds; the title is the file's name in the media library. Response 201{ created, failed }; an error with one file does not stop the others,failedgives the reason per file (not-found,media-not-ready,limit-reached,failed).
v1.329.0 · November 2, 2026
- Learning platform, email on new access: every access carries
notifyOnGrant(on by default, writable inPOST /learning/accessesandPATCH /learning/accesses/{id}). When it is on, a contact receives an email with the link to the portal as soon as the access takes effect for them. Every grant also carriesaccessEmailStatus(pending,sent,skipped,failed),accessEmailSkipReason(withskipped:disabled,alreadyActive,noEmail,companyWithContacts,ambiguousEmail,beforeIntroduction) andaccessEmailAt.
v1.328.0 · November 2, 2026
- Learning platform, recordings without full course consent:
POST /learning/contentswith a document of a live session not all participants consented to answers 422precondition-failedwithreasonrecording-consent-incomplete,consentedCount,participantCountandfixable: true; with the new fieldconfirmIncompleteConsent: trueit is created and the confirmation is recorded. Every content also carriesconsentConfirmation(nullorconfirmedAt,consentedCount,participantCount,confirmedByUserId,confirmedByApiKeyId).
v1.327.0 · November 2, 2026
- Learning platform, search:
GET /learning/contents/search(q2 to 100 characters,limit1 to 100, no paging). Hits in title, description, what is said (positionMs) and PDF pages (pdfPage), fieldmatchIn,excerpt. WithcontactIdonly what that contact sees, locked hits withlockedandunlockReasons; without it the whole library including drafts (draft). Term too short: 422validation-failedatquery.q.
v1.326.0 · November 2, 2026
- Learning platform, material after the lesson:
GET/PUT /appointment-types/{id}/learning-material(list from the library released at the end of every appointment of this type,recordingCollectionIdfor the recording as a draft,attendeesOnly),GET/PATCH /appointments/{id}/learning-material(add,hide, overridingattendeesOnly,withheld; response withreleasedAtandrecipientCount) andPOST /appointments/{id}/learning-material/release(release now; with “attendees only” but no measurement 422precondition-failed,reasonattendance-not-measured). Releases are reported vialearning.content.releasedwithsourceappointment.
v1.325.0 · November 2, 2026
- Learning platform: collections carry
notifyDelivery, the team's default for notifications to participants (bellOnly,push,emailNow,emailDaily,emailWeekly,sms;nullmeans the claritos default, i.e. weekly overview). Read inGET /learning/collections, set viaPOST /learning/collectionsandPATCH /learning/collections/{id}. The bell in the portal is always added; each member can change it for themselves. Withnotify: falsethe field is not read.
v1.324.0 · November 2, 2026
- Learning platform: the full library via the API. Collections (
GET/POST /learning/collections,PATCH /learning/collections/{id},…/publish,…/archiveand…/unarchive,POST /learning/collections/order) with a release rule asrule(matchallorany, at most fiveconditions:immediately,afterDays,fromWeek,onDate,afterItem,afterQuiz,afterAppointment,fromLevel,manual),displayandduration. Contents (GET /learning/collections/{id}/contents,POST /learning/contentsfrom the media libraryassetId, a document or an https link,PATCH,…/mediafor a new version,…/publish,…/archive,…/unarchive, order) with usagereleasedTo/seenBy. Create and maintain accesses (POST /learning/accesses,PATCH,…/archive,…/unarchive,PUT …/collections). Releases:GET /learning/releases,POST /learning/releases(manual),POST /learning/releases/withdraw,POST /learning/releases/preview(calculate a rule in advance, writes nothing). Accesses of an article:GET/PUT /articles/{id}/learning-accesses.
v1.323.0 · November 2, 2026
- New: conversations, email threads and SMS histories in one list.
GET /inbox/conversationsfilters by view (open,starred,closed), channel, mailbox, unread, contact tag or tag group (contactTagModeany/all), campaign (campaignId: replies since sending, as in the campaign report) and search;sortwaitingputs first whoever has waited longest (waitingSince); paging usescursorandlimitas everywhere.GET /inbox/conversations/{id}returns the history,POST /inbox/conversations/updatesetsread,unread,star,unstar(for the person behind the key) andcloseandreopen(for everyone) for many at once, withresultsper id (updated,notFound),GET /inbox/conversation-countsthe counts per view, channel, mailbox, contact tag and campaign,PUT /inbox/conversations/{id}/contactassigns a contact.inbox.listThreadsand related endpoints stay unchanged.
v1.322.0 · November 2, 2026
- New in automations: two learning platform actions. “Grant learning platform access” calls
POST /learning/grants, “Revoke learning platform access” callsPOST /learning/grants/revoke; the latter only revokes grants made manually, through the API or by an automation, grants from a purchase or a class stay.GET /automation-cataloglists both, the fieldaccessIdwith the sourcelearningAccess. In addition, the eventslearning.access.grantedandlearning.access.endedcarry the days of the grant asgrant.startDateandgrant.endDate, like the grant inGET /learning/grants.
v1.321.0 · November 2, 2026
- New area
learning(learning platform, rightslearning:readandlearning:write):GET /learning/accesseslists the accesses,GET /learning/grantsthe grants of a contact or an access,POST /learning/grantsgrants an access (repeatable; via the API with sourceapi, from an automation with sourceautomation),POST /learning/grants/{id}/revokerevokes it with a reason,POST /learning/grants/revokerevokes an access from a contact. Only grants created manually, via the API or by an automation are revoked; grants from a purchase or a class answer 422precondition-failedwithreasongrant-source-protected. Requires the organization rightLERN_BIBLIOTHEK, otherwise 403feature-not-available.
v1.320.0 · November 2, 2026
- New: three learning platform events for webhooks and automations.
learning.access.grantedwhen a contact receives an access, from any source (grant.source:manual,api,automation,purchaseorclass).learning.access.endedwhen an access actually ends, by revocation or expiry, also at a later point in time, withgrant.endedAtandgrant.reason(manual,api,automation,payment,cancelled,ended,classorexpired).learning.content.releasedwhen a collection or a content item becomes available to a contact (release.targetTypecollectionorcontent,release.sourcerule,appointmentormanual). One event per contact; the payload carries IDs, names and timestamps, no learning progress. Events are sent once the learning platform is in operation.
v1.319.0 · November 2, 2026
- Three new rights for the learning platform in
GET /organization/entitlementsand in the license endpoints:LERN_BIBLIOTHEK(library),LERN_KURSE(courses) andLERN_COMMUNITY(community). They have no prerequisite; endpoints of the learning platform itself will follow. DELETE /articles/{id}now also answers 409in-usewhen a purchase of the article grants an access of the learning platform (usage.learningAccesses).
v1.318.0 · November 1, 2026
- New: replies from the CRM via a SendGrid domain.
PUT /sendgrid/domains/{id}/crm-replieswithenabledselects a domain with a ready reply area (at most one; another domain loses the selection) or releases it; the domain carriescrmReplies. The reply-to of emails from the contact is then the sender before the @ on the reply host (own sender name, otherwise the part before the @ of their sending address, only if unique, otherwise the organization's reply alias); the reply reaches that person. Without a ready reply area 422precondition-failedwithreasonsendgrid-replies-not-set-up; in production, until the privacy policy addendum,reasonsendgrid-personal-not-released.
v1.317.0 · November 1, 2026
- New: record consent to appointment reminders
POST /contacts/{id}/reminder-service/subscribe(contacts.subscribeReminders,contacts:write), the counterpart ofcontacts.unsubscribeReminders, for example for consent given during onboarding before the first appointment. Body:channels(email,sms; without it both, as far as the contact has a value) andnote(required, how consent was given). Response likegetReminderServiceplusrevocationKept: channels the contact unsubscribed from themselves; nothing is recorded there. The acting person is stored with the entry; without oneno-acting-user; without a value on the contactvalidation-failed.
v1.316.0 · November 1, 2026
- Changed, spec unchanged:
conversation.sendEmail,conversation.getComposeOptionsandconversation.checkPermissionalso work for a contact with a client record without client data release (previously 404not-found). The email is a normal conversation email and appears in general sent mail; client-file post is then not possible. Only callers with the release read the conversation of such a contact (conversation.list,getEntry,getReplyBasis).qinGET /outbound-emailssearches each word on its own in subject, recipient address and name of the contact the email went to, with umlauts also in their spelling with e. Email campaigns: a new campaign starts with client protection off (clientProtection.enabledfalse);POST /email-campaigns/{id}/client-protectionwithenabled: falseneeds client data andclients:readonly when emails of the campaign are already in the client area.
v1.315.0 · November 1, 2026
- New: co-moderators for group appointments.
POST /appointments/{id}/co-moderators/checkshowsfree,busyoralreadyper appointment before inviting;POST /appointments/{id}/co-moderatorsinvites a team member (userId) or a contact (contactId),scopeappointmentorseries(this and all following appointments of the recurrence; later appointments of the recurrence take them over), busy and already invited appointments are listed inskipped;POST /appointments/{id}/co-moderators/removeremoves them (removed). The co-moderator gets their own invitation with a calendar file and link, is co-host in the claritos live room from entry and takes no seat; a team member with a resource is blocked for the time. 422co-moderator-without-email,not-a-group-appointment,appointment-not-open. Participants carryisCoModerator(sidePROVIDER);hostsand thecontactIdfilter ofGET /appointmentsdo not count co-moderators.
v1.314.0 · November 1, 2026
- Appointment types carry
practiceRelevant(defaultfalse): does the appointment type concern the practice? Only then do its emails appear, in an organization with a practice, in the sent mail of the client area; otherwise in general sent mail (letters.listEmails). Read viaappointments.getType/listTypes, set viacreateType/updateType. When switched, emails already sent move along. Switching off needs client data (clients:read, released for the API), otherwise 403forbiddenwithreasonpractice-off-needs-client-access. Changed, spec unchanged: appointments held by phone, at the practice or as a home visit no longer get a video room;meetingUrlstays empty there.
v1.313.0 · November 1, 2026
- Changed in the rule language, spec unchanged: a name in a formula that is the main name of exactly one lab value means that value, even if other values carry it as a search term (
{{Kreatinin}}is serum creatinine, no longermehrdeutigerName). Two values with the same main name stay ambiguous.formulain rule responses writes a name only if reading it leads back to the same target, otherwise the identifier ({{loinc:2160-0}},{{G-A1-01}}); everyformulacan be sent back unchanged. Lab values of kind index or ratio without a unit of their own have no unit in formulas ({{HOMA-IR}} >= 2.5); before, the label of the system catalog counted as a unit andeinheitFehltwas returned.
v1.312.0 · October 31, 2026
- New in automations: a filter on an answer in a form for the trigger
forms.response.submitted. Intrigger.filter, useresponse.answers.‹field›with the key of an option as the value, field and option as inGET /forms/{id}/analysis(the field has the formkind:id, for exampledef:…orstd:…). The filter matches when the answer contains the option, so with multiple choice also alongside others; yes/no istrueorfalse. At most ten such entries per rule, all must match.GET /automation-cataloglists the filter withkindformAnswerandpathresponse.answers. Client record forms do not report answers, so the filter never matches there.
v1.311.0 · October 31, 2026
- Changed:
DELETE /appointments/{id}/participants/{contactId}also removes the last participant of a lesson or an internal-only group appointment; the appointment stays with free seats. Before, this returnedlast-participant(for events the last one could already leave). The removed participant still gets their cancellation.
v1.310.0 · October 31, 2026
- New: word cloud of free texts in
GET /forms/{id}/analysis. Each free-text question carriesterms(itemswithterm,display,count,kindword,pairoranswer, plusbelowThresholdandhidden), counted without AI: per submission, from 3 submissions, at most 40, without email addresses, web addresses, phone numbers, numbers and filler words; other questions haveterms: null. New at the top level:hiddenTerms.PUT /forms/{id}/analysis/hidden-termswithtermsreplaces the list of hidden terms (admins only,forms:write); a single word also hides every word pair it's part of.
v1.309.0 · October 31, 2026
- New:
GET /forms/{id}/analysis/groupreturns the contacts behind the filters of an analysis (period, link, language, answer as inGET /forms/{id}/analysis) ascontactIds, pluswithoutContactfor submissions without a contact. Use it like the “Act” tab to create a contact list (POST /contact-lists,POST /contact-lists/{id}/members) or a task (POST /tasks).
v1.308.0 · October 31, 2026
- New: response tracking of a form's personal links.
GET /forms/{id}/follow-upreturns for each link to a contact or prospect its status (submitted,started,opened,not-opened,expired), when and how often it was reminded andremindBlockedBy; links to a client record don't count.POST /forms/{id}/follow-up/remindwithlinkIds(at most 50) andtemplateId(message template for contacts) sends each person the template with their personal link, on behalf of the acting person through the same sending point asPOST /contacts/{id}/conversation/email; requiresemail:write. Skipped are links that are submitted, expired, without contact or address, or reminded in the last 24 hours (skipped); without a sender 422precondition-failedwith reasonno-sender.
v1.307.0 · October 31, 2026
- New: relationships in a form's answers.
GET /forms/{id}/analysis/relationschecks every pair of two questions (choice, yes/no, options of a multiple choice with at least 3 mentions, numbers; personal details never) and, withcontacts:read, features of the contact behind the submission (country, tags, classes, supporting partner, stage per pipeline, year created;contactFeatures). Pairs are checked across the submissions that have both features (at least 10, groups of at least 5), with Fisher's exact test, chi-squared, Mann-Whitney or Kruskal-Wallis and then the Benjamini-Hochberg correction across all pairs:findingswithlevelrelationship(q below 0.05) orhint(below 0.1), at most 20, pluscheckedandtooSmall. WithcompareAandcompareBalsocomparison: cross table or groups with median and range, level from the same correction. Filters as forGET /forms/{id}/analysis.
v1.306.0 · October 31, 2026
- New: AI analysis of a form.
GET /forms/{id}/analysis/aireturns the summary of the latest run: statements with kind (counted,classified) and evidence (options, submissions), themes of free texts with their submissions, suggestions for new options; every number in a statement is in the fact sheet, others are not returned (discarded).POST /forms/{id}/analysis/aistarts a run (202,runId),PUT /forms/{id}/analysis/ai/settingswitches it on or off per form (admins; switching off deletes summaries). The questions, counted results and free texts go to the AI; fields for name, postal address, date of birth, email address and telephone number are left out insofar as they can be recognised as such (prepared personal fields, fields of type email, phone, URL, own fields whose label sounds like it). Requires the organization's right to AI analysis (403feature-not-available). Also new inGET /forms/{id}/analysis:dataQualitywith answers to hidden questions, multiple submissions, missing required answers.
v1.305.0 · October 31, 2026
- New: physical activity as the catalog
sportof the rule language, the Compendium of Physical Activities 2024 (not yet delivered).GET /physical-activitiessearches a code (also partial) or words of the English description; every hit namescompendium(adult,older-adult,wheelchair),group,metwithmetBasis(MET,MET60,METWC, not comparable with each other) and the citation insource. An entry is the code with its leading zero (01003); when a rule is saved or approved it must be imported, otherwiseeintragUnbekannt.GET /standard-catalogsshowsactivities(count, compendia,inPlan,planRelease, sources).PATCH /standard-catalogs/sportwith{ inPlan }releases physical activity for the client's plan or withdraws that, only a person with the right “Approve rules”, never an automation and never the MCP (403forbidden); the plan shows name, duration and frequency, no MET value. Without release, physical activity counts ininternalLeftOut.
v1.304.0 · October 31, 2026
- New: the WHO's ICD-11 as the catalog
icd11of the rule language, next toicd10gm(not yet delivered).GET /diagnosis-codestakescatalog(icd10gmby default oricd11); every hit now carriestitleDeMissing(ICD-11 only: the German pre-release has no title for the code yet,titleis then the English one),titleEnanduri(ICD-11 only; code, title and URI belong together whenever they are passed on, WHO licence). When a rule is saved or approved, an ICD-11 code must exist in the active version, otherwiseeintragUnbekannt; a diagnosis never appears in a personal plan and counts ininternalLeftOut. Changed:GET /standard-catalogsreturnsdiagnosesas a list of the active diagnosis catalogs (id,version,count) instead of a single object; 1.303.0 had not been delivered yet.
v1.303.0 · October 31, 2026
- New: foods as the catalog
lebensmittelof the rule language (not yet delivered). An entry is theslugof a food fromGET /foods/search; when a rule is saved or approved it must exist in the database, otherwiseeintragUnbekannt.GET /rulebook-catalogslistslebensmittelwith the entries the organization's rules use.GET /standard-catalogsshows foods (count,inPlan,planRelease, sources) and the active ICD-10-GM;PATCH /standard-catalogs/lebensmittelwith{ inPlan }releases foods for the client's plan or withdraws that, only a person with the right “Approve rules”, never an automation and never the MCP (403forbidden). Without release, foods stay internal and count ininternalLeftOutof personal plans.
v1.302.0 · October 31, 2026
- New: ICD-10-GM diagnoses as the catalog
icd10gmof the rule language (not yet delivered).GET /diagnosis-codes?q=searches the active version for a code (also partial,E11) or words in the title, German or Russian, and returns code, official title, Russian title (titleRuFromnames the parent code when the code has none of its own), level and whether the code is codable;catalogwith version and source notice,nullwhile no version is imported.GET /rulebook-catalogslistsicd10gmonce a version exists; thereentriesonly names the codes that rules of the organization use. When a rule is saved or approved, every code inempfehlung(icd10gm; <code>)must be in the active version, otherwiseeintragUnbekannt. Diagnoses never appear in a client's plan.
v1.301.0 · October 31, 2026
- New:
GET /forms/{id}/responses/export, a form's submissions as CSV. One row per submission, oldest first: ID, time (Berlin), link, language, then one column per question in the order of the form. Choices as today's label (otherwise the submission's label), numbers as numbers, measurements and grids in their own columns, a repeating group in one cell, corrections included. The same filters asGET /forms/{id}/analysis. Column headers inlocale; comma foren, otherwise semicolon with decimal comma; BOM first. Client record forms only with client data enabled andclients:read.
v1.300.0 · October 31, 2026
- New:
GET /forms/{id}/analysis, the analysis of a form with the same figures as the “Analysis” page. Per question the base (shown: who was shown it; for conditional questions only where the condition applied), counts by option key including options that no longer exist (inForm: false), free texts of an “Other” option at that option (otherTexts), statistics for numbers and measurements, free texts verbatim; personal details only counted (kind: personal). Plus submissions per day and language anddropOff, the drop-off chain from the form's measurement. Filtersfrom,to,link(personal,noneor the ID of a public link),language,questionwithoption. Client record forms only with client data enabled andclients:read.
v1.299.0 · October 30, 2026
- Consent log (
GET /consent-log): new purposepurposes.partnerAttribution(partner attribution: a purchase is attributed to the partner whose referral code brought the visitor). In older entries it isfalse. The export (GET /consent-log/export) has one more column for it, „Partner-Zuordnung“, after „Auf diesem Geraet angemeldet bleiben“.
v1.298.0 · October 30, 2026
- New: client protection on email campaigns. Field
clientProtection(enabled,changedAt;nullwithout an active practice module) andPUT /email-campaigns/{id}/client-protectionwith{ enabled }, in any status. Off: emails to recipients with a record appear in general sent mail and on the contact; those already sent move along, on brings them back into the client area. Switching off only with client data enabled,clients:readand access of the acting person to the client area (403client-access-required); without the practice module 422practice-module-inactive.
v1.297.0 · October 30, 2026
GET /organization/invitations: invitations that were never accepted (pending, expired, revoked) are deleted the day after they expire and no longer appear afterwards, not even withstatus=EXPIRED; aDELETE /organization/invitations/{id}on such an invitation then returns 404 instead of 204. Accepted invitations remain. The description of thestatusfield says so.
v1.296.0 · October 30, 2026
- New: derivation (not yet delivered).
GET /personal-plans/{id}/derivationreturns the run a personal plan was created from, in the shape ofPOST /rulebooks/{id}/compute, plus the origin of each value read (origins: date, lab report); only people with the right “Approve rules”, otherwise 403physicians-only.GET /care-enrollments/{id}/derivationreturns the suggestion a care enrollment was started from: rulebook, version and rule per template and module, with the trace as a list (level, value, origin, date); without that right only rulebook and version (physicianView: false). Plans and enrollments from before have no derivation (runorderivationempty).
v1.295.0 · October 30, 2026
- New right
FORMULAR_KI(AI analysis of forms) inGET /organization/entitlementsand in the license endpoints. It has no prerequisite and unlocks the AI parts of the form analysis once they are delivered; figures and charts do not depend on it.
v1.294.0 · October 30, 2026
- Changed (operator decision, not yet delivered): what rules say about a person is read only by people with the right “Approve rules”.
POST /rulebooks/{id}/computeandGET /rule-runs/{id}otherwise answer 403physicians-only(allowed via MCP for such a person, never for an automation without a person);GET /clients/{id}/rule-runsstays. For everyone else, personal plans come withoutruleson the recommendations, and recommendations that have become internal come without name, text and details.
v1.293.0 · October 30, 2026
- Personal plans only contain lifestyle and well-being (operator decision, not yet delivered): own catalogs are internal until a person with the right “Approve rules” releases them for the plan (
inPlaninPATCH /rulebook-catalogs/{key}, read asinPlanandplanRelease; only in the lifestyle areas,otheranswers 409area-never-in-plan). Entries carrydoctorsOnly(set only by the same people,PATCH …/entries/{entryKey}). Neither via an automation or MCP (403release-needs-person).professionalOnlyis removed. On plans:internalLeftOutinstead ofprofessionalOnlyLeftOut,internalEntries,lifestyleConfirmation, gaprecommendations-internal, 409all-internalinstead ofprofessional-only;POST /personal-plans/{id}/releaserequiresconfirmLifestyle: true.
v1.292.0 · October 30, 2026
- Changed from 1.291.0 (not yet delivered):
release.waitingForinGET /organization/licensecarries English values (receivables,payables,subscriptions,affiliate-sales,affiliate-claims,affiliate-credit-notes,affiliate-drafts,affiliate-clawbacks,affiliate-other, otherwiseother). Releasing an organization and revoking that stay in the app (operator decision), because a deletion comes at the end.
v1.291.0 · October 30, 2026
- New in
GET /organization/license: per organizationrelease(a running release: since, read-only until, phaseread-onlyorstopped, backup requested and sent, what holds up the deletion, whether it can be revoked) andreleasable(whether it can be released). Releasing and revoking themselves are done in the app for now.
v1.290.0 · October 30, 2026
- New: license changes over the API, always in two steps.
POST /organization/license/changes/previewcalculates the change of a module (quantity, cycle) in advance: effect at once with a pro-rata invoice or at the cutoff, amount now and per period, with achecksum;POST /organization/license/changesconfirms it with thatchecksum.POST /organization/license/cycle-change/previewandPOST /organization/license/cycle-changeswitch the package between monthly and yearly (continuefor choosable yearly modules). Confirming requires theIdempotency-Keyheader (422 onheaders.idempotency-key); if anything changed since the preview, 409preview-outdated. Tenant owner only; confirming also works during the read-only period. New reasons (409):no-contract,package-ending,below-usage,change-pending,contract-error; 422 onbody.cycleandbody.quantity.
v1.289.0 · October 30, 2026
- New: the organization’s license over the API (license model).
GET /organization/licenseshows the tenant’s license like the License tab (package with version, cycle, price, state, cutoff, organizations, modules, and per organization its choices and video tier), tenant owner only.GET /organization/license/choicesshows this organization’s choice slots, choices and video tier (tenant owner or ORG_ADMIN).PUT /organization/license/choiceschooses modules for the choice slots,PUT /organization/license/video-tierassigns a booked video tier; both tenant owner only, a free slot applies at once, a change from the next monthly cutoff, and both also work during the read-only period. Without the tenant owner 403forbiddenwithreasontenant-owner-required.
v1.288.0 · October 30, 2026
- New: the read-only period of the license model also applies to the API and the API MCP. When an organization’s license has ended, the API accepts only reading calls for 30 days; after that writing is locked as well. A writing call then gets 403
forbiddenwithreasonlicense-read-only,phase(read-onlyorlocked) anduntil(last day of the read-only period). Only endpoints with an exception for the phase go through; today, during the read-only period,POST /backups/runsandPUT /backups/password(backups count as export) as well asDELETE /affiliate-coupons/{id},PATCH /affiliate-coupons/{id}withactive: falseandDELETE /affiliate-tracking/webhook(ending things). After the read-only period none of them goes through. Reading calls, includingPOST …/validateand previews, do not change; the organization’s automations keep running during the read-only period.
v1.287.0 · October 30, 2026
- New in
GET /rooms/settings:recordingStoragewith the organization's storage for live room video recordings:tier(video tier,nullwithout a tier),usedBytes,limitBytes(nullwithout a limit) andstate(free,warningfrom 80 %,fullfrom 100 %,unlimited). Only video recordings whose document still exists count; the audio recording for the summary does not. When the storage is full, no new video recording starts; meetings continue without one.PATCH /rooms/settingsstill answers withsummaryonly. - Changed behavior, spec unchanged:
PATCH /organization/members/{userId}withclientAccess: trueresponds403 forbiddenwithreason: practice-read-onlywhen the organization's practice is read-only (module ended or read-only phase). An existing grant stays; revoking (false) always works.
v1.286.0 · October 30, 2026
- Changed behavior on the practice endpoints (rulebooks and catalogs, rule connections and cases, personal plans, care plans, care enrollments and sessions, biomarker profiles and rule sets), spec unchanged: if an organization's practice module has ended or the organization is in its read-only period (licence model), read endpoints, requesting the PDF of a personal plan, computing without saving (
POST /rulebooks/{id}/compute) and ending stay available (POST /rule-cases/{id}/withdraw,DELETE /rule-connections/{id},POST /personal-plans/{id}/withdraw,POST /care-plans/{id}/retire); before, they answeredfeature-not-available. Writing endpoints then answer 403forbiddenwithreasonpractice-read-only. Without a practice it staysfeature-not-available.
v1.285.0 · October 30, 2026
- New:
PATCH /rule-connections/{id}withcreditAccountId(ornull) sets the partner's credit account on a rule connection, computing organization only, ORG_ADMIN only. From then on every release of a personal plan from a case of this connection books 1 credit on that account (usage); withdrawing the plan or the case reverses it; without an account nothing is booked. An unknown or closed account yields 422 onbody.creditAccountId(invalid_reference).GET /rule-connectionsnow carriescreditAccountinasComputing({ id, program, customer }ornull). - New value
PERSONAL_PLANinsourceof credit entries (GET /credits/accounts/{id}): usage and reversal from a personal plan delivered to a partner organization.
v1.284.0 · October 30, 2026
- New on care plan templates: modules.
GET,POST,PUT /care-plansandPOST /care-plans/validatecarrymodules([{ key, name }]) andmoduleKeyon phases and sessions: parts that only go into a care enrollment when recommended. A phase with a module takes its sessions along; a session gets its own module only in a phase without one. Without a given key it is derived from the name (lowercase letters, digits, hyphens) and stays across versions, because rules recommend the module by it. New 422 errors onbody.modules(too_big,required,duplicate) and on themoduleKeyof a phase or session (invalid_reference). - New: variants per session,
variants([{ moduleKey, callGuideId, durationMinutes }], at most 5, one per module). If the module is chosen at the start, the variant's call guide and duration apply; the first chosen one wins. 422 onbody.sessions.{n}.variants(invalid_value,requiredwithout call guide and duration); an unknown call guide or a duration the appointment type does not offer is reported as for the session, oncallGuideIdordurationMinutes. - Changed from 1.282.0: saving a draft that has modules without
modules, or that has variants without any session namingvariants, now answers 422requiredonbody.modulesorbody.sessionsinstead of 409rejected. An emptymoduleslist removes all modules; a session withoutvariantsloses its variants as soon as another session names the field. - New when starting a care enrollment (
POST /care-enrollments):modules, the keys of the chosen modules. Parts of other modules do not go into the enrollment and sessions are renumbered; without the field none.GET /clients/{id}/care-plan-suggestionsnames the recommended ones. 422 onbody.modules:invalid_referencefor a key that is not part of the version,too_smallif fewer than two sessions would remain. Thecopycarriesmodules(the chosen ones) andmoduleKeyon phases and sessions, plusvariantModuleKeyon sessions (the module whose variant applies); the variants themselves are not in it.
v1.283.0 · October 30, 2026
- New on
GET /rule-cases:retainUntil, the end of a case’s retention period at the computing organization: ten years after its last event (computing or withdrawal), as with the record (§ 630f (3) German Civil Code). Nothing is deleted automatically.
v1.282.0 · October 30, 2026
- Changed behavior on
POST /care-plansandPUT /care-plans/{id}(spec unchanged): if a draft has modules or per-session variants (created in the app), saving without them is rejected with 409conflictandreasonrejectedinstead of silently removing them. Modules and variants in the template endpoints follow in a later version; suggestions carry them since 1.281.0 (modules).
v1.281.0 · October 30, 2026
- New on
GET /clients/{id}/care-plan-suggestions:whole(whether the whole template is recommended) andmodules, the template’s recommended modules withkey,nameandsources. A module is a part of a template (phases or sessions) that only goes into a care enrollment when recommended; a template also appears when only a module in it is recommended.
v1.280.0 · October 29, 2026
- New: judgements on hints from other organizations’ runs go back to the computing organization, with the reason and the partner organization’s name, without the person’s name; not when the connection is revoked or the case withdrawn.
PUT /care-sessions/{id}/foreign-hints/{runId}/{rule}answers withsent,foreignHintscarryjudgementSent. At the computing organizationGET /rulebooks/{id}/hint-statscounts them (accurate/notAccurateover all,fromPartnersthe partners’ share); newGET /rulebooks/{id}/hint-objections(client data,clients:read): the latest objections per rule with reason,byandfromPartner.
v1.279.0 · October 29, 2026
- New: hints from runs of other organizations in the cockpit.
GET /care-sessions/{id}/hintsreturnsforeignHints: per computing organization and rulebook the latest valid run on the record, withrunId,computedBy,rulebook,versionNumber,approvedBy,computedAt,reportIdand the same fields ashints.PUT /care-sessions/{id}/foreign-hints/{runId}/{rule}stores the judgement (judgement,reason,runHash; only a person, never automation or MCP, 403judgement-needs-person; a withdrawn run: 409conflictwithreasonrun-withdrawn). The judgement stays in your own organization.
v1.278.0 · October 29, 2026
- New: the PDF of a personal plan.
POST /personal-plans/{id}/pdfrequests it (202; only for released or withdrawn plans, a draft: 409conflictwithreasonnot-released),GET /personal-plans/{id}/pdfreads the state (status:none,pending,ready,failed, plusdocumentId); when done with a signed link (url,filename,expiresAt, valid for a few minutes). One PDF is created per state of the plan; after a withdrawal the state isnone, a new one carries the note. Client data, access log.
v1.277.0 · October 29, 2026
- New: personal plans from a partner organization’s case (computing across the boundary,
/rule-cases).GET /rule-cases/{id}/personal-planslists them,POST /rule-cases/{id}/personal-planscreates a draft from the result stored with the case (language,title); a withdrawn case: 409conflictwithreasoncase-withdrawn. WithPOST /personal-plans/{id}/releasea read-only copy goes into the record at the partner; if the record is gone there: 409partner-record-missing. - New on plans:
fromOrganization(copy from another organization, its name; otherwisenull),fromCase(created from a case) and on a single plandelivered(delivered to the partner).POST /personal-plans/{id}/withdrawalso withdraws a delivered copy; a copy can only be withdrawn by its source (409foreign-plan). When the computing organization withdraws the case (POST /rule-cases/{id}/withdraw), its plans no longer apply either.
v1.276.0 · October 29, 2026
- New: personal plans (client data,
biomarkers:*andclients:*, access log).POST /clients/{id}/personal-planscomputes a rulebook’s effective version (rulebookId, optionalreportId) and creates a draft with the recommendations from own catalogs and their texts (409no-recommendation,professional-only);GET /clients/{id}/personal-plans,GET/PATCH/DELETE /personal-plans/{id}(title,coverNote,remove,texts; drafts only, 409not-draft).POST /personal-plans/{id}/releaseand…/withdrawonly by a person with the right “Approve rules”, never automation or MCP (403release-needs-person,approve-right-missing); release only without gaps (409plan-incompletewithgaps). The organization’s notice:GET/PATCH /personal-plan-settings(setting it like releasing). - New on own catalogs:
professionalOnlyinGET/POST/PATCH /rulebook-catalogs…; entries of such catalogs never appear in a personal plan.
v1.275.0 · October 29, 2026
- New: own recommendation catalogs with texts.
POST /rulebook-catalogscreates a catalog (names,area:nutrition,exercise,sleep,mental,supplements,other; the key is derived from the first name and stays),GET /rulebook-catalogs/{key}reads it with all entries and texts,PATCH /rulebook-catalogs/{key}changes names, area, order orarchived. Entries:POST /rulebook-catalogs/{key}/entries(names,textsper language as HTML, sanitized on save) andPATCH /rulebook-catalogs/{key}/entries/{entryKey}. A name may appear only once in a catalog (422duplicateatbody.names); too many catalogs or entries 409too-many. - Changed:
GET /rulebook-catalogslists, besides the paths catalog, your own catalogs that aren’t archived (without archived entries). A rule recommends an entry like a path; a name of several words may also appear in the formula without quotation marks (recommendation(Sleep; calm breathing)).
v1.274.0 · October 29, 2026
GET /clients/{id}/care-plan-suggestionsnow also includes paths from other organizations' runs (rule-runs, the latest per computing organization and rulebook) if you have adopted their care plan: the suggestion is your own copy. New per source:computedBy(name of the computing organization, otherwisenull);rulebookIdisnullfor such sources. Care plans are adopted in the user interface only.
v1.273.0 · October 29, 2026
- New: computing across the boundary of an organization.
GET /rule-connections,POST /rule-connections(create a connection with your own rulebooks, therech_…code is returned once and can be redeemed for seven days),POST /rule-connections/redeem(redeem another organization's code,legalBasisConfirmed: trueconfirms the legal basis) andDELETE /rule-connections/{id}. Creating, redeeming and revoking ORG_ADMIN only; creating and redeeming only by a person, never an automation and never via MCP (403forbiddenwithreasonconnection-needs-person). - New:
POST /clients/{id}/rule-runshas the other organization compute via an active connection: only the values the rulebook's effective version reads travel, plus name, date of birth, age and sex; never from an automation (403request-needs-person). A run without formulas comes back:GET /clients/{id}/rule-runs,GET /rule-runs/{id}(result object as withcompute, rules with names, unit, groups and hint). The computing organization sees its cases underGET /rule-casesand withdraws one withPOST /rule-cases/{id}/withdraw(right “Approve rules”, only a person); the run at the partner then carriesstatus: withdrawn.
v1.272.0 · October 29, 2026
GET /rulebook-sourcesnow also lists grids and repeating groups of the forms on the client record: per grid cellanamnese:<block>.<row>.<column>(with a single columnanamnese:<block>.<row>), per choice column of a repeating group a setanamnese:<block>.<column>over all rows andanamnese:<block>.anzahl.POST /rulebooks/{id}/computereads them from the latest submission that answered the block, with corrections.- New:
GET /rulebook-catalogswith the catalogs rules give recommendations from, today the catalog of paths (weg: the care plan templates, key is the first version of a template). New:GET /clients/{id}/care-plan-suggestions(careplans:readandclients:read, client data, access log) with the paths the approved rulebooks suggest for a client, each with the rules and the latest released version (plan). A suggestion starts nothing; start withPOST /care-enrollments.
v1.271.0 · October 29, 2026
- Hints in the cockpit: every rule in the responses under
/rulebookscarrieshint({ color, action }withcolorred,goldorgrey, otherwisenull). When saving (PUT /rulebooks/{id}/draft/rules/{key},POST /rulebooks/{id}/draft/validate),hintsets the hint,nullremoves it, omitted keeps it. Only a rule that results in yes or no can be a hint (422 onbody.hint); the hint is part of the checksum. New:GET /rulebooks/{id}/hint-statswith the coaches' judgements per rule (accurate,notAccurate). - New in
careplans:GET /care-plans/{id}/rulebooks,POST /care-plans/{id}/rulebooks(attach a rulebook, only in a draft of an own care plan, otherwise 409plan-not-editable),PATCH /care-plans/{id}/rulebooks/{rulebookId}(active, always) andDELETE /care-plans/{id}/rulebooks/{rulebookId}.GET /care-sessions/{id}/hintsreturns the hints of a session (red, gold, grey,stateappliesorcannot-assesswithmissing, judgement,runHash;clients:read, access log).PUT /care-sessions/{id}/hints/{versionId}/{rule}stores the judgement (accurate, ornot-accuratewithreason), only by a person: never an automation, never an AI agent via MCP (403forbiddenwithreasonjudgement-needs-person).
v1.270.0 · October 29, 2026
GET /rulebook-sourcesnow lists, besides lab values and details of the person, the anamnesis from the record fields (anamnese:<key of the field>, for measurements with several partsanamnese:<key>.<part>) and the state of a care plan (plan:sitzung,plan:tag,plan:phase). Rules may read them.POST /rulebooks/{id}/computeincludes the anamnesis; it does not know the state of a care plan because it computes without a session: rules that need it come out as unknown (unknown).- Changed:
callMinutesinGET /affiliates/activitynow counts only the duration of conversations: calls with a finished call note that records more than a voicemail, or with a call guide and a result, and answered calls without a note of 30 seconds or more that are not a voicemail. Previously it counted the duration of every answered call, voicemails included, so values may be lower.callsis unchanged. - Changed:
PATCH /organizationrejects a change oftypetoBUSINESSorHOLDINGwith409 conflictandreason: organization-limitwhen the license package has no free place for another business or holding organization. This applies only to packages with a set number of organizations; existing licenses without such a number are not affected.
v1.269.0 · October 29, 2026
- New: rulebooks of the rule language under
/rulebooks(biomarkers:read,biomarkers:write), the same as in the app's “Rules” area. Reading and maintaining:GET /rulebooks,GET /rulebooks/{id}(with?version=a specific version),POST /rulebooks,PATCH /rulebooks/{id},DELETE /rulebooks/{id}andGET /rulebook-sources(what rules can read: lab values and details of the person, with names and units). Rules in the draft:PUT /rulebooks/{id}/draft/rules/{key}as a formula (formula, in the language of the request, as in the formula line) or as a tree (expression),POST /rulebooks/{id}/draft/validateas a dry run andDELETE /rulebooks/{id}/draft/rules/{key}. Every rule comes back as a formula in three languages and as a tree. Versions:POST /rulebooks/{id}/versions(draft as a copy of the effective one),DELETE /rulebooks/{id}/draftandPOST /rulebooks/{id}/draft/approve. - Approving (
POST /rulebooks/{id}/draft/approve) is only allowed for a person with the organization's “Rules” right (otherwise 403forbiddenwithreasonapprove-right-missing), never for an automation and never for an AI agent via MCP (403forbiddenwithreasonapprove-needs-person): approval is a physician's decision. A version with errors answers 422, one without rules 409version-empty. On approval a checksum over the rules is stored (checksum). - New:
POST /rulebooks/{id}/computewith{ clientId, rules? }(biomarkers:readandclients:read, plus client data enabled; the access is recorded in the access log) computes the effective version with the client's released lab values and returns the result object:values,inputs,groups,trace, the version withchecksumand approval, andhash. Without an approved version 409no-effective-version; if the rules no longer match their checksum, 409checksum-mismatchand nothing is computed. - Deprecated: the eight endpoints under
/biomarker-rule-sets(biomarkers.listRuleSets,getRuleSet,createRuleSet,validateRules,replaceRules,deleteRuleSet,confirmRuleSet,unconfirmRuleSet). They keep answering until 31 December 2026, with theDeprecationandSunsetheaders, and are removed afterwards. In the API MCP they are hidden as of this version. Their rule sets are not carried over; create rules under/rulebooks.
v1.268.0 · October 27, 2026
- Fixed:
POST /email-campaigns/{id}/report/fetch-reasonsnow also assigns bounces that SendGrid reports in the same second as the send (such as immediate rejections by Gmail). SendGrid keeps the time in its suppression lists in whole seconds; such entries were treated as before the send and counted underwithoutEntry.
v1.267.0 · October 27, 2026
- Changed: after Bounces and Blocks,
POST /email-campaigns/{id}/report/fetch-reasonsalso reads SendGrid's Invalid Emails list, but only for bounces that have no reason yet and no entry in Bounces; a match is stored like a bounce (typebounce,sourcesuppression-list). New in the response:read.invalidEmails. A restricted key needssuppression.invalid_emails.readfor this; if the permission is missing or SendGrid returns an error,read.invalidEmailsisnull(instead of 0 for read and empty or not needed), the reasons from Bounces and Blocks are kept and these mails count underwithoutEntry.
v1.266.0 · October 27, 2026
- New: the finder's basic settings
GET /finder/settings(finder:read:enabled,brandId,taxonomyCount) andPATCH /finder/settings(finder:write, body{ brandId },nullfor the organisation's default board). Only organisation admins may update (otherwise 403forbidden); if the finder is not switched on, 403feature-not-available; a board that does not exist in the organisation, 422validation-failedwithinvalid_referenceatbody.brandId. The boards come fromGET /sites/brands. New scopefinder:write: extend your keys if you want to set the setting.
v1.265.0 · October 27, 2026
- New: merge contacts
POST /contacts/{id}/merge(contacts:write). The contact in the path stays; the contacts inmergeContactIds(1 to 20, same type) are moved onto it with all their references and deleted; final.fieldSourcesnames, per field, the id of the participant whose value applies; tags are combined. Response{ contact, mergedContactIds, reassignedReferences }.409withreasontype-mismatch,bookings-on-multipleor one per block (client-records-on-multiple,practitioner-profiles-on-multiple,sales-profiles-on-multiple,company-profiles-on-multiple,marketplace-subscriptions-on-multiple,calendars-on-multiple). The same procedure as in the app. - New: event
contacts.contact.merged, once per merge, also from the app, with the surviving contact (contact, same form as incontacts.contact.updated),mergedContactIdsandreassignedReferences. There is nocontacts.contact.deletedfor the deleted contacts and nocontacts.contact.updatedfor the surviving one: move your records of the deleted ids onto the surviving contact. Until now, merging sent no event. - Changed: the two
409responses ofDELETE /contacts/{id}(in-use,client-record-retained) name the wayPOST /contacts/{id}/mergeindetail. - Changed:
contacts.contact.creatednow also fires for practitioners the Longevity Finder creates when reviewing a certificate, and for profiles taken over one at a time from another directory. Every new contact now fires it, whichever way it is created; bulk imports and bulk takeovers remain the exception (1.263.0), as do test cases claritos hands over to an organization for practice.
v1.264.0 · October 27, 2026
- New: campaign report
GET /email-campaigns/{id}/reportwith delivery, bounce reasons (SMTP code, SendGrid category, server response without email addresses), batches, providers, domains, consequences (block list, withdrawals, not counting the revocation of an import's consents), replies, clicks by link, opens and booked appointments; plus the halt with SendGrid's message (run.providerMessage,run.haltMeaning). Requests that were probably not a person (security filters, prefetches) are counted separately (botClicks,prefetches). - New:
GET /email-campaigns/{id}/recipients(cursor pagination, filtersgroup,batch,domain,provider,reasonType,smtpCode,reasonCategory,search,updatedSince) andGET /email-campaigns/{id}/recipients/{recipientId}with the history of all events, suppression, consent, replies (conversation, time and sentiment only), clicks, opens and appointments (appointmentId,appointmentTypeId,appointmentTypeNamein the organization's main language,statusas inGET /appointments). Both also requirecontacts:read. - New:
POST /email-campaigns/{id}/report/fetch-reasonsfetches bounce reasons from SendGrid's suppression lists (nothing is changed at SendGrid; repeatable);409with reasonsendgrid-suppression-forbiddenif the key may not read the lists. New:GET/PUT /email-campaigns/trackingwithclicksPerPerson(clicks per person or per link only, organization setting; admins only can change it). - New: events
campaigns.email.clickedandcampaigns.email.opened, only for requests that probably came from a person; sent about eight seconds after the request, so that a security filter opening all links of an email at once is detected first.occurrenceisfirstfor a recipient's first click on this link or their first open, otherwiserepeat.contactId,recipientIdandoccurrenceare only included if the organization counts clicks per person (otherwisenull); if it counts per link only, claritos filters programs without a browser, too early requests andHEAD, but not bursts, since no request carries a person. Both are automation triggers, with a filter on one campaign and onoccurrence. Changed: campaigns have the fieldmeasureOpens(measure opens with an own image, default off), readable and settable on create and update.
v1.263.0 · October 27, 2026
- Changed:
contacts.contact.creatednow also fires for these new contacts: a new buyer from a checkout (also when a licence is set up), in the affiliate programme (approving an application, closer service, team in the partner portal, an additional person from the application form, an adopted prospect), a contact person adopted from a letter, a new business partner when a receipt is created, and relatives a customer adds in the portal. If the new contact carries tags,contacts.tag.addedfires for each tag, as withPOST /contacts. If an existing contact is used, no event fires. - Changed: bulk takeovers no longer send events, neither
contacts.contact.creatednorcontacts.tag.added: the takeover of Stripe customers, DATEV master data and the portal's partner list in accounting, and the credits master data import, including viaPOST /credits/import-profiles/{id}/master-data. Previously one event fired per new contact, and a single run often creates hundreds. This also applies to the contact person such a takeover creates when a person with a VAT ID becomes a company. If claritos instead splits an existing contact this way (matching to DATEV, a changed VAT ID in the partner list, sorting sole proprietorships, the contact form),contacts.contact.createdstill fires for the new contact person. If you need these contacts, read them after the run withGET /contacts.
v1.262.0 · October 27, 2026
- Changed:
contacts.contact.creatednow also fires when a form creates a new contact: submissions through a form link (/f/…), a funnel form orPOST /forms/{id}/responses, a personal link (POST /forms/{id}/personal-links), and company and sales-rep profiles. Previously only contacts created by hand, throughPOST /contactsand from documents fired it. If the form finds an existing contact, no event fires. The rule: every new contact fires, bulk imports do not; further creation paths follow and will be listed here.
v1.261.0 · October 27, 2026
- New: a form's licence logo in two steps,
POST /forms/{id}/license-logo/upload(signed URL) andPOST /forms/{id}/license-logo/confirm(only then does the form show the logo; if the file has not arrived: 422 atbody.storageKey), removed withDELETE /forms/{id}/license-logo;GET /forms/{id}includeslicenseLogoUrl.POST /forms/{id}/personal-linkscreates or finds the contact from a person's details (valueswithstd:fields, optionaldocumentId) and returns a prefilled link valid for seven days (url,contactId,validUntil; 201, requiresforms:writeandcontacts:write). New reasontarget-not-supported(409) for forms whose target has no personal link. Archived forms: 409archivedfor all four.
v1.260.0 · October 27, 2026
- New:
PATCH /forms/{id}changes a form's settings like the form builder (name, address form, public link, portal,consentMode, display, address finder, licence note, completion); slug, target, pages and consents are still set withPUT(sending them returns 422invalid_combination); an archived form returns 409archived.GET /forms/{id}/share-linkreads andPOST /forms/{id}/share-linkcreates the organization's share link (repeatable; new reasonpublic-access-disabled, 409).GET /forms/{id}and the responses ofPOST /forms,PUT /forms/{id}and inserting a template include the settings:showProgress,showSummary,showFieldLabels,showClientHeader,reminderService,recognitionCard,translateResponses,thirdPartyMode,addressFinderMode,addressFinderPlaceholder,licenseLabel,completion. Changed:publicUrlinGET /formsandGET /forms/{id}is now only the organization's link; previously it could be an affiliate's referral link, attributing every submission through it to that affiliate. Without an organization link it isnull.
v1.259.0 · October 26, 2026
- New events
contacts.websiteAnalysis.completedandcontacts.websiteAnalysis.failed, exactly once per website analysis run, including runs from the portal, call guides, meetings and the API. ThewebsiteAnalysispayload carries only identifiers and state:contactId(requested),targetContactId(holding the result),topicId,topicName,language,source(app,portal,callGuide,meeting,api),userId,partnerContactId,affiliateId,startedAt,finishedAt; forcompletedalsopagesReadandunverifiedQuotes, forfailedthe fixedreasonas infailure.reasonof the GET. No page or result text: the result comes fromGET /contacts/{id}/website-analysis. Available as automation triggers with filters on source and reason.
v1.258.2 · October 26, 2026
- Changed: website analysis no longer has an enablement switch.
enabledis dropped from the responses ofGET/POST/PUT /contacts/{id}/website-analysisandGET/PUT /website-analysis/settings, and starting no longer answers403 feature-not-available. 1.258.0 and 1.258.1 were never in production.
v1.258.1 · October 26, 2026
- Changed:
POST /contacts/{id}/website-analysisuses the organization's language whenlanguageis omitted (ifde,enorru, otherwisede) and answers403 feature-not-availablebefore any other check while the feature is not enabled in the environment.
v1.258.0 · October 26, 2026
- New: website analysis on the contact.
GET /contacts/{id}/website-analysis(contacts.getWebsiteAnalysis) reads conversation starters from the contact's website (currentas HTML with the pages read,running,failure,history,dailyLimit); for a partner's prospect the result is kept on the company contact (targetContactId).POST(contacts.startWebsiteAnalysis, 202) starts it withtopicIdandlanguage,PUT(contacts.updateWebsiteAnalysis) saves a version by hand; both require an acting user. Errors: 422precondition-failedwithreason: no-websiteordaily-limit-reached, 409analysis-running, 403feature-not-availablewhile the feature is not enabled in the environment. - New:
GET/PUT /website-analysis/topics(contacts.listWebsiteTopics,contacts.setWebsiteTopics) reads and replaces the topic prompts of the organization or, withcampaignId, of an affiliate campaign (name,prompt,isDefault, at most 20, one default).GET/PUT /website-analysis/settings(contacts.getWebsiteAnalysisSettings,contacts.setWebsiteAnalysisSettings) reads and sets the daily limit (dailyLimit0 to 500). Changes ORG_ADMIN only.
v1.257.0 · October 26, 2026
- Call guides:
nextCallGuideIdon points and answers in thecontentof/call-guides(read and write), “continue with call guide …”. The exit then becomes an end: the run completes with its result, and the target guide starts in the same call. Anextother thannullalongside it returns 422invalid_combinationat that exit; a target that is not an active call guide of the organization returns 422sprung-ziel-unbekannt. - Event
callguides.run.completed:guideRun.previousRunId(the run this one was continued from with “continue with call guide …”, otherwisenull) andguideRun.nextGuideId(the target call guide if the run ends with a jump, otherwisenull).
v1.256.0 · October 26, 2026
- Custom fields:
GET /organization/custom-fields(with folders),POST /organization/custom-fields,PATCH /organization/custom-fields/{id},POST /organization/custom-fields/{id}/archiveand/unarchive. Reading withorganization:read, writing withorganization:writeand ORG_ADMIN. Slug, type and entities are fixed after creation (422immutable); options carry a fixedkey, and renaming via the key leaves stored values untouched. New reasonscustom-field-slug-takenandsystem-field(both 409).
v1.255.0 · October 26, 2026
- Pipelines (PI.37): stages carry
partnerRights(view,moveIn,moveOut,edit,delete), readable and writable via the stage endpoints (only as a whole; withoutviewno other right). For a closing stagemoveInmeans closing andmoveOuttaking up again.partnerVisibilitystays readable (derived from the rights) and writable (converted into rights, neverdelete);partnerRightstakes precedence.
v1.254.0 · October 26, 2026
- Pipelines (PI.31, call list):
callList.businessOnly(businesses and freelancers only, B2B; the dialer never asks for consent in this pipeline, a withdrawal still blocks), writable viaPATCH /pipelines/{id}. Every change is logged;callList.businessOnlyChangenames the latest (at,via,userId, read-only).
v1.253.0 · October 26, 2026
- Pipelines (PI.28, call list): stages carry
onCallList(cards in the open stage are on the call list), pipelinescallListwithbusy(followUpwithbusyFollowUpMinutesorend),noAnswerRetryMinutes,ringSeconds,hours(days1–7,from,to) andfirstCallStageId; writable viaPATCH /pipelines/{id}(callList, partial) and on stages (onCallList). The list itself is dialed by the dialer in the portal or CRM.
v1.252.0 · October 25, 2026
- Pipelines (PI.27): new
GET /pipelines/lead-quality(from,to, optionalpipelineId): entries of the sales pipelines created in the period, per source (kindform/funnel/existing withsourceIdandname, otherwisevia) and per campaign (utmCampaign,utmSource) withleads,open,parked,won,lost,unqualifiedand the sharesunqualifiedShare,wonShare(0 to 1 of all leads of the group).
v1.251.0 · October 25, 2026
- Pipelines (PI.26): entries carry
leadSource(form,funnelorexistingfor existing prospects, withsourceIdandutmfrom the funnel visit:source,medium,campaign), for new entries from now on. NewGET/POST /pipelines/{id}/backfill: backfill of the required pipeline, adds prospects of the released partners without an open or parked entry to the first stage (running/finished/failed,candidates,created,failed); also starts by itself whencouplings.prospectsRequiredis switched on. Without the requirementprecondition-failed(prospects-not-required), while one runsconflict.
v1.250.0 · October 25, 2026
- Call guides (Telephony TW.48b):
notReached[].cardStatusEventacceptsabsence(out-of-office message); the situation template sets it on the absence situation. The values follow the pipelines' card status triggers (PI.22b).
v1.249.0 · October 25, 2026
- Pipelines (PI.22b): new card status trigger
absence(call: out-of-office message) next tobusy,noAnswer,voicemailandinvalidNumber, on card statuses (trigger), in thepipelines.entry.cardStatusChangedevent and assituationofPOST /pipelines/entries/{id}/outcome(one attempt, no stage move).
v1.248.0 · October 25, 2026
- Pipelines, sales process (PI.25): stages name
appointmentTypeIdsand arole(preSetter,setter,closer). When an appointment of a named type is booked, rescheduled, cancelled or missed for the contact of an open entry, the card status follows; on a booking the host becomes responsible and holds the role of the stage, whoever was responsible until then holds the role before. New requirement kindappointmentwithappointmentTypeId(null= any type). Entries carrybookedAppointmentTypeIdsandroles(person, name, appointment). An unknown appointment type returnsinvalid_reference.
v1.247.0 · October 25, 2026
- Call guides (
/call-guides, read and write):content.results[].pipelineEffectwithpipelineId,stageId,reasonId,packageId,cardStatusIdis the result’s effect in the pipeline on completion.content.notReached[].cardStatusEvent(busy,noAnswer,voicemail,invalidNumber, the same values astriggerinpipelines.entry.cardStatusChanged) is the event with which a situation sets the card status. Until now the API showed neither, and aPATCHwithcontentdropped them.
v1.246.0 · October 25, 2026
- Pipelines, sales process (PI.24):
POST /pipelines/entries/{id}/outcomerecords an outcome on the card: card status, stage with reason (same requirements asmoveEntry), package and follow-up in one call, ornotReachedwithsituation(busy,noAnswer,voicemail,invalidNumber): one attempt, never a stage move. Entries carryattemptsInStageandlastAttemptAt(every stage move resets attempts to 0). New pathguideinvia(outcome of a guide) in the history and inpipelines.entry.stageChanged/cardStatusChanged.
v1.245.0 · October 25, 2026
- New:
GET /contacts/{id}/phone-consentandPUT /contacts/{id}/phone-consent(contacts.getPhoneConsent,contacts.setPhoneConsent): the contact's consent to phone calls, separate from email and SMS. Response withstate(granted,revoked,none),since,number,callable(yesdial: company or documented consent;askask first: consumer without consent;nodo not dial: revoked, companies included) andhistorywithreasonandby(userIdorcontactId,name).PUTtakesgranted,reason(required, at most 2,000 characters) and optionallynumber, only with an acting user (no-acting-user); a non-member gets 403. - New:
GET /contacts/{id}/reminder-service(contacts.getReminderService) andPOST /contacts/{id}/reminder-service/unsubscribe(contacts.unsubscribeReminders): whether the contact may receive appointment reminders by email and SMS (email,sms, each withstate,value,since), and unsubscribing from both channels, repeatable, only with an acting user who is a member.
v1.244.0 · October 25, 2026
- Automations: the trigger
pipelines.entry.cardStatusChangedhas the filter “card status: one of”, listed in the catalog (GET /automation-catalog) as pathtoCardStatus.idwithkindpipelineCardStatus. It is stored likepipelineStageas a list of IDs (the new card status); IDs that do not belong to the organization or to the selected pipelines are rejected on save.
v1.243.0 · October 25, 2026
- Call guides: (1)
callguides.run.completednow fires on the first explicit completion of a run (“complete call”) with the result the person chooses (resultId/resultName), no longer by itself once the main path reaches its end; still once per run, reopening and completing again report nothing. (2) Newcontent.notReachedon/call-guides(read and write): “not reached” situations withid,nameandsuggestion(hours,businessDays,manual,none). A completion with such a situation reports nocallguides.run.completed; a later completion with a result reports once. Until now the API did not show the list, and aPATCHwithcontentdropped it. (3) A checkout action may carrylinks: []: then only the pipeline entry’s checkout link applies; if the entry carries one, it wins even over the action’s own links. A checkout action is now incomplete only withouttemplateId.
v1.242.0 · October 25, 2026
- SendGrid feedback (SV.198):
POST /sendgrid/eventsnow creates only ONE webhook per SendGrid account. If the account already has one from claritos (for example from another organization on the same account), the connection attaches to it; further ones are merged. New reasons in422 precondition-failed:sendgrid-webhook-limit(the SendGrid plan allows no further webhook) andsendgrid-webhook-forbidden(SendGrid rejected the key for webhooks); both used to come assendgrid-events-failed, which now carries SendGrid's reason indetail.checkErrorcan now besendgridVerbindung.fehler.ereignisseTariforsendgridVerbindung.fehler.ereignisseRecht. Events only reach the organization whose email they concern: bounces of another organization on the same account no longer block an address.
v1.241.0 · October 25, 2026
- Pipelines, sales process (PI.23): packages. Pipelines carry
packages(name, article, checkout link,default),PUT /pipelines/{id}/packagessaves the whole list (at most one default, missing ones archived, org admins only). Entries carrypackageId,packageNameandcheckoutLinkId; setpackageIdinPOST /pipelines/entries,PATCH /pipelines/entries/{id}andmoveEntry(article and net value from the package unlessvalueCentsis in the same call). New requirement kindpackage(pathbody.packageId). The default is not written to new entries on its own. - Pipelines, support (PI.19b): a released SLA credit goes to invoicing and appears as a “discount” on the next subscription invoice or the next manual draft. New
slaCredit.statusscheduledwithscheduledAt; if the handover fails, it staysreleasedwithhandoverError, andPOST …/sla-credit/releasetries again.
v1.240.0 · October 23, 2026
- Pipelines, sales process (PI.22): card status, where things stand on the card independent of the stage. Pipelines carry
cardStatuses(name, colour, order,trigger), entriescardStatusandcardStatusSince. New:PUT /pipelines/{id}/card-statusessaves the whole list (missing ones are archived, org admins only),GET /pipelines/{id}/card-statuses/reportreturns open entries and time per stage and card status plus the changes in the period.PATCH /pipelines/entries/{id}setscardStatusId(null = none),GET /pipelines/entriesfilters bycardStatusId(none= without). New eventpipelines.entry.cardStatusChangedwithfromCardStatus,toCardStatus,triggerandvia; creation emits none,createdalready carries the status.
v1.239.0 · October 23, 2026
- New:
POST /invoices/{id}/collectcollects an open subscription invoice right away from the subscription's card or direct debit mandate instead of waiting for the daily run. Responseresult:charged(card charged, confirmation via webhook) orsubmitted(direct debit submitted, paid once the money arrives). 409 withreasonnot-collectable,skippedorcollection-failed.
v1.238.0 · October 23, 2026
- New: complete a session of a care enrollment (practice BP.3a).
POST /care-sessions/{id}/completecompletes the session and its guide in one go: first the run withguide.outcomeId(required if the guide has outcomes) andguide.reasons(a reason per open required step; if one is missing, 422 with pathbody.guide.reasons.<step>); if that fails, the session stays open.POST /care-sessions/{id}/reopenreopens both. New fieldcompletedAt. Changed:runningis false after completion (before: four hours from the start), andstarton a completed session answersconflictwithsession-completed.
v1.237.0 · October 23, 2026
- Pipelines, sales process (PI.21): fourth closing type
parked(added per pipeline viaPOST /pipelines/{id}/stageswithtype: "parked", at most once). Parking requires a reason andfollowUpAtin the future, otherwise 422 with the pathbody.followUpAt(kindfollowUpincheckMove). Entries carryfollowUpAt; every move sets it anew. The forecast statesparked(count, value) and does not count parked entries. The triggerpipelines.entry.closedalso filters onoutcomeparked.
v1.236.0 · October 23, 2026
- Appointment types carry
callGuideId: the call guide (GET /call-guides) suggested during calls and meetings of this type. Read viaappointments.getType/listTypes, set viacreateType/updateType(nullfor none). Only an active call guide of this organization, otherwisevalidation-failedatbody.callGuideId.
v1.235.0 · October 23, 2026
- Changed:
PATCH /contacts/{id}carries a changed email or phone number over to the partner prospects linked to this contact, and rejects instead of letting contact and prospect drift apart: 409conflictwithreason: prospect-email-takenif another prospect of the organization already has the new email; 400validation-failedatbody.email(required) if the email of a prospect without a company name would be cleared; 409reason: prospect-not-savedif the prospect could not be saved. In all three cases the contact is unchanged. Unchanged fields trigger nothing.
v1.234.0 · October 22, 2026
- Pipelines, closing in support (PI.19): stages carry
noReply(remindAfter,closeAfter,unitbusinessDaysordays): reminder and closing without a reply in a stage with a paused clock, both with a short email to the customer (channelsystem). Entries carrynoReplyRemindAt,noReplyCloseAt,previousEntryId(a reply more than 14 days after closing creates a new case; within 14 days it reopens the old one) andslaCredit(credit once per case with a breached target, with a structuredcalculation). NewPOST /pipelines/entries/{id}/sla-credit/releaseand…/discard(ORG_ADMIN, ORG_ACCOUNTANT; 409sla-credit-decided,sla-credit-zero). The source of a message via the API is nowhumanwith a person's OAuth access,aivia the API MCP, otherwiseautomatic. The forecast statesvalueModeandrisk; support pipelines return the expected credits there as negative values instead ofnull.
v1.233.0 · October 22, 2026
- Pipelines: two names from 1.229.0 aligned with the rule for count fields before they ship: on the SLA
caseCountinstead ofcasesCount, in the entry'sslaTargets[]breachCountinstead ofbreaches.
v1.232.0 · October 22, 2026
- Forms:
POST /responses/{id}/pdfrequiresforms:writeinstead offorms:read, like every endpoint that renders a PDF (invoices.renderPdf,orders.renderPdf,time.renderReportPdf): it creates a document and starts the rendering. The status (GET /responses/{id}/pdf/{documentId}) stays atforms:read. 1.231.0 was never released withforms:read.
v1.231.0 · October 22, 2026
- Submission PDF through the API:
POST /responses/{id}/pdfrenders the PDF on the organization's letterhead (202 withdocumentId,statuspending),GET /responses/{id}/pdf/{documentId}returns the status (pending,readywithurl,failed),POST /responses/{id}/pdf/{documentId}/sendemails it to the client of the record. Client-record forms only with client-data release,clients:readand client-record access of the acting person; without client-record access 403forbiddenwithreasonclient-access-required(now also forPOST /form-templates/{id}/insert). Sending: 422not-a-client-formorcontact-without-email, 409pdf-not-ready.
v1.230.0 · October 22, 2026
- Form library templates through the API:
GET /form-templates(own ones and those provided by other organizations, filtertargetEntity, searchq),GET /form-templates/{id}(preview in the form of addressaddressForm),POST /form-templates/{id}/insert(new form from the template, 201 with the definition andnotes),POST /form-templates(provide an own form, withtemplateIdas a new version) andDELETE /form-templates/{id}(own only; inserted forms stay). Reading withforms:read, writing withforms:writeand only for organization admins; a client-record template only with client-record access (forbidden) and a practice profile (feature-not-available).targetEntityinGET /formsandGET /forms/{id}now lists all four targets (alsoVERTRIEBLER_PROFILandVERTRIEB_FIRMENPROFIL); the responses already carried them, the description was missing.
v1.229.0 · October 22, 2026
- Pipelines, support with SLAs (stage 4): new
/pipelines/slas(read, create, update witharchived, delete only when unused, otherwise 409sla-in-use) with calendar (weeklyHourslike the opening hours), deadlines per kind (firstResponse,nextResponse,update,restore,resolution) and priority with an explicit unit (minutes,hours,businessMinutes,businessHours,businessDays), consequence as a capped credit, customers. NewGET/POST /pipelines/entries/{id}/messages(a reply to the customer goes out by email; the server derivessource, via the APIautomatic). Entries carrydescriptionHtml,priority,requestedPriority,sla,slaStatus,slaDueAt,slaTargets,restoredAt(writable: description, priority,restored), stagesslaClock, pipelinescustomerPortalRequests. Eventspipelines.entry.slaDueSoon,pipelines.entry.slaBreached,pipelines.message.created. New reasonnot-a-support-case.
v1.228.0 · October 22, 2026
- Replace forms through the API:
PUT /forms/{id}replaces a form as a whole with the same body asPOST /forms(header with defaults where nothing is given, pages, elements). What the body does not know stays (releases, links, completion, display); existing submissions stay readable. Response 200 with the definition andbuild.targetEntitycannot be changed (422 atbody.targetEntity); an archived form returns 409conflictwithreasonarchivedas inPOST /forms/{id}/responses, a slug of another form 409form-slug-taken. Organization admins only, scopeforms:write. The reasonarchivednow has a text on the errors page.
v1.227.0 · October 22, 2026
- Create forms through the API:
POST /formscreates a form as a whole (header, pages, elements bykind:text,standardField,fieldwithnewfor a new custom field,matrix,repeater; conditions incondition; checkboxes inconsents), through the same builder as the form builder. Response 201 with the definition as inGET /forms/{id}plusbuild(createdFields,reusedFields,notes).POST /forms/validatechecks the same body without saving (valid,errors,notes, planned pages, elements and fields).GET /forms/building-blockslists standard fields, existing custom fields, field types for new fields, the condition syntax and the layout of matrix and repeater. Organization admins only (otherwise 403forbidden); scopeforms:writeto create,forms:readto validate and for building blocks. Errors 422validation-failedwith pathbody.pages.<i>.elements.<j>…(indexes from 0) and codeinvalid_reference,required,invalid_value,invalid_combinationortoo_big; a slug that is taken returns 409conflictwithreasonform-slug-taken(an error with this code in the dry run). Client-record forms only with a practice profile.
v1.226.0 · October 22, 2026
- Forms:
POST /forms/{id}/archiveandPOST /forms/{id}/unarchivearchive a form or restore it, as in the form builder (scopeforms:write, organization admins only, otherwise 403forbidden; a key without an acting person getsno-acting-user). Response 200 with the form; a second call changes nothing. An archived form accepts nothing through its links,POST /forms/{id}/responsesreturns 409 (archived). New inGET /forms/{id}:consentMode, the consent mode of the form (none,optional,promotion).
v1.225.0 · October 22, 2026
- Partner keys (lead API): besides the organization's keys there are keys bound to exactly one partner (affiliate), issued by the partner in the partner portal or by an admin of the organization. A partner key only calls
GET /forms/{id},POST /forms/{id}/responsesandPOST /appointment-types/{id}/partner-links, otherwise 403forbiddenwithreasonpartner-key-endpoint; the API MCP does not accept it. It always submits for its own partner (anotheraffiliateIdreturns 422 atbody.affiliateId, codepartner-affiliate), sees only forms released for the partner portal that create prospects (otherwise 404), and only its partner's prospects. InGET /forms/{id},responseCountthen counts only its partner's submissions andpublicUrlisnull. Guide: /developers/partner-leads.
v1.224.0 · October 22, 2026
- Email campaigns in two kinds (
kind:marketingornotice). A notice goes without marketing consent and without an unsubscribe link to everyone in the selection, takes templates withpurposetransactional and needs no check before starting (deepCheckRequired). The content now lives in the campaign:subject,bodyHtml,subjectInformal,bodyHtmlInformalandsalutation, copied from the template and editable without changing the template (templatewithmodified). Alsodocument(a document as a personal link per recipient,linkExpiresDays) andattachment(PDF up to 5 MB).GET /email-campaigns/setuplistskinds,personalSenderandkindper template;GET /email-campaignsfilters bykind,POST /email-campaigns/recipient-counttakeskind. New:POST /email-campaigns/{id}/document/replace(corrected version, the links stay) andGETandPUT /email-campaigns/notice-permissions(who besides the admins may send notices). Members with this right see only notices through the API and send from their personal SendGrid address (senderLocalPartandsenderDomainmay then be omitted); for admins nothing changes.kindcannot be changed after creation (422immutable). New errors: 422unknown-fieldatbody.bodyHtmlfor fields that don't exist, 403campaign-kind-not-allowed, 422notice-sender-missing,download-links-not-configuredandcampaign-document-missing.
v1.223.0 · October 22, 2026
- Forms: two values of
bookingErroronPOST /forms/{id}/responsesnow matchappointments.createPartnerLink(1.220.0):prospect-without-contactinstead ofcontact-missingandappointment-type-not-released-to-partnerinstead ofappointment-type-not-released. The old names from 1.221.0 were never released.
v1.222.0 · October 22, 2026
- New alert kind
AUTOMATION_RUN_HALTED(inGET /organization/api-alertsandPUT /organization/api-alerts/rules/{kind}): when an automation halts a run for a fixable reason (precondition-failedwithfixable: true), it notifies the owner and org admins through the bell, by email if configured, at most once per rule and reason within 24 hours. Missing required details of a pipeline stage are the exception: they still create a task.
v1.221.0 · October 22, 2026
- Forms:
POST /forms/{id}/responsesoptionally takesappointmentTypeIdandsenderContactId. With an appointment type the response additionally containsbookingUrl, the personal partner booking link of the new prospect (books with the affiliate without entering data again), orbookingError, why there is none:prospect-not-found(no prospect, e.g. without an affiliate),contact-missing,appointment-type-not-released,sender-not-in-team,booking-failed. If only the link fails, the submission remains (201). This additionally needs the scopeappointments:write, otherwise 403insufficient-scopebefore submitting. With a partner key the link only works for prospects of its own affiliate. WithoutappointmentTypeIdthe response is unchanged.
v1.220.0 · October 22, 2026
- New:
POST /appointment-types/{id}/partner-links(appointments.createPartnerLink) returns, given aprospectId, the partner's personal booking link for that prospect, existing or new (kindPARTNER, withcontactId,affiliateId,senderContactId). Same rules as in the partner portal: only appointment types released to the partner, sender from the partner's team (optionalsenderContactId, otherwise the prospect's responsible person or the partner's owner). New reasons forprecondition-failed:prospect-without-contact,appointment-type-not-released-to-partner.
v1.219.0 · October 22, 2026
- Pipelines: the forecast scenarios are named
worst,normal,best(inforecast.months[].weightedCents, in the buckets and in the stages'effectiveProbability), the writable stage fieldsprobabilityWorst/probabilityBest. They replacebad/goodandprobabilityBad/probabilityGoodfrom 1.218.0, which was never released.
v1.218.0 · October 22, 2026
- Pipelines, forecast and learning: new
GET /pipelines/{id}/forecast(twelve months from the current one, weighted value per month in the scenariosbad,normal,good, bucketsoverdue,withoutDate,later, measured share, date source; per open stage effective probability, time in stage and time to close;forecastisnullwithout value moderevenue). Stages carryeffectiveProbability(effective probability underlearningModewith scenarios,measuredPercent,decidedCases) andprobabilityBad/probabilityGood(scenarios set by hand, writable withPOST/PATCH .../stages). Behavior:learningModenow takes effect; an entry'sprobabilityandweightedValueCentsuse the stage's effective probability instead of the default when not overridden (unchanged withlearningModedefault).
v1.217.0 · October 22, 2026
- Pipelines:
couplingscarriesprospectsRequired(affiliates' prospects are tracked in this pipeline; when an affiliate works on one without an entry, the portal asks to assign it) andprospectsAutomatic(create in the entry stage without asking), readable inGET /pipelines/{id}, writable withPATCH /pipelines/{id}.
v1.216.0 · October 22, 2026
- Automations: three new actions for pipelines in the catalog (
GET /automation-catalog) and inPOST/PATCH /automations, one endpoint each:pipelines.createEntry(create entry),pipelines.moveEntries(set stage, also closing with a reason; the contact's most recent or all open entries, or a specific one) andpipelines.updateEntry(value, responsible person, close date). A stage's required details apply here too: if one is missing, the step fails as fixable. New filter kindspipelineandpipelineStage("one of") on thepipelines.entry.*triggers,outcomeon closing. New date sourcespipelines.entry.expectedCloseDateandpipelines.entry.rotting(entry has been in its stage too long). Field sourcespipeline,pipelineStage,pipelineReason, objectentry. Fixed: "one of" filters did not apply to date triggers until now.
v1.215.0 · October 22, 2026
- Pipelines, couplings: pipelines carry
couplings(quoteValue,quoteAcceptedStageId,paidMeansSuccessful,leadSources), readable inGET /pipelinesandGET /pipelines/{id}, writable withPATCH /pipelines/{id}(leadSourcesreplaces the list as a whole). NewGET /pipelines/assignmentsandPOST /pipelines/assignments/{id}/resolve: open assignments of payments, accepted quotes and leads to an entry when the entry is not unambiguous. NewPOST /pipelines/entries/movefor automations: set the stage for a specific entry, the most recent open one or all open ones of a contact; all or nothing, missing details asprecondition-failedwithstage-requirements-missingandfixable: true.
v1.214.0 · October 22, 2026
- Pipelines: stages have an optional
color(one of the twelve category colours, likecolorin call guides;null= no colour), readable inGET /pipelines/{id}and settable withPOST /pipelines/{id}/stagesandPATCH /pipelines/{id}/stages/{stageId}. The pipeline carriesstageColorDisplay(dot= dot next to the name,fill= header in full colour), defaultdot, settable withPATCH /pipelines/{id}.
v1.213.0 · October 21, 2026
- New: lesson media for the live room (domain
appointments).GET/PUT /appointment-types/{id}/lesson-mediareads or replaces the appointment type’s list (assetIds, at most 50, order =position).GET/PATCH /appointments/{id}/lesson-mediashows the appointment’s effective list (media) and its deviations (added,hidden);addadds items for this appointment only,hidehides items of the appointment type, a field that is set replaces its list. After the appointment has ended, 422precondition-failedwithappointment-ended.GET /lesson-media/optionssearches library videos and PDFs (q). Writing requires the right to manage appointments.
v1.212.0 · October 21, 2026
- Forms, behaviour only, for submissions through the public link (
/f/…): if the person is securely known (personal link to a contact, remembered device or an email address confirmed by code) and an advertising consent for exactly the address or number in the field exists that is at most 24 months old and not withdrawn, the form does not ask again. The submission (GET /forms/{id}/responses,GET /responses/{id},forms.response.submitted) then carries no entry withpurposeMARKETINGfor this channel; that is not a no, the consent state is kept on the contact. A ticked checkbox appears as before. Submissions throughPOST /forms/{id}/responsesare not affected.
v1.211.0 · October 21, 2026
- New: pipelines (domain
pipelines, scopespipelines:readandpipelines:write).GET/POST /pipelines,GET/PATCH /pipelines/{id}, stages (/pipelines/{id}/stages, order viaPUT …/stages/order) and closing reasons (/pipelines/{id}/reasons); only org admins maintain pipelines and stages. Entries under/pipelines/entries: create, update,move(also closing),move/check,reopen,history. Moving applies the same requirements as the app, added up when skipping: if something is missing you get 422 with onestage-requirementerror each; locked givesprecondition-failedwithstage-skip-lockedorstage-back-locked(fixable: false), an archived pipelinepipeline-archived(fixable: true). Eventspipelines.entry.created,.stageChanged,.closed,.valueChanged. Amounts asvalueCents. AlsoDELETE /articles/{id}: 409in-useas well when pipeline entries take their value from the article (usage.pipelineEntries).
v1.210.1 · October 21, 2026
- Behaviour: the
molliesource of the subscription forecast (/provider-subscriptions) returns figures as soon as the organization has connected Mollie with thesubscriptions.readpermission (new connections request it, existing ones reconnect once). Subscriptions of all the organization's Mollie profiles are read, synced nightly and viaPOST /provider-subscriptions/sync;netCentsstays empty (Mollie gives no net amount). Until the reconnect it staysneeds-reconnect. Specification unchanged.
v1.210.0 · October 21, 2026
- New: subscription forecast for subscriptions created at the payment provider itself (not claritos's own under
/subscriptions).GET /provider-subscriptionslists the mirror (filtersource:stripe-connect,stripe-platform,mollie;status;contactIdvia the e-mail).GET /provider-subscriptions/forecastreturns per currency this month from today and the next eleven months, gross or withnet=truenet, and per sourcestate,syncedAt,needsReconnect.POST /provider-subscriptions/syncstarts the sync (202; 409sync-lockedwithretryAfter, 409source-not-ready). Scopessubscriptions:readandsubscriptions:write. Mollie reportsneeds-reconnectuntil the organization has reconnected Mollie with access to subscriptions.
v1.209.0 · October 21, 2026
- Changed:
GET /affiliates/activitynow also counts emails sent from the partners' mailboxes in the partner portal (mail client and talk guides) underemails, including per person (people[].counts.emails, previouslynull). Only time, person and number of recipients are kept, no content; counted from the introduction. Marketing material sends only count up to the organization's first such record, otherwise the same email would appear twice. The example is corrected:previousPeriodhas the same length asperiod.
v1.208.0 · October 21, 2026
- New: subscription directly from the first invoice. Invoices have the field
subscription(intervalMonths1 to 60,periods2 to 600 ornull= until cancelled;null= no subscription), readable and writable viaPOST /invoicesandPATCH /invoices/{id}. On issuing (POST /invoices/{id}/issue) the subscription is created and the invoice is its first period (billingContractId); the service period is set to that period. Errors: 422 atbody.subscription…,body.contactIdorbody.items, 409subscription-exists. - New: subscription status
AWAITING_FIRST_PAYMENT(GET /subscriptions, filterstatus): created from an invoice, first invoice still open. Once paid, the subscription changes toACTIVEand due follow-up invoices are created right away; cancelling the first invoice sets it toCANCELLED. Clients that only know the previous four values should not treat an unknown status as running.
v1.207.0 · October 21, 2026
- New:
GET /affiliates/activityreturns affiliate activity like the dashboard card: calls and talk time, meetings (appointments and live rooms), sales with revenue per currency, new prospects, messages (email, SMS, letter) and completed tasks, per affiliate and person, forfromtoto(default the last 30 days) and the same length of time before. FilteraffiliateId. Requires affiliate management in the license, otherwise403 feature-not-available.
v1.206.0 · October 21, 2026
- New:
GET /contactsfilters by responsible person withresponsible, comma-separated (at most 20): user ids of members,mefor the acting person of the key,partnerfor contacts looked after only by a partner. The same rule as the app's “Responsible” filter applies (a member before a partner; someone who has left the organization does not count);responsible=mematches the “Only mine” switch. A key without a creator gets 422no-acting-userforme, an unknown value 400validation-failed.
v1.205.1 · October 21, 2026
- Fixed:
DELETE /invoices/{id}answered 204 for a draft without deleting it (since 1.179.0; every draft not belonging to a credits run was affected). It is now deleted. If no row is deleted (for example because the draft was issued at the same moment), the endpoint answers 404not-foundinstead of 204. Drafts of a credits run remain 409credits-run.
v1.205.0 · October 21, 2026
- Changed:
POST/PATCH /message-templatesaccept the field{{terminlink.<appointment-type-id>}}(previously 400unknown-field). Allowed are, forusage: contacts, appointment types with a personal link, and for the partner portal those released to partners; otherwise 400unknown-fieldnaming the appointment type. When sending, it becomes a personal booking link per recipient (a link in HTML). New: if it cannot be created for the contact,POST /outbound-emailsandPOST /smswithvorlageIdrespond with 422 andreason: booking-link-unavailableinstead of sending with an empty spot.
v1.204.0 · October 21, 2026
- New:
reminderServiceinPOST /appointments: the customer wants appointment reminders (reminder service), only at their explicit request, no if omitted; single appointments only, recorded for the contact's email address and mobile number with the source “API”; an earlier revocation by the customer stays. Changed: reminders before the appointment are scheduled for customers again but are only sent with this consent (checked at send time, against exactly that address or number), and each carries a link to unsubscribe. Confirmation, cancellation and rescheduling are always sent.
v1.203.0 · October 20, 2026
- New:
contactIdinPOST /appointment-types/{id}/linksreturns this contact's personal booking link, existing or new (kindPERSONAL): the appointment belongs to the contact; if the appointment type has no form, it books without further details. The appointment type needs the “personal link” release; new reasons forprecondition-failed:appointment-type-not-personal,appointment-type-internal-only. WithoutcontactId, a new open link as before.
v1.202.0 · October 20, 2026
- New:
reminderPlanIdinPOST /appointment-typesandPATCH /appointment-types/{id}assigns a reminder plan to the appointment type (GET /appointment-reminder-plans),nullmeans no reminders. If omitted, a new appointment type gets the organization's default plan and an existing one keeps its plan. Changed: reminders before the appointment are not scheduled for customers until they agree to the reminder service; confirmation, cancellation and rescheduling are always sent.
v1.201.0 · October 20, 2026
- Task reminders (core KR.41). New:
GET /tasks/reminder-settingsandPUT /tasks/reminder-settings(tasks:read/tasks:write, writing for organization admins only) read and set the defaults: times before the due time inminutesBefore(0, 15, 60, 180, 1440, 2880, 10080; unknown values are dropped silently) and channels inchannels(BELL,EMAIL,SMS). Without saved settings the bell when due applies; email and SMS only once an admin turns them on. Tasks with a due date now trigger reminders to the responsible person, also when created through the API. New on the task:dueHasTime(whetherdueDatecarries a time). When writingdueDate, a date alone or midnight UTC counts as without a time; without a time the task is due on its day and the reminder comes at 8:00 (Berlin).kindon SMS (GET /sms,sms.message.*events) has the new valueTASK_REMINDER.
v1.200.0 · October 20, 2026
- New:
PATCH /telephony(telephony.updateOptions) turns the organization's answering machine detection on or off (answeringMachineDetection), andGET /telephonyshows its state in the new fieldansweringMachineDetection(falsewithout a connected account). Detection starts out on for every organization: on outgoing calls, Twilio reports whether a person, an answering machine or a fax answered; the call statistics need this to count voicemails. It runs in the background, the person called does not wait, and Twilio charges it per answered call on the organization's account. ORG_ADMIN only, scopetelephony:write.
v1.199.0 · October 20, 2026
- New: sessions of a care enrollment (practice BP.2).
GET /care-enrollments/{id}/sessionslists the opened sessions,GET /care-sessions/{id}reads one.POST /care-enrollments/{id}/sessions/openopens the session at a position of the copy (created the first time, the same one afterwards),POST /care-enrollments/{id}/sessionscreates an ad-hoc session outside the plan (adHoc, withoutposition; for example in a crisis, only in an active or paused enrollment, otherwiseconflictwithenrollment-ended).POST /care-sessions/{id}/startstarts a session:runningis then true for four hours.PATCH /care-sessions/{id}sets the session type (standard,safety,gentle,catch-up,relief) with a short reason. Rights as for enrollments:careplans:read/:writeandclients:read/:write, client data release, access log. The call guide run of a session has no endpoint; its ID is inguideRunId.
v1.198.0 · October 20, 2026
- Forms, behaviour only, for submissions through the public link (
/f/…): (1) For a form with advertising whose email or phone is confirmed by a link after submitting, the form asks for the advertising consent only after submitting. A “yes” is then appended to the submission:GET /forms/{id}/responsesandGET /responses/{id}then show an accepted consent withpurposeMARKETINGthatforms.response.submitteddid not contain at submission time; there is no separate event for the later “yes”. A “no” leaves nothing behind. The advertising consent only takes effect with the click in the confirmation. (2) New consent type “marketing campaign”: the submit button is the request for advertising, the wording appears above it. The submission carries the consent asacceptedtruewithout a checkbox having been shown. Submissions throughPOST /forms/{id}/responsesare not affected; there, advertising consents remain checkboxes. - Documentation only: the example of
GET /forms/{id}now shows an optional advertising checkbox (purposeMARKETING,requiredfalse) instead of the removed request checkbox (purposeINQUIRY, since 1.197.0). The submission example keepsINQUIRY, because older submissions carry it.
v1.197.0 · October 20, 2026
- Forms, behaviour only: the required checkbox “contact about my request” (
purposeINQUIRY) is gone. Answering a request needs no consent; the form shows a privacy notice instead.GET /forms/{id}no longer lists a consent withINQUIRYinconsents. Advertising consents (MARKETING) and older checkboxes that combine request and advertising (purposenull, channel email or phone) only appear when the form allows advertising; that is the default for all existing forms. Custom consents (channelCUSTOM) are unchanged.POST /forms/{id}/responsesno longer requires a request checkbox for email or phone:validation-failedwithbody.consents.<elementId>now only comes for custom required consents and older combined checkboxes. Atruesent for the removed checkbox is not an error; it is not stored. New submissions (GET /forms/{id}/responses,forms.response.submitted) andconsent/consentPurposesofleads.lead.createdno longer carryINQUIRY; older submissions keep it, so the value stays in the schema.
v1.196.0 · October 20, 2026
- Changed: appointment series have up to 100 instead of 10 steps. In
POST /appointment-series-templatesandPATCH /appointment-series-templates/{id},stepstakes 2 to 100 steps andsamePersonAsStepup to 100; likewiseappointmentsinPOST /appointment-series,{step}in/appointment-series/{id}/steps/{step}andfollowinginPOST /appointments/{id}/reschedule-with-series.
v1.195.0 · October 19, 2026
- Changed: the text of a reminder step (
bodyHtml, also ininformal) inPATCH /appointment-reminder-steps/{id}now keeps only the markup of the editor: paragraphs, bold, italic, underline, strikethrough, lists and line breaks. A link becomes its text, images and attributes are removed. Confirmation, cancellation and rescheduling messages are always sent and must not carry promotional content.
v1.194.0 · October 19, 2026
- New, ORG_ADMIN only: read the organization's API alerts (
GET /organization/api-alerts: calls and errors for 24 hours and 7 days, rules per kind, last alerts, alert address), set an alert kind (PUT /organization/api-alerts/rules/{kind}) and set the alert address (PUT /organization/api-alerts/email). Also read the installations of the claritos app in LeadConnector (GET /organization/integrations/leadconnector) and disconnect one (DELETE /organization/integrations/leadconnector/{id}); installing still happens in LeadConnector itself. Scopesorganization:readororganization:write.
v1.193.0 · October 19, 2026
- New event
careplans.enrollment.resumed: a paused care enrollment runs again (statusACTIVEfromPAUSED). Payload as for the othercareplans.enrollment.*(IDs and states only); client data, only to endpoints withclientsData. Also available as an automation trigger.
v1.192.0 · October 19, 2026
- New:
firstSessionIsOnboardingonGET /care-plans/{id}(and the responses of the other template endpoints) and oncopyof care enrollments.truemeans: session 1 is the onboarding and is called session 0 in the app; positions, series and time windows still count from 1. Writable onPOST/PUT /care-plansand in the dry runPOST /care-plans/validate, optional;falseif omitted, also onPUT, because the tree is replaced as a whole.
v1.191.0 · October 18, 2026
- New: area
careplans(care plans of the practice), scopescareplans:read/careplans:write, group "Contacts and clients". Templates:GET/POST /care-plans,GET/PUT/DELETE /care-plans/{id},GET /care-plans/options, dry runPOST /care-plans/validate,POST /care-plans/{id}/release,…/retire,…/versions. A plan is written as a whole tree (header, phases, sessions), only an own draft can be changed (409plan-not-draft), gaps to release are listed ingaps. Care enrollments (client data, additionallyclients:read/clients:writeand client-data enablement, access log):GET/POST /care-enrollments,GET /care-enrollments/{id},GET /clients/{id}/care-enrollments,POST /care-enrollments/{id}/events,…/status, appointments viaGET …/appointment-proposalandPOST …/appointments(plusappointments:read/appointments:write). Everywhere the practice licence right and an acting person with access to client records; release and retire only with the approval right. Eventscareplans.enrollment.started,.paused,.ended(only to endpoints withclientsData, IDs and states only).
v1.190.0 · October 18, 2026
- New in the
biomarkersdomain: biomarker rule sets.GET/POST /biomarker-rule-sets,GET/DELETE /biomarker-rule-sets/{id},PUT …/{id}/rules(rules as a whole),POST /biomarker-rule-sets/validate(dry run without saving),POST …/{id}/confirmand…/{id}/unconfirm. Conditions in English (value,unit,present/missing), markers as house-list keys. Confirming only by a person with the release right, never from an automation (403confirm-needs-person); a confirmed rule set cannot be changed (409rule-set-confirmed).
v1.189.1 · October 18, 2026
- Behaviour: a deadline extension (
POST /dunning/open-items/{openItemId}/extension,dueDate) now runs until the end of the granted day (UTC), not only until 00:00. On the granted day itself a second extension therefore answers 409extension-exists, and the dunning run continues only from the following day. Stored and printed date unchanged. - Behaviour:
DELETE /articles/{id}now also answers 409in-usewhen the article is on quote or order lines (any status), in subscription contracts, on commission credit notes, in organization settings, the commission article of a campaign or attached to an access hook.usagehas the fieldsquoteLines,orderLines,subscriptionLines,commissionCreditLines,accessHooks,organizationSettings,campaignCommissionsfor this. Instead of deleting: archive.
v1.189.0 · October 18, 2026
- New:
biomarkersdomain (the practice’s biomarkers, only with the organization’s practice right).GET /biomarker-profileslists the biomarker profiles with status, version, marker count anddeletable/deleteBlockedBy;DELETE /biomarker-profiles/{id}deletes a profile as long as it was never used (never released, in no lab request, never passed on, no later version), otherwise409 conflictwithreason. Reading and writing need an acting person with access to client records; profiles are not client data.
v1.188.0 · October 18, 2026
- New on
mailboxes.*:attachmentHandling(receipt,receiptStack,documentornull) sets how attachments sent to a shared mailbox are handled, like the per-kind addresses on inbox.claritos.io. Each kind belongs to at most one shared mailbox per organization; otherwise 409 withreason: handling-taken. Personal mailboxes always returnnull.
v1.187.0 · October 18, 2026
- New scopes
biomarkers:read/biomarkers:writefor the practice's biomarkers (profiles with reference values). They are prepared for the endpoints that follow; until then they grant no access. Existing keys and OAuth grants do not receive them automatically.
v1.186.0 · October 18, 2026
- New in the
creditsdomain: billing runs (/credits/runs: preview, list, get, start, finalize, discard, cancel, send and regenerate statements; start, finalize and cancel run in the background, response 202), import (/credits/import-profiles: profiles, check, load, identifiers, carry-forward, master data;POST /credits/import-files/header; list as Base64, at most 600 KB), portal purchases (/credits/portal-purchases, invoices for them withinvoices:write), commissions (/credits/commissions, reconcile) and supervisions (PUT /credits/accounts/{id}/supervision,DELETE /credits/supervisions/{id}).
v1.185.0 · October 18, 2026
- New:
creditsdomain (credits program, only with the organization’sCREDITSright): programsGET/POST /credits/programs,GET/PATCH /credits/programs/{id},PUT/DELETE …/{id}/logo; accountsGET/POST /credits/accounts(list withfrom/to),GET/PATCH /credits/accounts/{id},POST …/{id}/entries(manual grant or correction),PUT …/{id}/bonus-rules. Writing needs an acting person with ORG_ADMIN or ORG_ACCOUNTANT. Values in English (WEEKLY,PREPAID,USAGE,GRANT…).
v1.184.0 · October 18, 2026
- New: time reports in the
timedomain:GET /time-reports(filter by project and status),GET /time-reports/preview,POST /time-reports(freeze a project’s times in a period),GET /time-reports/{id}(with the times),POST …/{id}/discard,POST …/{id}/pdfandPOST …/{id}/bill(invoice draft; needstime:writeandinvoices:writeand an acting person, emitsinvoices.invoice.created). Billing rejects times another report has billed in the meantime (entries-already-billed).
v1.183.0 · October 18, 2026
- New: billing templates in the
templatesdomain: payment terms (/payment-terms) and header and footer texts (/text-blocks), each with list, get, create, update, delete andPOST …/{id}/default; informal versions underinformal. Deleting archives a template still used on documents, contacts or credit-note defaults (mode: archived). PlusGET/PATCH /contacts/{id}/billing-defaults(contactsdomain).
v1.182.0 · October 18, 2026
- New:
GET /payments/events(payment events of the Stripe connection, filter by severity and kind,onlyProblems), damage settlementsGET/POST /settlementsandGET /settlements/{id}(domaininvoices; create requires an acting person andconfirmGenuineDamage: true) andPOST /files/rich-images(signed upload address for images in rich-text descriptions; first endpoint in thefilesdomain).
v1.181.0 · October 18, 2026
- Articles complete:
DELETE /articles/{id}(unused only; otherwise409 conflictwithin-useandusage, then archive), icon viaPOST /articles/{id}/icon-upload,POST /articles/{id}/iconandDELETE /articles/{id}/icon,GET /articles/catalog-range(price range of a catalog code). Create and update now takegroupName,isSelectableandcatalog; reads additionally returnusageCount. New eventarticles.article.deleted.
v1.180.0 · October 18, 2026
- Invoices complete:
POST/DELETE /invoices/{id}/service-rendered(service rendered with resolution booking, exactly once), correction notes under § 31(5) UStDV (GET/POST /invoices/{id}/correction-notes,GET …/correction-notes/{correctionId}/email,POST …/send), installment plan (GET /invoices/{id}/installment-plan,POST …/installment-plan/collect,POST …/installment-plan/accelerate),GET /invoices/{id}/fee-schedule-check(GebüH), dispatch release (POST /invoices/release-dispatch) and plan runs (GET /invoices/plan-runs,POST /invoices/plan-runs/release,POST /invoices/plan-runs/direct-debit; release and switch ORG_ADMIN only) as well as invoice for Stripe payments (GET /invoices/stripe-payments,POST /invoices/stripe-payments/prepare,POST /invoices/stripe-payments/invoice; ORG_ADMIN and ORG_ACCOUNTANT only).
v1.179.0 · October 18, 2026
- Invoices:
DELETE /invoices/{id}(drafts only; otherwise409 conflictwithnot-draft, drafts of a credits run withcredits-run),POST /invoices/{id}/duplicate,GET /invoices/{id}/email(suggestion),POST /invoices/{id}/send(does not issue by itself:409 conflictwithnot-issued; invoices issued afterwardsawaiting-release),POST /invoices/{id}/mark-sent(dispatch outside claritos, always now),GET /invoices/{id}/refund-preview,POST /invoices/{id}/pdf(render the preview and wait) andPOST /invoices/{id}/pdf/regenerate(re-render the official PDF). Cancelling viaPOST /invoices/{id}/correctnow takesrefundDays(refund period). - Behaviour change:
POST /invoices,POST /invoices/{id}/issueandPOST /invoices/{id}/correctrequire an acting person (no-acting-user), previously500 internalfor a key without a creator.GET /invoices/{id}/pdfandPOST /quotes/{id}/convertneed one only when rendering or when the quote must be issued first; the e-mail suggestions (GET …/emailfor invoices, orders and quotes) work without a person, with the organization’s signature and sender. Duplicating an invoice now emitsinvoices.invoice.created.
v1.178.2 · October 18, 2026
- Behavior, same specification:
POST /open-items/{id}/paymentsnow requires an acting person whenever a booking is created and answers403 no-acting-userwithout one. Previously a key without a creator failed there with500 internal.markOnly: true(no booking) still works without a person.
v1.178.1 · October 18, 2026
- Behavior, same specification:
POST /tasks,POST /tasks/{id}/commentsandPOST /time-entries(withoutuserId) now answer403 no-acting-userinstead of500for an API key without a recorded creator. Before, an empty user reached the core. Nothing changes for OAuth access or keys with a creator; forPOST /time-entries, an explicitly passeduserIdstays valid.
v1.178.0 · October 18, 2026
- Orders complete:
POST /orders(draft with the contact’s defaults, lines and sections included),PATCH /orders/{id}(until the first billing, otherwise409 conflictwithlocked),DELETE /orders/{id}(drafts without number only, otherwisenot-draft),POST /orders/{id}/issue(order number and PDF),POST /orders/{id}/send(order confirmation by email),GET /orders/{id}/email(suggestion),POST /orders/{id}/duplicate,POST /orders/{id}/pdf(render the preview or the issued version and wait for it),POST /orders/{id}/invoices(partial, final or deposit invoice as draft; also requiresinvoices:write),POST /orders/{id}/lines/{lineId}/dropand…/restore(drop a line and undo it; if the quantities changed meanwhile,409 conflictwithline-changed). Create, duplicate, issue, send and PDF require an acting person. - New event
orders.order.sent: the order confirmation went out by email, from the app or through the API, withsentTo. - Behaviour change for quotes:
POST /quotes,POST /quotes/{id}/issue,POST /quotes/{id}/sendandGET /quotes/{id}/pdf(when a preview is rendered) now require an acting person and answerno-acting-userwithout one. Previously a key without a creator failed there with500 internal.
v1.177.0 · October 18, 2026
- Quotes complete:
GET /quotes/{id}/email(proposal for the quote email with sender and whether it can be sent),POST /quotes/{id}/remind(remind now, SENT only),POST /quotes/{id}/duplicate(deep copy as draft; requires an acting person),DELETE /quotes/{id}(drafts without number only, otherwise409 conflictwithnot-draft) and attachments:GETandPOST /quotes/{id}/attachments,DELETE /quotes/{id}/attachments/{documentId},PUT /quotes/{id}/attachment-order.
v1.176.0 · October 18, 2026
- New: collection cases.
GET /dunning/collection-cases(filterstatus:pending,released,withdrawn,all),GET /dunning/collection-cases/{id},POST …/release(recipientEmail,coverLetterHtml; claritos compiles the case file from invoice, proof of service and reminder PDFs and sends it to the collection agency; requires an acting person) andPOST …/withdraw(as long as not handed over). Release and withdraw are protected against concurrent calls (409 conflictwithwrong-status).
v1.175.0 · October 18, 2026
- New: writing reminders.
POST /dunning/reminders/{id}/finalize(number, booking, PDF),…/regenerate,…/discard(drafts only),GET …/email(proposal for the reminder email) andPOST …/send(missing fields from the proposal;409 conflictwithsender-reconnect-requiredif the mailbox must be reconnected),POST /dunning/reminders/regenerate-unsent,POST /dunning/open-items/{openItemId}/extension(deadline extension withdueDateandreason) andPOST /dunning/run(dunning run, 202). Finalizing, regenerating, email and sending require an acting person (no-acting-user). New eventdunning.reminder.finalized, also as an automation trigger.
v1.174.0 · October 18, 2026
- New: dunning sets and levels, the first write endpoints in the dunning domain.
GETandPOST /dunning/profiles(seedPresetcreates the standard levels),GET,PATCH(isDefault: truemakes a set the default) andDELETE /dunning/profiles/{id}(archives),POST /dunning/profiles/{id}/duplicate; levelsPOST /dunning/profiles/{id}/levels,PATCHandDELETE /dunning/levels/{id},PUT /dunning/profiles/{id}/level-order,PUT …/sepa-return-levelandPUT …/extension-levels/{variant}(pre-final,post-final; without fields the template). A contact's set:GETandPUT /dunning/contacts/{contactId}/profile. Level texts with informal versions (…Informal). Scopesdunning:readanddunning:write.
v1.173.0 · October 18, 2026
- New: event
subscriptions.subscription.endedwhen a subscription has actually ended: on the day after the last paid day, on every path (cancellation, scheduled end, subscription switch, exhausted term), once per end. Payloadsubscription,endedAt(start of the day after the last paid day) andreason(cancelledorcompleted). Meant for “revoke access”; it is tied to the end, not to the cancellation. In addition,subscriptions.subscription.cancellednow also reports a scheduled end of contract (marketplace at the end of the term); therestatusstaysACTIVEuntil the end,cancelEffectiveDateis what counts.
v1.172.0 · October 18, 2026
- New: subscriptions.
GET /subscriptions(filtersstatus,contactId,due),GETandPATCH /subscriptions/{id}(autoSend,ownDirectDebitOffered),POST /subscriptions/{id}/pause,/resumeand/cancel(as of the end of the last invoiced period, without refund),PUT /subscriptions/{id}/payment-method(pin a Stripe payment method or switch to bank transfer withnull; withMOLLIEthis ends the mandate,mandateOutcome) andPOST /subscriptions/generate-due(generate due follow-up invoices now). New eventssubscriptions.subscription.paused,.resumedand.cancelled(also when cancelled in the customer portal), also as automation triggers. Scopessubscriptions:readandsubscriptions:write.
v1.171.1 · October 18, 2026
- Access hooks now only accept public https addresses: no credentials in the address, no internal host name, no private IP address, also not after DNS resolution.
POST /checkout/hooks,PATCH /checkout/hooks/{id}andPOST /checkout/hooks/{id}/testotherwise answer422 validation-failedwithurl-not-allowed(ordns-failedif the name does not resolve). Deliveries follow no redirects and only go to an address checked when connecting.
v1.171.0 · October 18, 2026
- New: billing access hooks. A hook notifies an external system about payments (
onIntentSucceeded,onPaymentCompleted,onPaymentFailed), e.g. to grant or revoke a course.GETandPOST /checkout/hooks,GET,PATCHandDELETE /checkout/hooks/{id},POST /checkout/hooks/{id}/rotate-secret,DELETE /checkout/hooks/{id}/secret,POST /checkout/hooks/{id}/reactivateandPOST /checkout/hooks/{id}/test(202). The secret is only returned when claritos generates it (generateSecreton create,rotate-secretwithout your own), and only in that response; otherwisehasSecret. Assign per target:GETandPUT /checkout/hook-assignments/{targetType}/{targetId}withcheckout-link,article,quoteororder. Managing requires a person with ORG_ADMIN (no-acting-userorforbidden), reading and assigning do not.
v1.170.0 · October 18, 2026
- New: checkout discount codes.
GETandPOST /checkout/discount-codes,GET,PATCHandDELETE /checkout/discount-codes/{id}: percentage (PERCENT,percent) or fixed deduction in cents (FIXED,amountCents), optional period, maximum redemptions, affiliate and binding to individual checkout links (checkoutLinkIds, empty = all). Withoutcode, claritos generates a readable code, optionally withcodePrefix. Filtercodeshows whether a code is taken,checkoutLinkIdthe codes that apply to a link. A redeemed code cannot be deleted (409 conflictwithredeemed; useactive: falseinstead). Scopescheckout:readandcheckout:write.
v1.169.0 · October 18, 2026
- New: checkout links.
GETandPOST /checkout-links,GET,PATCHandDELETE /checkout-links/{id}: links with article, price in cents, audience, requested details, payment provider (STRIPEorMOLLIE), own direct debit, add-on offers (bumps), payment plans (plans) and post-purchase offers (upsells); on write, lists replace the existing ones. Deleting only works without invoices (otherwise409 conflictwithhas-invoices; useactive: falseinstead).POST /checkout-links/{id}/personal-linkscreates a personal link for a contact, valid for seven days.GETandPATCH /checkout/settings: the organization's default invoice author. Scopescheckout:readandcheckout:write; BUSINESS and HOLDING organizations only.
v1.168.0 · October 18, 2026
- New scopes for billing:
checkout:read/checkout:write(checkout links, discount codes, personal links, access hooks),subscriptions:read/subscriptions:write(subscriptions),credits:read/credits:write(credits program) anddunning:write(dunning). They are prepared for the endpoints that follow; until then they grant no access. Existing keys and OAuth grants do not receive them automatically.
v1.167.0 · October 17, 2026
- New: settings for the claritos live room. On the appointment type
liveRoomwithclassId(class for breakouts by subgroups) andsummarizeBreakouts, inPOST /appointment-typesandPATCH /appointment-types/{id}and in every appointment type response. On the appointmentGETandPUT /appointments/{id}/live-room: override class, recording and breakout summary, or reset them to the appointment type withTYPE, plus what applies (effective).
v1.166.1 · October 16, 2026
- API MCP (
/api/mcp/v1,/api/mcp/v1/compact, each also/o/{orgId}):GETnow answers405 Method Not AllowedwithAllow: POST, OPTIONS. The server is stateless and sends nothing on its own; until nowGETopened a stream that stayed open until the time limit. MCP clients treat 405 as intended as “no stream” and continue withPOST. Without access it stays401withWWW-Authenticate.
v1.166.0 · October 15, 2026
- New:
check.overallScore, a campaign's overall spam score in percent (0 to 100,nullwithout a check): technology from Rspamd's points at its thresholds (4 points 25 %, 6 points 50 %, 15 points 100 %, linear in between) and content from the AI check, combined as 1 − (1 − technology)(1 − content), with two versions the worse one. New inspamReports[].report.symbols[].origin:testSendfor rules produced only by the test send to claritos; they do not count towards the overall score. Behaviour: red findings no longer block the start.POST /email-campaigns/{id}/startrequiresconfirmWarnings: truefor red as for yellow findings (otherwise422 precondition-failedwithcampaign-check-warnings);campaign-check-redno longer occurs. A scheduled campaign only pauses before its time if the content changed since the check and the new check has notes.
v1.165.1 · October 15, 2026
- Text: In
GET /email-campaigns/setup, a subgroup of a class is now named “Class › Group” insmartLists[].name, so that groups with the same name in different classes can be told apart. The ID and the recipients stay the same.
v1.165.0 · October 15, 2026
- New: assembled lists (such as classes) under
/contact-lists. A list consists of individually chosen person contacts and can be divided into named subgroups; each person is in at most one subgroup.GET /contact-lists(paginated, withmemberCountand subgroups),GET /contact-lists/{id}(subgroups withcontactIds, pluswithoutSubgroup),POST,PATCH,DELETE /contact-lists/{id}; subgroups viaPOST /contact-lists/{id}/subgroups,PATCH/DELETE /contact-lists/{id}/subgroups/{subgroupId}andPUT /contact-lists/{id}/subgroups/order; members viaPOST /contact-lists/{id}/members(withsubgroupId),POST /contact-lists/{id}/members/from-selection(tags,smartListIds),PUT /contact-lists/{id}/members/subgroupandPOST /contact-lists/{id}/members/remove. Reading needscontacts:read; the person who created the list or ORG_ADMIN may change it (otherwiseforbidden, without an acting personno-acting-user). Reasons:409 conflictwithsubgroup-name-taken,422 precondition-failedwithtoo-many(over 2,000 members or 100 subgroups). Companies do not become members (notPerson).
v1.164.0 · October 15, 2026
- New:
check.contentReportsper version, the report of the AI content check:score(0 to 100, not a percentage),zone(none,low,elevated,high) andfindingswithcategory,strength(slight,clear,strong) andquote(verbatim from subject or text). claritos calculates the score from the findings using a fixed rubric. New incheck.findings[].rule:kiRisiko(yellow, fromelevated,value= score) andkiGering(info,value= score); the ruleskiGewinntokiUnserioesfrom 1.162.0 are no longer produced, older checks keep them. Also new in the quick check:betreffAntwort(yellow, subject starts with “Re:” or “Fwd:”) andlinkTextTaeuscht(yellow, link text names a different domain than its target).
v1.163.0 · October 15, 2026
- New:
GETandPUT /organization/security-txtread and set the address for reports about security vulnerabilities (email). When set, the organization's own domains serve/.well-known/security.txtfollowing RFC 9116;nullremoves it. Setting requires a person with ORG_ADMIN; an invalid address returns 422.
v1.162.0 · October 14, 2026
- New: seven values for campaign
check.findings[].rule.kiGewinn,kiGesundheit,kiDruck,kiUebertreibungandkiUnserioes(alwayslevelyellow,valueis the quote from the text) report promises of money or health effects, pressure, exaggeration and unprofessional wording that an AI content check found in the template's subject or text;kiOkandkiFehler(info) say it found nothing or did not run. On production only once the privacy policy says so; until then these values do not occur there.
v1.161.0 · October 14, 2026
- New: “My mailboxes”.
GET /mailboxes/minelists the mailboxes the acting person may open (personaland shared ones with access).GET /mailboxes/{key}/messageslists a folder (inbox,sent,archive,spam,trash),GET /mailboxes/{key}/messages/{folder}/{uid}reads a message,POST /mailboxes/{key}/messages/updatesets flags, moves or removes from the mailbox.POST /mailboxes/attachmentsreturns a signed address for an attachment,POST /mailboxes/{key}/sendsends from this mailbox (personal or shared) via the organization's SendGrid account, with a record in the outbox. Reasons with422 precondition-failed:invalid-recipients,attachment-not-uploaded,send-failed.
v1.160.0 · October 14, 2026
- Behaviour, spec unchanged: mail from mailboxes the user behind the credential may not see (rule from
GET /mailboxes) is now missing fromGET /inbox/threadsand the other inbox endpoints, from the contact conversation (/contacts/{id}/conversation, including mailboxes, entry and reply) and from the outbox (GET /outbound-emails,GET /outbound-emails/{id},POST /outbound-emails/{id}/resend). A thread without a visible message and such a record count as not existing (404). A key without an acting user only sees mailboxes visible to all roles. Without restricted mailboxes nothing changes.
v1.159.0 · October 14, 2026
- New: mailboxes.
GET /mailboxeslists personal and shared mailboxes on the domain for personal emails with address and access rule (access.roles,access.rolesWithRecordAccess,access.users);POST /mailboxes,PATCH /mailboxes/{id}andDELETE /mailboxes/{id}create, change and remove shared mailboxes such as info@ (ORG_ADMIN only).GET /mailboxes/personal/mereturns your own personal mailbox,PUT /mailboxes/personal/{userId}/accesssets who sees its mail (your own: anyone; someone else's: ORG_ADMIN only). Reasons with422 precondition-failed:no-personal-domain,invalid-local-part,display-name-required,not-a-member; a taken address is409 conflictwithaddress-taken. The rule only takes effect on inbox, outbox and conversation with one of the next versions; until then everyone sees everything as before. - Text:
moodon inbox threads now describes the mood of the most recently classified incoming email, not only of a reply. Every genuine email will be classified, except spam and bulk mail (on production only once the privacy policy says so).
v1.158.0 · October 13, 2026
POST /organization/invitationsacceptsdeliverTo: ifemailis on the organization's domain for personal emails, the mailbox only exists after acceptance; the invitation then goes todeliverTo(required, otherwise422at the field), and the name before the @ must be free (409 conflict,reason: mailbox-taken). Invitations carrydeliveredTo(otherwisenull).
v1.157.0 · October 13, 2026
- Behaviour, spec unchanged: entries someone creates on a calendar device (Thunderbird, iPhone, CalDAV) are now the person's own appointments, no longer absences, unless their category is vacation, sick, training or away. A resource's absences (
GET /appointment-resources/{id}) therefore no longer include own appointments; they still block the time (unless marked free). Changing an own appointment viaPUT /appointment-resources/{id}/absences/{absenceId}turns it into an absence.
v1.156.0 · October 13, 2026
- New:
projectIdonPOST /appointments. Appointment types billed asQUOTAcan now be assigned in-house (owner rule: from outside, only the customer books them in the portal). The customer's project whose free time budget covers the duration is then required; the duration is reserved on creation. If the project is missing, does not belong to the customer or the budget is insufficient,400onbody.projectId. As a recurrence, group appointment or series the API answers422withprecondition-failedand reasonquota-single-only(previouslyquota-portal-only, which remains for booking links).
v1.155.0 · October 13, 2026
GET/PATCH /organization/letterheadcarrycancellationRefundDays: the period in days (0 to 365) a cancellation invoice states for refunding an invoice already paid. Default of the cancellation dialog; outside the range422at the field.
v1.154.0 · October 13, 2026
- Cancellation invoices (
kind: CANCELLATION), also viaPOST /invoices/{id}/cancel: only the behaviour changes, the fields stay. A new cancellation invoice hasbankTransferEnabled: falseinstead of the original invoice's value.paymentTermsTextcarries a fixed sentence in the invoice's language and form of address: if the invoice had not been paid, that nothing needs to be done; otherwise by which day the amount paid will be refunded. The open item for the refund to the customer falls due on that day instead of immediately. The period comes from the organization's default (14 days if nothing is set); there is no parameter on the endpoint for it. Older cancellation invoices stay unchanged.
v1.153.0 · October 13, 2026
- finAPI:
PUT /finapi/accounts/{externalAccountId}/connectionreturnsprecondition-failedwithreason: finapi-terms-consentas long as the organization has not yet accepted section 11 (5) of the terms of use (bank connection via finAPI). This only concerns customers who signed up before 2026-10-13, until the change takes effect for them (FI.134). Consent is given in claritos when connecting the bank (setupUrlofGET /finapi); the API does not accept consent.
v1.152.0 · October 13, 2026
- New
GET /documents/{id}/related(scopedocuments:read): the related documents of a document, as under “Related documents” in the viewer. Each entry hasid,title,mimeType,createdAtandrelation:session(meeting document),recording(recording of the meeting),split-original/split-part(original and part of a split),signed(signed version),signing-original(original before signing),same-email(attachment of the same e-mail),same-appointment(document of the same appointment). Each document once; what the key may not see is left out (as withGET /documents).
v1.151.0 · October 13, 2026
- SendGrid: the domain of the appointment accounts may be the one for personal mails (SV.147). Then names of people and handles of resources must be unique together; otherwise
conflictwithreason: address-taken(onPUT /sendgrid/domains/{id}/calendarandPUT /sendgrid/domains/{id}/personalwithlocalParts, onPUT /sendgrid/my-sender-namewithout). The reasonssendgrid-domain-is-personalandsendgrid-domain-is-calendarare gone. - SendGrid: field
automaticSecurityon each domain,receiveOnDomainwhen creating (POST /sendgrid/domains) and new endpointPOST /sendgrid/domains/{id}/recreate(SV.148). The domain for personal mails and appointment accounts receives on itself; replies go to the same address the mail was sent from. At SendGrid this works only without “Automatic Security” (MX and TXT records instead of CNAME; MX records carrypriority), otherwiseprecondition-failedwithreason: sendgrid-domain-automatic-security. - SendGrid:
POST /sendgrid/domains/{id}/replieson any domain (SV.149). On a domain that carries neither personal mails nor appointment accounts the host lies below the domain, and replies, for example to campaigns, land in the organization's inbox; campaigns then give this address as reply address. In production only once the privacy policy names it (precondition-failed,reason: sendgrid-replies-not-released).
v1.150.0 · October 12, 2026
- New:
guestswhen creating a single appointment (POST /appointments,POST /appointment-recurrences): name and email per guest, at most the appointment type'smaxGuests. Guests are created in the same operation and receive their own invitation naming the customer as the one who invited them; for a recurrence also on the following appointments. Without guests on the appointment type or for a group appointment400.
v1.149.0 · October 12, 2026
- New:
accountEmailin a resource's calendar feed (/appointment-resources/{id}/calendar-feed): the email address of its appointment account (staff member, room, equipment), otherwisenull. Rooms and equipment answer invitations to this address on their own; where there is an appointment account, appointment emails are sent from it.
v1.148.0 · October 12, 2026
- SendGrid: calendar domain for the appointment accounts. Field
calendaron each domain,calendarAvailableon the setup (GET /sendgrid) andPUT /sendgrid/domains/{id}/calendar(enabled): at most one domain per organization, never the one for personal mails, confirmed only and without an MX pointing elsewhere.POST /sendgrid/domains/{id}/repliessets up receiving on this domain on the domain itself (hostis then not read). New reasons forprecondition-failed:sendgrid-calendar-not-released,sendgrid-domain-is-personal,sendgrid-domain-is-calendar,sendgrid-domain-foreign-mx,dns-unavailable. Switchable only with the permissions for appointment accounts and email campaigns, not yet in production (calendarAvailable: false).
v1.147.0 · October 12, 2026
- New: calendar feed per resource.
GET/POST/PATCH/DELETE /appointment-resources/{id}/calendar-feed: state, a new secret ICS address (only in thePOSTresponse; a previous one stops working), customer names on or off, end. Without the right412withcalendar-feed-not-enabled.
v1.146.0 · October 12, 2026
GET /organization/entitlementsknows the new rightTERMINKONTEN(subscription feed, CalDAV and own addresses for resources). It only applies together withE_MAIL_KAMPAGNEN; without it,effectiveis false.
v1.145.0 · October 12, 2026
- New: reschedule appointments of a series without breaking the chain.
POST /appointments/{id}/series-proposalsays whether a new time fits, otherwise the allowed window and the booked following steps placed anew;POST /appointments/{id}/reschedule-with-seriesmoves them all according to the proposal. Changed:POST /appointments/{id}/reschedulerejects a time that breaks the chain with412andseries-chain-broken(previously it moved without checking).
v1.144.0 · October 12, 2026
- New:
GET /appointment-serieslists running series with their state (open steps first,openStep.passed, next appointment) andPOST /appointment-series/{id}/cancel-fromcancels an appointment and all following steps; the series ends, the customer gets one cancellation naming the other appointments.
v1.143.0 · October 12, 2026
- New: customers start an appointment series themselves.
POST /appointment-series-templates/{id}/start-linkswithcontactIdreturns the personal link (/t/serie/…), one per customer and template; there the customer sees a proposal (withSTEPWISEonly step 1) and books with one click. Changed:clientBookablenow also applies toADVANCEand is stored as sent (previously stored asfalsewithADVANCE). WithoutclientBookable412withseries-not-client-bookable.
v1.142.0 · October 12, 2026
- New: clients book the follow-up steps of a series themselves. Templates accept and return
clientBookable(effective only together withbookingModeSTEPWISE, stored asfalsewithADVANCE); series return it too. When a step opens, the customer gets an email with a booking link that only shows times within the step's window, and a reminder before it ends.
v1.141.0 · October 12, 2026
- New: step-by-step appointment series. Templates and series carry
bookingMode(ADVANCEas before,STEPWISE: only step 1 at first, each further step opens once the previous one has taken place). WithSTEPWISE,POST /appointment-seriestakes exactly one entry (previously at least two);POST /appointment-series/proposalthen proposes only step 1.GET /appointment-series/{id}additionally returnscontactId,progressandopenStep(window of the open step). NewPOST /appointment-series/{id}/steps/{step}/proposal(free times within the window) andPOST /appointment-series/{id}/steps/{step}(books the open step; not open412withseries-step-not-open, outside the window422atbody.startsAt).
v1.140.0 · October 12, 2026
- New: appointment series (a sequence of different appointment types with windows).
GET/POST /appointment-series-templates,PATCH /appointment-series-templates/{id}(steps withappointmentTypeId,durationMinutes,fromDay/toDayafter the previous step,samePersonAsStep),POST /appointment-series/proposal(earliest complete sequence fromfrom, books nothing; without room412withseries-no-slots),POST /appointment-series(in advance, all or nothing) andGET /appointment-series/{id}.
v1.139.0 · October 12, 2026
- New:
GET /appointments/{id}/waitlist(waiting list of an event:stateWAITING, OFFERED, ACCEPTED, EXPIRED, DECLINED, REMOVED, pluspositionandofferExpiresAt). Behaviour: when a seat becomes free in an event with a waiting list, the first person on the list gets an offer with a deadline; while it is open it holds the seat, also against bookings through the link.
v1.138.0 · October 12, 2026
- Recurring series:
POST /appointment-recurrences/{id}/change-from(appointmentId,startsAt,rule,end, optional duration, place, service, phone, person, skipping): a new series from a new first time with the customers of the given appointment; it and the following old appointments are cancelled; the response is the new series. Behaviour: withcancel-fromandchange-from, appointments are only cancelled without their own cancellation when every one of their customers gets the combined mail; for events each appointment gets its own cancellation.
v1.137.0 · October 12, 2026
- Recurring series:
POST /appointment-recurrences/{id}/end(end; the created appointments stay),POST /appointment-recurrences/{id}/cancel-from(appointmentId, optionalreason: cancel this and all following; the customer gets ONE cancellation listing the others) andPATCH /appointment-recurrences/{id}(changeend, e.g. to extend; not before created appointments, otherwise422withtoo_small). Behaviour: the confirmation of a series' first appointment states the rule in words.
v1.136.0 · October 12, 2026
- New: recurring series (recurring appointments, any appointment type).
POST /appointment-recurrencescreates one: fields of the first appointment as forPOST /appointments, plusrule(weeklywith an interval of 1 to 4 and days with a time,monthlyWeekdaywith the nth or last weekday,monthlyDay),end(count2 to 200,untilup to two years,open) andskipHolidays/skipClosures(on by default). Computed in the appointment type's time zone; the further appointments are created in the background without their own confirmation.GET /appointment-recurrences/{id}returns rule, state, upcoming appointments and skipped ones with their reason. Appointments now carryrecurrenceId. Invalid rule or end:422atbody.ruleorbody.end.
v1.135.0 · October 12, 2026
- Events (group types with
internalOnly: false, not a lesson):POST /appointmentsmay be called withoutparticipantsfor an event; the appointment is then created with all seats free. A selection that resolves to nobody still answers422withtoo_small.DELETE /appointments/{id}/participants/{contactId}removes the last participant of an event too (nolast-participant). Customers book a seat in an existing appointment through the booking link;/appointment-types/{id}/slotsstill shows when the team can create an appointment.
v1.134.0 · October 12, 2026
- Appointment types: new fields
minParticipants,minParticipantsHours,minParticipantsAction(NOTIFY,CANCEL),waitlistEnabled,waitlistOfferHours(read and write; minimum and waiting list for group types, the waiting list for events only).internalOnlynow returns the stored value for groups:falsemeans event (customers book a seat), lessons stay internal. Quota only for one-to-one types (422withquota_group). Invalid values:422withminimum_invalid,minimum_hours_invalid,waitlist_hours_invalid.
v1.133.0 · October 12, 2026
- Quota appointments: new field
quotaon the appointment (projectId,minutes,state:HELD,CONSUMED,RELEASED;nullwithout a quota) andPOST /appointments/{id}/quota/release(reason 3 to 500 characters) releases reserved time with a record; without an open reservation422withquota-not-held. After the meeting the actual Zoom time becomes a time entry in the project, and the reservation turnsCONSUMED.
v1.132.0 · October 12, 2026
- Quota appointments are booked only by the customer in the portal (owner rule):
POST /appointmentswith an appointment type inQUOTAmode now answers422withprecondition-failedand reasonquota-portal-onlyinstead of creating an appointment without a project. A cancellation (POST /appointments/{id}/cancel) releases the reserved project time; a reschedule with a different duration adjusts the reservation.
v1.131.0 · October 12, 2026
- Appointment types in
QUOTAmode: on write (POST/PATCH /appointment-types) places are now online only (places: ["ONLINE"]) and both Zoom switches are on (recording.autoRecord,recording.fetchZoomRecordings), regardless of the input. The staffing (PUT /appointment-types/{id}/staffing) of such a type requiresmeetingProvider: "ZOOM"for every person and no partner role; otherwise422with codequota_zoom_requiredorquota_partner. Quota booking through the portal follows in a later version.
v1.130.0 · October 12, 2026
- Invoices and quotes: new field
contactEmail(string ornull), the email address of the linked contact;nullwithout a contact or without an address. InGET /invoices,GET /quotes, the single reads and responses and theinvoices.invoice.*andquotes.quote.*events. payments.checkout.*events: new fields in thecheckoutobject:checkoutLinkName(title of the checkout link, i.e. the product;nullwithout a title),customerName(contact of the invoice, otherwise the name entered at checkout),orderIdandorderNumber(order of the invoice, otherwisenull) and, only onpayments.checkout.failed,failureReason:direct_debit_failed,chargeback,no_mandateorpayment_failed(other reason). Existing fields stay.
v1.129.0 · October 12, 2026
- Tasks: new field
contactEmail(string ornull), the email address of the linked contact;nullwithout a contact or without an address. InGET /tasks,GET /tasks/{id}, the create and update responses and thetasks.task.*events. Workflows without a contact ID can find the contact by its address.
v1.128.0 · October 12, 2026
- API MCP for language models: on connecting, the server sends an overview of claritos (
instructions: areas in groups with one sentence each and the number of endpoints the access may use, rules, typical flows). New toolguide(overview, an area with its endpoints, or a guide from /developers). The tools' field descriptions now arrive as text; before, they carried translation keys such asapiDocs.fields.common.limit. New address/api/mcp/v1/compact(per organization/api/mcp/v1/compact/o/{orgId}) with four tools instead of one per endpoint:guide,search_endpoints,describe_endpoint,call_endpoint; same sign-in, scopes, limits and log./api/mcp/v1and/api/v1stay unchanged.
v1.127.0 · October 12, 2026
- New:
GET /call-guides/options(callguides.options, ORG_ADMIN only) returns in one call everything the call guide editor offers for actions and fields: templates (sms,promotional), members, personal checkout links, forms, marketing assets, appointment types withholdersand contact fields (fixed,standard,custom) with options. The IDs and keys go into the content ofPOST /call-guidesandPATCH /call-guides/{id}.
v1.126.0 · October 12, 2026
- New: read calls (scope
calls, read only, every member).GET /callslists calls newest first (filtermissed,messages,withoutContact,contactIdfor owner of the number or speaker, searchq,updatedSince),GET /calls/{id}reads one. The fields match thecalls.call.endedevent, plus voicemail and call note status. Note (note) and automatic call note (callNote) are client data: their text only with the organization's consent and aclients:permission, otherwisenullwithhasNote/hasCallNote.
v1.125.0 · October 12, 2026
- Letters:
POST /letters/{id}/finalize(finalize without dispatch),POST /letters/{id}/duplicate(copy as a draft),DELETE /letters/{id}(not once a number is assigned,409 numbered-no-delete),POST /letters/{id}/cancel-signature(cancel a running signature,409 signature-completedonce completed) andPOST /letters/{id}/number(assign the running number,202, the PDF is re-rendered). Outbox:POST /outbound-emails/{id}/resendsends an email again, optionally to another address or with changed text, with its own record; not for code records, redacted content, campaigns and anonymized records (409 not-resendable). - Issued documents from PDF templates (certificates):
GET /issued-documents,GET /issued-documents/{id},POST /issued-documents,DELETE /issued-documents/{id}(drafts only),POST /issued-documents/{id}/finalize,POST /issued-documents/{id}/retry-file,POST /issued-documents/{id}/cancel(ORG_ADMIN only) andPOST /issued-documents/{id}/letter(prepare a letter with the document attached). Issuing is open to those who write letters (ORG_ADMIN, ORG_USER), as in the app. - Inbox:
GET /inbox/threads,GET /inbox/threads/{id},PATCH /inbox/threads/{id}(read, archived, responsible person, contact, tags),GET /inbox/tags,GET /inbox/countsandPOST /inbox/threads/{id}/task(task from the thread, additionally needstasks:write). Attachments as document IDs (documents.downloadUrl). Threads of a contact with a client record only with client data enabled andclients:read. - Conversation with a contact:
GET /contacts/{id}/conversation(history across email, SMS, portal and client-file posts, phone calls),GET /contacts/{id}/conversation/{source}/{entryId}and…/reply-basis,GET /contacts/{id}/conversation/compose(senders, templates, permission),GET /contacts/{id}/conversation/permission,POST /contacts/{id}/conversation/email,POST /contacts/{id}/conversation/portal-post(clients:write),POST /contacts/{id}/conversation/smsandPOST /contacts/{id}/conversation/sms-preview. Reading marks nothing as read; marketing only with consent. New reason forprecondition-failed:client-record-missing.
v1.124.0 · October 12, 2026
- Appointment types: new field
startWindows(read, and write inPOST/PATCH /appointment-types): when an appointment of this type may begin, each entry withdays(1 = Monday to 7 = Sunday),earliestandlatest(HH:MMin the appointment type's time zone, both inclusive), at most 14;nullor[]removes them./appointment-types/{id}/slotsthen only offers times inside them, and booking and rescheduling by the customer keep to them. Invalid:422with pathbody.startWindows.
v1.123.0 · October 12, 2026
- Logos and type of the organization:
GET /organization/logos,POST /organization/logos/{kind}/upload(check format and size, signed address for the direct upload),POST /organization/logos/{kind}/confirmandDELETE /organization/logos/{kind}, each forlogoandinvoice-logo; for SVG and WebP a PNG version for mails is created as in the app.PATCH /organizationadditionally takestype(BUSINESS, HOUSEHOLD, HOLDING); a private organization keeps its type (409 conflict,reason: private-organization). Changes withorganization:writeand a person who is ORG_ADMIN.
v1.122.0 · October 12, 2026
- Guests of a one-to-one appointment:
POST /appointments/{id}/guests(name, email) invites a guest on behalf of the booker,DELETE /appointments/{id}/guests/{contactId}uninvites them (they get “Invitation withdrawn”, the appointment stays). Scopeappointments:writeand a person with “Manage scheduling”. New fieldisGuestonparticipants. New reasons forprecondition-failed:group-appointment-has-no-guests,guest-limit-reached.
v1.121.0 · October 12, 2026
- Entitlements, integrations and own domains of the organization:
GET /organization/entitlements(every right with license, release, effect),GET /organization/integrations(state of every integration with the page for connecting; LeadConnector is calledleadconnectorthere),GET/POST /organization/domains,POST /organization/domains/{purpose}/verifyandDELETE /organization/domains/{purpose}(purposeapp,finder,marketplace; the answer names the missing DNS records). All with a person who is ORG_ADMIN; own domains need the release by claritos, a domain of another organization answers409 conflictwithreason: taken.
v1.120.0 · October 12, 2026
- Documents: every document carries
extracted.counterpartyDetails(address withstreet,postalCode,city,countryas ISO code, plusemail,phone,websiteandcontactPersonwithname,email,phone,position) as read from the document by the AI;nullif nothing was recognised. NewPOST /documents/{id}/counterparty-contact(scopesdocuments:writeandcontacts:write): links the document to the contact of its counterparty, like “Create contact” in the app. An already linked contact stays; otherwise a contact with exactly this name, a matching company (VAT ID, register, domain, name) or a new one with the address. Response{ contactId, created }; without a counterparty409 conflictwithreason: no-counterparty.
v1.119.0 · October 12, 2026
- New: read inbound SMS.
GET /inbound-smslists the SMS sent to the organization's number (newest first, pages likeGET /sms, filtercontactId,updatedSincemeans received since here), with contact, kind of assignment (number,personBeforeCompany,ambiguous,unknown,manual) and Twilio's opt-out keyword;GET /inbound-sms/{id}reads one. Scopesms, permissionsms:read.
v1.118.0 · October 12, 2026
- Salutation and legal texts of the organization:
GET/PATCH /organization/salutation(formal or informal by default, informal for individual contacts, formal required per document type, greeting),GET/PATCH /organization/legal-texts(all legal texts including defaults, data protection officer and supervisory authority),PUT/DELETE /organization/legal-texts/{kind}(set the organization's own text, the version increases; back to the default). Read withorganization:read, change withorganization:writeand a person who is ORG_ADMIN. A private organization has no legal texts (403 feature-not-available).
v1.117.0 · October 12, 2026
- Contact, opening hours and letterhead of the organization:
GET/PATCH /organization/contact(visiting address, phone, e-mail for website and portal),GET/PUT /organization/opening-hours(up to two spans per weekday) andGET/PATCH /organization/letterhead(business stationery: legal name, legal form, address, tax and register data, managing directors, bank, letterhead form, articles for time billing and returned direct debits). Read withorganization:read, change withorganization:writeand a person who is ORG_ADMIN;PATCHchanges only what is sent, checked as in the settings (422with field).
v1.116.0 · October 12, 2026
- Presentation only, no endpoint changed: the spec groups the areas (
x-tagGroups, such as “Contacts and clients”, “Sales and invoicing”). Every tag carries a display name (x-displayName) and, as its description, a sentence on what the area is for. The tag names themselves (contacts,invoices…) stay as they are.
v1.115.0 · October 12, 2026
- Appointment types: new field
maxGuests(read, and write inPOST/PATCH /appointment-types): how many more people the booker may invite to their appointment, 0 to 20, only with one seat (otherwise always 0). Invalid:422with codeguests_invalid.
v1.114.0 · October 12, 2026
- Write members and invitations (scope
members:write, a person with ORG_ADMIN as in the Members tab):PATCH /organization/members/{userId}(role ORG_ADMIN/ORG_USER, visibility, access to client records, translator languages),DELETE /organization/members/{userId},POST /organization/invitations(invitation by e-mail, link valid for seven days) andDELETE /organization/invitations/{id}. The acting person never changes or removes themselves (403 forbidden,reason: self), the last ORG_ADMIN stays (409 conflict,reason: last-admin); already a member or already invited answers409 conflictwithreason: already-memberoralready-invited.
v1.113.0 · October 12, 2026
- Postal accounts through the API (area
letters):GET /postal-account(which provider the queue sends through, its balance, pause, waiting letters; ORG_ADMINs also see LetterXpress and Pingen in detail inaccounts) andPOST /postal-account/resume-queue(lift the pause, send the waiting letters,202). LetterXpress and Pingen are connected and disconnected only in the app; the API does not accept their credentials.
v1.112.0 · October 12, 2026
- Read Meta datasets:
GET /organization/meta-datasets(pixel and Conversions API: name, pixel ID, test code,hasToken), withorganization:readand a person who is ORG_ADMIN. The API never returns the token; creating and changing them stays in the app, as with SendGrid.
v1.111.0 · October 12, 2026
- The brand board through the API (area
sites): boards withGET/POST /sites/brands,GET/PATCH/DELETE /sites/brands/{id},POST /sites/brands/{id}/defaultandPOST /sites/brands/{id}/publish; fonts withGET/POST /sites/brands/{id}/fonts(own font, upload address),POST /sites/brands/{id}/fonts/google(import a Google font, search viaGET /sites/google-fonts) andDELETE /sites/brands/{id}/fonts/{fontId}; logos withGET /sites/brands/{id}/logos,POST/DELETE /sites/brands/{id}/logos/{slot}.PATCHchanges only what is sent (objects are merged). Reading withsites:read, writing withsites:writeand a person who is ORG_ADMIN (as in the brand board). The last board cannot be deleted (409,last-board); a font already imported answers409withfont-already-imported. The brand board's AI advisors stay in the app.
v1.110.0 · October 12, 2026
- Bank connections (scope
banking):GET /bank-connectionsandGET /bank-connections/{id}(with the public key for WISE),POST /bank-connections/{id}/sync(fetch statements),GET /revolut(setup status including the address in claritos),GET /revolut/accountsandPUT /revolut/accounts/{externalAccountId}/connection(connect an account of a released access),GET /finapi,PUT /finapi/accounts/{externalAccountId}/connectionandPOST /finapi/banks/{bankConnection}/refresh. Connecting with a key, signing in at Revolut or finAPI and disconnecting stay in claritos; no key and no bank sign-in goes through the API.
v1.109.0 · October 12, 2026
- New: set up telephony and the SMS sender (scope
telephony, ORG_ADMIN only).GET /telephonyshows account, voice setup, all numbers and the settings of the active ones;POST /telephony/setupsets up voice;POST /telephony/numbersactivates a number (asking back withactivated: falseif another system is already there, confirmed withoverwrite: true);GET/PATCH/DELETE /telephony/numbers/{id}read, update (strict, call notes only withcallNotesNoticeConfirmed: true) and deactivate; greeting viaPOST /telephony/numbers/{id}/greeting/upload,PUTandDELETE /telephony/numbers/{id}/greeting. Twilio:GET /telephony/twilio,GET /telephony/twilio/numbers,PUT /telephony/twilio/sender,POST /telephony/twilio/inbound. Only the interface connects and disconnects the Twilio account (settingsUrl); foreign addresses on a number are given as host only.
v1.108.0 · October 12, 2026
- Organization affiliate settings through the API (area
affiliates): coupon codes withGET/POST /affiliate-coupons,GET/PATCH/DELETE /affiliate-coupons/{id}(switch on and off withactive), attribution tracking withGET /affiliate-tracking(address of the conversion webhook, credentials only masked) andDELETE /affiliate-tracking/webhook(switch off), climate contribution withGET/PUT /affiliate-climate-contribution(0, 50, 100 or 150 basis points). Reading withaffiliates:read, writing withaffiliates:writeand a person who is ORG_ADMIN (as in the tab). The API does not create or show conversion webhook credentials: that is only possible in the app. A coupon code already in use answers409with the reasoncoupon-code-taken.
v1.107.0 · October 12, 2026
- The organization's backup and consent log:
GET /backups(settings and the last 20 runs),PATCH /backups/settings(interval, coverage, recipients),POST /backups/runs(start a backup,202with the run),GET /backups/runs/{id}andPUT /backups/password(set the archive password or remove it withnull; it is never returned). PlusGET /consent-log,GET /consent-log/summaryandGET /consent-log/export(CSV), read-only. Scopesbackups:read/backups:writeandconsentlog:read, all only for a person with ORG_ADMIN, as in the tab. New reasons forprecondition-failed:backup-runningandbackup-recipients-required.
v1.106.0 · October 12, 2026
- Update the organization:
PATCH /organization(scopeorganization:write, a person with ORG_ADMIN as in the settings) for name, base currency, country, price mode, practice profile, industry, inbox address (inboxSlug), reply alias (replyAlias) and e-mail signature; all or nothing, the same checks as in the app. Invalid input answers422with field and code, an inbox slug or reply alias already in use409 conflictwithreason: taken, a practice profile without the practice module403 feature-not-available.GET /organizationadditionally returnsinboxSlug,replyAlias,replyAddress,industryCode,defaultPriceModeandemailSignatureHtml.
v1.105.0 · October 12, 2026
- Appointment mailbox:
GET /appointment-mailbox(connected Gmail mailbox, state, reply address; every member) andDELETE /appointment-mailbox(disconnect, with the “Manage scheduling” permission; appointment mail then continues with the business paper address). Connecting happens only in claritos (consent at Google).
v1.104.0 · October 12, 2026
- New scopes for the organization's settings (endpoints follow in the next versions):
members:write(members, roles, invitations;memberswas read-only so far),backups:read/backups:write(backups),consentlog:read(website consent log, read-only)telephony:read/telephony:write(telephony and SMS sender setup) andbanking:read/banking:write(bank connections). Through OAuth the first four are granted only to ORG_ADMINs of the organization, as withwebhooks:manage;banking:readis open to every member, as in the user interface. - LeadConnector app: three new payment triggers,
checkout_pending(payment started; with SEPA no money yet),checkout_completed(payment received) andcheckout_failed(failed, charged back or instalment missed), on thepayments.checkout.*events; and the actioninvoice-issue(finalize an invoice,invoices:write), whose response carriesdocumentswith PDF status and URL and the URL of the ZUGFeRD XML, withpending: xml-not-readywhile it is generated. The/api/v1interface does not change.
v1.103.0 · October 12, 2026
- Appointment groups, partner release and calendars:
GET/POST /appointment-groups,GET/PATCH/DELETE /appointment-groups/{id}(several appointment types on one page; as in the tab, reading also needs the “Manage scheduling” permission),GET/PUT /appointment-types/{id}/partner-release(visibility in the partner program) andGET /appointment-resources/{id}/calendars(a resource's chosen Google calendars, read-only; the API does not give out the calendar lists of Google accounts). With this the appointments area can be fully set up through API and MCP.
v1.102.0 · October 12, 2026
- Set up reminder plans:
GET/POST /appointment-reminder-plans,GET/DELETE /appointment-reminder-plans/{id}(removing archives),POST /appointment-reminder-plans/{id}/steps,PATCH/DELETE /appointment-reminder-steps/{id},POST /appointment-reminder-steps/{id}/moveandPOST /appointment-reminder-preview(sample values filled in, unknown variables named). The list states the language of the texts and the catalog of variables. Reading withappointments:read, setting up withappointments:writeand a person who is ORG_ADMIN (as in the tab). A text with an unknown variable answers422with the codeunknown_variable.
v1.101.0 · October 12, 2026
- Set up closures and places:
GET/POST /appointment-closures,PATCH/DELETE /appointment-closures/{id}(public holiday, bridge day, company closure, other; all day or with a time window;affectedAppointmentscounts existing appointments in the period, which stay),PUT /appointment-bridge-day-rule(closed on all bridge days),POST /appointment-closures/{id}/keep-openandDELETE /appointment-bridge-day-rule/kept-open/{date}(keep a bridge day open or close it again),GET /appointment-places,POST/PATCH/DELETE /appointment-phones[/{id}],POST/PATCH/DELETE /appointment-venues[/{id}]andPUT /appointment-venues/{id}/groups(rooms and devices that must be free at an address). Reading withappointments:read, writing withappointments:writeand the “Manage scheduling” permission. Deleting a number or address that is still chosen answers409within-use. New reason forprecondition-failed:closure-automatic.
v1.100.0 · October 12, 2026
- Set up SendGrid through the API (area
campaigns):GET /sendgrid(right, connection, missing key scopes, events and, per sender domain, DNS records, DMARC, personal mails, replies),POST /sendgrid/events,POST /sendgrid/domains(returns the DNS records to set),POST /sendgrid/domains/{id}/verify,DELETE /sendgrid/domains/{id},PUT /sendgrid/domains/{id}/personal,POST/DELETE /sendgrid/domains/{id}/repliesandPOST /sendgrid/domains/{id}/replies/verify(replies through Inbound Parse, with the MX record inreplies.mxRecord) andGET/PUT /sendgrid/my-sender-name(your own name before the @, for every member). The API does not accept the SendGrid key: connecting and disconnecting happen only in the app. Everything on the organization requires ORG_ADMIN; setting up also requires the “Email campaigns” right, viewing and removing work without it. New reasons in422 precondition-failed:sendgrid-domain-not-in-account,sendgrid-key-invalid,sendgrid-unreachable,sendgrid-rejected,sendgrid-events-failed,sendgrid-personal-not-released,sendgrid-domain-not-confirmed,sendgrid-domain-not-personal,sendgrid-parse-scopes-missing(withmissingScopes),replies-not-configured,sendgrid-policy-forbidden,sendgrid-parse-failed,sendgrid-replies-not-set-up.
v1.99.0 · October 12, 2026
- Write automations (scope
automations:write, acting person ORG_ADMIN):POST /automations(created switched off),PATCH /automations/{id}(missing parts stay, new version),DELETE /automations/{id},POST …/activateandPOST …/deactivateas well asPOST /automation-runs/{id}/resumefor failed runs. Flow errors come as422 validation-failedwith location (body.flow.nodes.‹node›.fields.‹field›) and code. New for reading:GET /automation-catalogwith triggers (filters, placeholders), date sources and the actions with their fields.
v1.98.0 · October 12, 2026
- Set up resources:
POST /appointment-resourcesandPATCH /appointment-resources/{id}(the same checks as the resource dialog),GET …/availability,PUT …/schedule(schedule in a cycle of 1 to 4 weeks),POST …/absencesplusPUTandDELETE …/absences/{absenceId}(vacation, training, sickness, extra consultation),GETandPOST …/closure-overridesplusDELETE …/closure-overrides/{overrideId}(working on a closed day after all),GET …/working-hours(preview of the coming weeks),GETandPUT …/meeting-defaults(Zoom user, own number) andGET …/zoom-users. Rights as in the app: whoever manages appointments, at any resource; the person at their own (time zone only, not name, slug and active; as Zoom user only the one with their own address); every member creates their own availability. A person who already is a resource answers409withalready-resource. New reason forprecondition-failed:zoom-unavailable.
v1.97.0 · October 12, 2026
- New: read automations (area
automations, scopeautomations:read):GET /automations,GET /automations/{id}with flow (flow: nodes withkindandnext, conditions, waits; an action is named after its endpoint, such astasks.create),GET /automations/{id}/runs(last 100 runs with steps,failedOnly) andGET /automations/{id}/stats(90 days, per node reached, failed, exits, waiting). Creating and updating follow.
v1.96.0 · October 12, 2026
- Set up appointment types:
POST /appointment-typesandPATCH /appointment-types/{id}(the same checks as the appointment type dialog;PATCHchanges only the given fields),GETandPUT /appointment-types/{id}/staffing(staffing: roles, candidates, distribution, presence, video tool per person),GETandPOST /appointment-types/{id}/linksplusPOST /appointment-links/{id}/revoke(booking links). Reading withappointments:read, writing withappointments:writeand a person with the “Manage scheduling” permission. A taken slug answers409withslug-taken. New reasons forprecondition-failed:appointment-type-not-public,quota-portal-only.
v1.95.0 · October 12, 2026
- Email campaigns through the API (area
campaigns, path/email-campaignsbecause/campaignsare affiliate campaigns):GET /email-campaigns/setup(SendGrid connected, events, confirmed domains, marketing templates, smart lists, tags, own addresses for the test email),GET/POST /email-campaigns,GET/PATCH/DELETE /email-campaigns/{id},POST /email-campaigns/recipient-count,POST /email-campaigns/{id}/check(check with Rspamd and a test send in the background,202),POST /email-campaigns/{id}/test-email(only to the acting person's own addresses, at most ten per hour, otherwise429),POST /email-campaigns/{id}/start(now or withscheduledAt; yellow only withconfirmWarnings) and/pause,/resume,/cancel. Every endpoint, reading included, requires ORG_ADMIN (403 forbidden, a key without a creator403 no-acting-user) and the organization's “Email campaigns” right (403 feature-not-available). New reasons in422 precondition-failed:campaign-check-missing,campaign-check-outdated,campaign-check-red,campaign-check-warnings,sendgrid-not-connected,sendgrid-events-missing,sendgrid-not-ready,campaign-template-missing,campaign-template-not-marketing,campaign-selection-empty,campaign-smart-list-unknown; a transition the state does not allow answers409withwrong-status.
v1.94.0 · October 12, 2026
- Webhook targets fully through the API (scope
webhooks:manage):POST /webhook-targets(secret in the response),PATCHandDELETE /webhook-targets/{id},POST …/rotate-secret,GET …/secret,POST …/test(synchronous, with sample data or a contact; with a contact alsocontacts:read),GET …/deliveries/{deliveryId}/body(alsocontacts:read) andPOST …/deliveries/{deliveryId}/retry. - New: inbound hooks through the API (
/inbound-hooks, scopewebhooks:manage): list, create (stateLEARNING, optionally with a requiredAuthorizationheader), read, update (name,recordTypes,mapping,state), delete, rotate the URL, read the required header, sample with a list of paths (GET …/sample, alsocontacts:read), deliveries, body of a delivery (alsocontacts:read) and reprocess.
v1.93.0 · October 12, 2026
- Write appointments (scope
appointments:write):POST /appointments(assign; one-to-one withcontactId, group withparticipantsfrom smart lists, tags and contacts),POST /appointments/{id}/cancel,/reschedule,/host,/type,/no-show,/participants,DELETE /appointments/{id}/participants/{contactId}andPOST /appointments/{id}/meeting(renew the video link). The same checks and the same appointment messages as in-house. Each of these calls requires a person with the “Manage scheduling” permission (owner, ORG_ADMIN or individual permission): without a personno-acting-user, without the permissionforbidden. A taken time answers409withslot-taken. New reasons forprecondition-failed:contact-without-phone,appointment-not-open,appointment-not-started,not-a-group-appointment,last-participant.
v1.92.0 · October 12, 2026
- Number circles and PDF templates in the
templatesarea:GET/POST /number-circles,GET/PATCH /number-circles/{id}(prefix, 6 to 12 digits, yearly reset, plusissuedand the next number; once a circle has issued numbers, prefix, digits and yearly reset are fixed,409withformat-locked),GET/POST /pdf-templates,GET/PATCH /pdf-templates/{id}(name, number circle, validity in months, up to four signer slots) andPUT /pdf-templates/{id}/fields(the complete field list, checked as in the app; the first error comes as422 validation-failedwith the reason in the code, e.g.bindingUnknownornumberWithoutCircle). A PDF template is created on a PDF that was uploaded and confirmed throughdocumentsfirst. Writing only if the person behind the credential is an ORG_ADMIN. Neither a circle nor a template is deleted:active: falseretires.
v1.91.0 · October 12, 2026
- OAuth: an OAuth credential now receives the
webhooks:managescope only if its user is ORG_ADMIN in the bound organization, as in the user interface. It is checked at consent and on every call; if the user loses the role, the scope is missing from the next call on (403 insufficient-scope). The consent page shows it locked for non-admins. API keys are not affected; only an ORG_ADMIN creates them. The endpoint description is unchanged.
v1.90.0 · October 12, 2026
- Read appointments (scope
appointments:read):GET /appointments(list by start, filters for period, status, appointment type, resource and contact),GET /appointments/{id}(the same shape as theappointments.appointment.*webhooks, plus seats, participants and hosts),GET /appointment-typesandGET /appointment-types/{id}(all settings including kind one-to-one, group or lesson, and services),GET /appointment-resourcesandGET /appointment-resources/{id},GET /appointment-types/{id}/slots(free times as when assigning in-house, at most 62 days per request). Appointments with a lab request appear only with client data access; otherwise they are missing and the single read answers404. Writing and setup follow in the next versions.
v1.89.0 · October 12, 2026
- Templates through the API (area
templates):GET/POST /message-templates,GET/PATCH /message-templates/{id}for email and SMS templates (formal and informal version, usagecontactsorpartnerPortal,purposetransactionalormarketing), plusGET/POST /letter-templates,GET/PATCH /letter-templates/{id}for letter templates (with number circle for{{brief.nummer}}). Read withtemplates:read, write withtemplates:write, and only if the person behind the credential is an ORG_ADMIN (otherwise403 forbidden, a key without a creator403 no-acting-user). There is no deletion:active: falseretires. Unknown placeholders in contact templates reject the save with422.
v1.88.0 · October 12, 2026
- Video rooms (
/rooms, scopesrooms:read/rooms:write):GET /roomsandGET /rooms/{id}(with host and guest link while the room is open),POST /rooms/instant(instant meeting with a contact; the host is the key's creator),POST /rooms/{id}/participant-links(personal link for the invited contact or an appointment participant),POST /rooms/{id}/close(instant meetings only; rooms of appointments close when the appointment is cancelled, otherwise409withappointment-room),GET /rooms/{id}/recordings(video recordings and calls withdocumentId) andGET/PATCH /rooms/settings(the “Summary” switch, changed by ORG_ADMINs only). Visibility as for conference documents (1.85.0): ORG_ADMINs see all rooms, others only those they host; a key without a creator sees none. New reasonroom-not-configuredin422 precondition-failed; without the organization's “Live room” right,403 feature-not-available.
v1.87.0 · October 12, 2026
- Three new areas with read and write scopes:
rooms(video rooms),templates(letter, email, SMS and PDF templates including number ranges) andcampaigns(email campaigns). The endpoints follow in the next versions; until then the scopes grant no access yet. Templates and campaigns have their own scopes becauseemail:writeonly allows sending, not setting up or bulk sending. - Two new error types, both
403:no-acting-userwhen an action requires an acting person (role, individual permission, author) and the credential has none (API key without a creator), andforbiddenwhen the credential's person lacks the permission the user interface requires in the organization. For a key the person is whoever created it; for OAuth access it is the signed-in user. Existing endpoints do not change their responses.
v1.86.0 · October 12, 2026
- New area
appointmentswith the scopesappointments:readandappointments:write. The endpoints follow in the next versions; until then the scope grants no access yet. Appointments with a lab request attached count as client data, as in webhooks: they appear only if the organization has enabled client data for the API and the credential carries aclients:scope.
v1.85.0 · October 12, 2026
- Documents: conference documents (recordings and summaries of the live room) are visible only to ORG_ADMINs of the organization and to the host of the call. For an API key, the user who created it counts; a key without a creator sees none. They are then missing from
GET /documents, andGET /documents/{id}answers404. The endpoint description is unchanged, which is why it is noted here.documents.*events still go to the organization's webhooks, which only an ORG_ADMIN sets up.
v1.84.0 · October 11, 2026
- New event
letters.email.received: an email arrived through the organization's SendGrid reply address and was rated.emailcarriesid,conversationId,from,subject,receivedAt,sentiment(positive,neutral,negative,nullif rating failed),contactId(ornull) andcampaignIdif the email replies to a campaign (otherwisenull). Without the email body. Sent only after rating; emails through the Resend inbox (receipts, forwards) do not send it. In automations it is the trigger “Email received” with filters by rating and campaign.
v1.83.0 · October 11, 2026
- Call guides (
/call-guides):content.resultsdefines results, named endings withid,nameand optionallycolor(at most 20, name at most 80 characters), andresulton a step (type: point) or an answer refers to one. It only applies at an ending; elsewhere it is kept and ignored, and an unknown ID is dropped when reading. A result without a name is rejected on save with422and the codeergebnis-ohne-name. Until now, results created in the editor were lost on an update through the API.
v1.82.0 · October 11, 2026
callguides.run.completednow carriesguideRun.resultIdandguideRun.resultName: the named outcome of the ending the run reached (for example “Meeting booked”). The organization defines outcomes in the guide and assigns them to a step without a successor or to an answer that leads to the end. ID and name come from the version the call used. Without an outcome at that ending both arenull;outcome(the last step) is unchanged.
v1.81.0 · October 11, 2026
leads.lead.creatednow carriesconsentPurposesnext toconsent(element → ticked): the purpose of each consent as in forms (1.79.0).INQUIRYis the required box “contact about my inquiry” and does not allow marketing,MARKETINGthe optional box “marketing”,nulla custom box or an older one that combines inquiry and marketing. Anyone deriving marketing consent from the event takes onlyMARKETING(ornull) withconsent=true. Leads without a form (finder, manual) have an empty object.
v1.80.0 · October 10, 2026
kindon SMS (GET /sms,GET /sms/{id},sms.message.*events) has the new valueEINWILLIGUNG: the non-promotional request to confirm consent given in a form via a link. It is sent through the organization's Twilio account to the contact, with the organization's name as footer.
v1.79.0 · October 10, 2026
- Forms: every consent now carries
purpose, in the form definition (GET /forms/{id}) and in submissions (GET /forms/{id}/responses).INQUIRYis the required checkbox “contact about my request”,MARKETINGthe voluntary checkbox “advertising”,nulla custom checkbox or an older one that combines request and advertising. Submissions from before this version havenull. OnlyMARKETING(or an older combined checkbox) is a consent to advertising;INQUIRYdoes not permit advertising.
v1.78.0 · October 10, 2026
- New event
contacts.webhook.received: an inbound hook of the organization has accepted and processed a record from another system.hookgives ID and name,companythe company (existing or newly created, otherwisenull),contactthe person, or without a person the company itself;contactStatusandcompanyStatusareneworexisting. Inbound hooks are created in settings under Integrations → Interfaces: an address of their own,POST /api/hooks/‹id›(outside/api/v1, optionally requiringAuthorization: Bearer …), which accepts JSON or forms up to 256 KB immediately with202and processes them in a queue per hook (at most 60 per minute; above 600 per minute it answers429). In learning mode the next delivery is only captured as a sample on which the fields are mapped.
v1.77.0 · October 10, 2026
- Handovers to other organizations: new area
handoverswith the scopeshandovers:readandhandovers:write(existing keys do not have them).GET /handover-connectionslists the active connections through which this organization may hand over (id,name,recipientName).POST /handoverswithconnectionIdandcontactId(pluscontacts:read) copies the contact with its company into the receiving organization and responds201withhandoverId, never with created or merged. Errors:404(connection-unknown,not-your-connection,contact-unknown),422 precondition-failed(connection-revoked,connection-not-active),500(copy-failed). At the recipient, the handover triggerscontacts.handover.received(since 1.75.0); automations get a filter by connection for it and the action “Hand over to organization”.
v1.76.0 · October 10, 2026
- Webhook targets: named addresses of other systems to which a contact with its company is sent, for example by the new action “Send webhook” in automations. Unlike
/webhooks, targets do not subscribe to events. New:GET /webhook-targets,GET /webhook-targets/{id},GET /webhook-targets/{id}/deliveries(log, 30 days, with the beginning of the response) andPOST /webhook-targets/{id}/sendwithcontactId(202, scopeswebhooks:manageandcontacts:read;409 conflictwithreason: target-inactiveif the target is off). The body uses the event envelope withtype: contacts.contact.sentanddata={ contact, company, automation, test }, signed per Standard Webhooks with the target's secret, retried after 1 min, 5 min, 30 min, 2 h and 12 h, and switched off after five dead deliveries in a row. Creating, editing, the secret and tests are in settings under Integrations → Interfaces.
v1.75.0 · October 10, 2026
- New event
contacts.handover.received: another organization has handed a contact over to this one through a handover connection.contactis the contact in this organization (newly created or merged with an existing one),companyits company ornull,handovernames the handover, the connection (connectionId,connectionName) and theoutcome(createdormerged). It can be subscribed to like any event and is a trigger in automations. The handover connections themselves follow in a later version.
v1.74.0 · October 9, 2026
- Correspondence:
POST /outbound-emailsandPOST /smsoptionally takevorlageId, the ID of a template from the shared library (use “Contacts”). Subject, text, informal (Du) version and send type then come from the template, read at sending time, with its placeholders (such as{{person.firstName}},{{anrede}}); whoever changes the template changes the next send. EithervorlageIdor free text: for email,subjectandbodyHtmlare now only required withoutvorlageId, for SMSbodyandart; withvorlageIdthey must not be sent, and for SMScontactIdis then required. An email from a template is sent like one from the contact's conversation (kind: gespraech, footer with the conversation ID; promotional templates only with email consent and with an unsubscribe link). New reasons in422 precondition-failed:message-template-not-found,message-template-archived(fixable),message-template-without-sms(fixable, SMS only),email-ohne-einwilligung.
v1.73.0 · October 8, 2026
- Forms: a consent for email or phone now only counts as asked when a field of its channel has a value. If it is empty, the consent no longer appears in a submission's
consents(GET /forms/{id}/responses,forms.response.submitted) or inconsentofleads.lead.created, not even as declined; atruesent inPOST /forms/{id}/responsesis then not stored. Until now it was always listed, withaccepted: falseor eventruefor an address that did not exist. Free-text consents (channelCUSTOM) are unchanged.
v1.72.0 · October 8, 2026
- Contacts: new field
dateOfBirth(“YYYY-MM-DD”, PERSON only, between 1900 and today) in all contact responses and events, settable viaPOST /contactsandPATCH /contacts/{id}(nullclears). Same format asclients.dateOfBirth, but on the contact; an invalid date or a date on a company returns422 validation-failed(body.dateOfBirth).
v1.71.0 · October 8, 2026
- New appointment events:
appointments.appointment.booked(confirmed; with mandatory payment, after the payment),appointments.appointment.rescheduled(withpreviousStartsAt,previousEndsAtandby:customerorprovider),appointments.appointment.cancelled(withbyandreason) andappointments.appointment.noShow(marked by the team, withmarkedByUserId). The payload carries the appointment underappointment, the contact underappointment.contactId; automations can use these events as triggers. Only confirmed appointments are reported. An appointment with a lab request is only sent to endpoints with client data access.
v1.70.0 · October 8, 2026
- New event
calls.call.ended: a call has ended, exactly once per call.callcarries direction (inbound,outbound), outcome (answered,missed,voicemailfor our voicemail,failed), contact (contactId,nullfor an unknown number), speaker, numbers, times anddurationSeconds. Call notes, recordings and transcripts are never included. - New event
callguides.run.completed: a call guide was completed during a call (main path reached an end, no required step open), exactly once per run; later edits do not trigger it again.guideRuncarries the guide (guideId), contact (contactId, the speaker or otherwise the call's contact),outcome(ID of the last step),answers(question → answer as IDs), objections used and the path. Notes are never included.
v1.69.0 · October 8, 2026
- Contacts, new endpoints for single changes (automation actions):
POST /contacts/{id}/tags(tagIdfrom the tag pool ortagas text) andDELETE /contacts/{id}/tags/{tag}(id or text) add or remove one tag without sending the whole list; an existing or missing tag changes nothing and sends no second event.POST /contacts/{id}/notescreates a note (plain text, stored as escaped HTML).PUT /contacts/{id}/custom-fields/{slug}sets a custom field (value: text, list of option keys ornull; not client-record-only fields or consents).PUT /contacts/{id}/ownersets the owner (userIdof a member ornull). Du/Sie and standard fields still viaPATCH /contacts/{id}.
v1.68.0 · October 8, 2026
- New event
funnels.funnelLead.created: a lead from a funnel or website form, with the submission (lead.id), the site (lead.funnelId,lead.funnelName,lead.funnelKind), the page of the form (lead.stepId,lead.stepName,lead.stepPath), the form and the contact (lead.contactId). Identifiers and names only, no personal details. It is sent in addition toleads.lead.createdand is available in automations as the trigger “Lead from a funnel or website”. leads.lead.createdfrom a funnel now carriescontactIdalso when the submission created a prospect (the prospect's contact); previously it wasnull.
v1.67.0 · October 8, 2026
- Contracts from template (
POST /contracts): new fieldsend(defaultfalse, draft only as before). Withtruethe contract is sent as soon as its PDF has been rendered; the response still shows the draft, the eventesign.request.sentreports the sending. OptionallyreminderPolicyandlocaleas onPOST /signature-requests/{id}/send. If rendering fails or takes longer than ten minutes, the draft stays.
v1.66.0 · October 8, 2026
- Form responses (
GET /forms/{id}/responses,GET /forms/responses/{id}, eventforms.response.submitted): new fieldcontactId, the contact the submission belongs to;nullwhile there is none, and always for client record forms. Automations triggered by “Form submitted” can now use contact actions. - Form responses: new value
bookingforsource, submitted through an appointment booking flow. Previously these responses appeared asapi.
v1.65.0 · October 5, 2026
- Call guides: new action type
consent({ type: "consent", channel: "EMAIL" }) to record consent to email on the phone; the wording comes from contacts at runtime.channelis currently onlyEMAIL; any other value returns422 validation-failed.
v1.64.0 · October 5, 2026
- Call guides (
/call-guides) with actions and inputs, all optional: a point can be anaction(email,sms,callback,handover,checkout,appointment,form) or usefieldto write an input into a field of the call partner; a question usesfieldto write the chosen answer, or the answer'svalueif set (such as the key of a choice);mandatory: truemakes a step mandatory;actionsplaces actions at the side of the call. New check reasons onbody.content:aktion-unvollstaendig(template or link missing, side action without a name) andaction-and-field(a point with both). Reading a guide and writing it back keeps these parts.
v1.63.1 · October 5, 2026
- Clarification of 1.63.0 (not yet released):
contactFieldson call guides only accepts keys the mini window at the side of the call can show:title,website,addressStreet,addressPostalCode,addressCityorcf:<slug>(lowercase letters, digits,_). Any other key returns422 validation-failedinstead of being dropped silently.
v1.63.0 · October 5, 2026
- Call guides (
/call-guides) can do more, all optional: per stephint(a hint only for the person on the phone) andcards(hint cards withtitle,text,color); per guidecards(always visible),objections(withnameandstart, the first step of their own path) andcontactFields(extra fields for the mini window at the side of the call). Placeholders also work in hints and cards. New check reasons onbody.content:karte-leerandeinwand-unvollstaendig.
v1.62.0 · October 5, 2026
- New: call guides of the telephony feature (branching checklists for phone calls).
GET /call-guides,GET /call-guides/{id},POST /call-guidesandPATCH /call-guides/{id}, new scopescallguides:readandcallguides:write; in the API MCP as toolscallguides_list,callguides_get,callguides_createandcallguides_update. A guide has astartandnodes:pointto tick off orquestionwithanswers;nextleads on (missing: next node in the list,null: end, ID: to that node). Only content without errors is saved, otherwise422with the reasons onbody.content. Every change to name, description or content is a new version (version);activeswitches without a new version.
v1.61.0 · October 4, 2026
- Required field
artonPOST /sms(also MCPletters_sendSmsand the LeadConnector actionsms-send):notwendig(necessary) orwerblich(promotional), no default; a request withoutartreturns422 validation-failedonbody.art. This is stricter than before but affects nobody: there was not a singlePOST /smsrequest in production. The send type determines the SMS footer (necessary: the organization's name; promotional: the name and “Keine SMS mehr? STOP antworten”), which is appended tobodyand counts towards the segments, and a promotional SMS only goes to a contact (contactId) with SMS consent: without a contact422 precondition-failedwithreason=sms-werblich-ohne-kontakt, without consent for the numberreason=sms-ohne-einwilligung(bothfixable: false).
v1.60.2 · October 4, 2026
- Fixed:
POST /documentswithcontactIdlinks the document to that contact, and the link now survives the analysis of the document. Previously the automatic assignment could overwrite it, with the hit of a name search or with nothing, so thatGET /documents/{id}showed a different contact or none. The automatic assignment now only fills what is empty; the same applies toPATCH /documents/{id}withcontactIdfollowed by a new analysis.
v1.60.1 · October 4, 2026
- Clarification of 1.60.0, which had not yet been released: the SMS to a member (
channel: sms) falls back to the default number in their profile if they have not entered a number for SMS confirmation in this organization, as for signing and appointment reminders.member-without-phonenow only occurs if both are missing.
v1.60.0 · October 4, 2026
POST /organization/members/{userId}/notificationscan now also send an SMS:channel: smsgoes to the mobile number the member entered for SMS confirmation in this organization, otherwise the default number in their profile (the same order as for signing and appointment reminders), through the organization's Twilio account; the text istitleandbody. If both are missing:422 precondition-failed,reason=member-without-phone,fixable: true; if it is invalid:member-phone-invalid. The SMS sending reasons (twilio-*) apply as forPOST /sms(1.58.0), network errors500. The SMS appears inGET /smswithkind: API.
v1.59.0 · October 4, 2026
kindon SMS (GET /sms,GET /sms/{id},sms.message.*events) has the new valueGESPRAECH: an SMS a team member wrote by hand in a contact's conversation. If you evaluatekind, allow for unknown values.
v1.58.0 · October 4, 2026
POST /smsnow only sends through the organization's own Twilio account (Organization → Integrations); this also applies to automations and the LeadConnector actionsms-send. Without a connected account, without a sender number or with invalid credentials the request returns422 precondition-failedwithreason=twilio-nicht-verbunden,twilio-keine-nummerortwilio-zugang-ungueltigandfixable: true; no SMS is created in that case (previously a row withFAILEDand403 feature-not-available). If the recipient sent STOP:422 precondition-failed,reason=twilio-empfaenger-gesperrt,fixable: false(often only in the callback, thenFAILEDwitherrorCodeon the SMS). Number invalid according to Twilio:422 validation-failedonbody.to. Other rejection:409 conflict,reason=twilio-abgelehnt. Network error:500, retryable.- The SMS quota of 300 per organization and month is removed, because each organization pays for its own SMS as of this version.
429 sms-limit-reachedno longer occurs; the code stays in the catalog until v2.
v1.57.0 · October 4, 2026
POST /organization/members/{userId}/notificationscan now also send emails:channel: emailgoes to the member's address, withtitleas subject,bodyas text andlinkas an address in the application. If sending fails, the request returns500and may be retried. The response carries the channel used.- Documents of a client record now also include the attachments of record mail (portal messages in the record area). The same rules apply as for lab sheets and contracts with clients (1.54.0): without client-data enablement and a
clients:scope they are missing fromGET /documents, a request by ID (including…/download-urlandPATCH) returns 404, anddocuments.document.*events about them only go to endpoints withclientsData: true.
v1.56.0 · October 4, 2026
- New:
POST /organization/members/{userId}/notificationssends a member of the organization a message in the bell (with browser push if enabled):title, optionalbodyandlink(a path in the application). New scopemembers:notify; members otherwise stay read-only. A user who is not a member returns 404. The channel is for now onlychannel: notification; email and SMS will be added as further values.
v1.55.0 · October 4, 2026
POST /outbound-emailsaccepts an informal (Du) version:subjectDuandbodyHtmlDu, both optional and only effective together. claritos then picks per recipient according to the salutation rule (formal-only for letters, personal Du with OAuth, setting on the contact, otherwise the organization's default), and placeholders such as{{ansprechpartner.anrede}}follow the same choice. If either is missing, the email goes out entirely in the formal version, as before. The per-recipient choice is prepared and will be switched on for all organizations at once; until then every email goes out in the formal version, but the informal version can already be sent along.- The description now lists every error response the framework can return:
409on write requests (conflict, a request with the sameIdempotency-Keystill running),413on requests with a body (over 1 MB) and500everywhere. Behaviour is unchanged; these codes were only missing from the description.
v1.54.0 · October 3, 2026
- Webhooks with client data now only go to endpoints that are enabled for it. New field
clientsDataonGET/POST/PATCH /webhooks: only an endpoint withclientsData: truereceives events containing client data, that isclients.record.created,clients.record.updated,clients.message.receivedand theesign.request.*events of a contract with a client, and only while the organization has enabled client data for the API.clientsData: truecan only be set withclients:readorclients:write(otherwise403 insufficient-scope) and only while enabled (otherwise403 clients-data-not-enabled). The check runs on every delivery attempt; if the enablement is withdrawn, a pending delivery ends asFAILEDwithlastError=clients-data-not-allowed. A replay skips such events for an endpoint that is not enabled, andGET /webhooks/events/{type}/recentonly shows them to a key with aclients:scope. Until nowclients.*events went to every endpoint of the organization. - Documents of a client record (lab sheets, contracts with clients) are only returned by
/documentswhile the organization has enabled client data for the API and the key carries aclients:scope; otherwise they are missing fromGET /documents, and a request by ID (including…/download-urlandPATCH) returns 404. For a contract the same exception as in 1.53.0 applies: the user behind the key created or sent it. - The events
documents.document.ready,documents.document.analyzedanddocuments.document.updatedfor documents of a client record (lab sheets, documents of a contract with a client) count as client data: they only go to endpoints withclientsData: trueand only while the organization has enabled client data. Unlike for requests, there is no exception for the creator or sender here, because a webhook does not belong to a user.
v1.53.0 · October 3, 2026
- Contracts with clients only with client-data release: if a contact with a client record (or their representative) takes part in a contract or signature request,
GET /contracts,GET /signature-requests, the single reads,…/events,…/pdf,…/sendand…/cancelreturn it only if the organization has released client data for the API and the key carries aclients:scope; otherwise it is missing from lists, and a read by ID answers 404. Exception: contracts created or sent by the user behind the key. Lists stay full andhasMoreis accurate.
v1.52.0 · October 3, 2026
- Client-record fields in contract templates: if the organization runs a practice, templates also know fields of the client record as
<party>.akte.<field>(date of birthdateOfBirth, record numberrecordNumber, start of carecareStartedAtand endcareEndedAt, custom fields on the record and practice-only fields as<party>.akte.custom.<slug>).variableslists them.POST /contractsfills them only if the organization has released client data for the API and the key carries aclients:scope; otherwise•••appears and the record is not read.
v1.51.0 · October 3, 2026
- Contract templates know more variables: for each company, contact person and person, all fields of the contact are available (for example
company.1.email,company.1.legalFormName,company.1.contact.1.firstName,person.1.customerNumber) as well as the organization's custom fields as<party>.custom.<slug>(for examplecompany.1.contact.1.custom.jahrgang).variablesinGET /contract-templateslists them, andwarningsno longer reports them asunknown-variable.POST /contractsfills them from the contacts. Also new iscountryName(country spelled out, in the template's language) next tocountry(country code such asDE, unchanged). All existing variables remain.
v1.50.1 · October 2, 2026
POST /contract-templates/{id}/archiveresponds with200instead of201: archiving creates nothing. The other actions that create nothing, for example on quotes and documents, respond the same way.
v1.50.0 · October 2, 2026
- Contract templates can now be created, updated and archived:
POST /contract-templates,PATCH /contract-templates/{id}andPOST /contract-templates/{id}/archive, scopecontracts:write, with the same fields and the same checks as the template editor.bodyHtmlis cleaned on save: the editor's markup remains; scripts, event attributes, links other thanhttp,https,mailtoandtel, and images outside the organization's own storage are removed. The response carrieswarningslisting what was removed and placeholders that neither the party plan nor the fixed variables know (unknown-variable). An invalid party plan returns422, updating an archived template409(archived), a non-business organizationfeature-not-available. New when reading any template:anrede(AUTO,SIE,DU) andisFeeAgreement;formalremains.
v1.49.0 · October 2, 2026
- A contact of type
PERSONwith a VAT ID is rejected (422 validation-failed, pathbody.vatId, codeinvalid_combination): anyone with a VAT ID is a company. This applies toPOST /contactsand toPATCH /contacts/{id}when the change gives a person a VAT ID. Instead, create a company (type: COMPANY, legal form sole proprietorship) with the VAT ID and attach the person to it as contact person viaworksAtId. Changes to existing contacts still stored as a person with a VAT ID remain possible as long as they do not set the VAT ID.
v1.48.0 · October 1, 2026
- Payment reminders (
GET /dunning/reminders,GET /dunning/reminders/{id}) can have the new statusSUPERSEDED: they have been replaced by a later reminder for the same receivable and no longer accept payment. This happens as soon as the next level is finalized; until now the earlier one stayedSENT. In addition, reminders that were sent outside claritos before it took over can now be recorded afterwards as a link in the chain. They appear withstatus: SENT,number: nullandfeeCents/interestCents0. TheportalUrlof a superseded or recorded reminder leads to the current reminder or to the invoice. If you evaluate the status, treatSUPERSEDEDas a completed level, not as an open request for payment.
v1.47.0 · September 27, 2026
- Documents have the new field
accesswithpublicorprotected(GET /documents,GET /documents/{id},PATCH /documents/{id}and the webhooksdocuments.document.ready,.analyzedand.updated). Protected documents are not publicly available: for themurlandpreviewUrlare alwaysnull, even when the document is ready. Retrieve the file via the signed link fromGET /documents/{id}/download-url. Today this only applies to newly added Zoom recordings.urlis marked deprecated as of this version: it will later becomenullfor all documents, andGET /documents/{id}/download-urlwill then be the only way to the file. If you storeurl, switch todownload-urlnow.
v1.46.0 · September 26, 2026
addressFormon forms (GET /forms,GET /forms/{id}) can now also returnAUTO, alongsideDU(informal) andSIE(formal).AUTOmeans the form has no fixed form of address; it addresses people the way the organization or the contact specifies. Which form of address a person actually sees is decided by claritos when the form is shown. New forms default toAUTO, and existing forms set toDUwere switched toAUTO, except the anamnesis templates, whose questions themselves use the informal form. If you have treated everything other thanSIEas informal, do not treatAUTOas informal.
v1.45.0 · September 26, 2026
- Changed behaviour of
POST /signature-requestswithsend: trueand ofPOST /signature-requests/{id}/send: invitations are now always sent. If the sender's Gmail connection has expired, they go out from the claritos address, and replies still reach the sender. Until now they were held back in that case andsenderInvalidwastrue. As a resultsenderInvalidis alwaysfalsesince 1.45.0, is marked deprecated and will be removed in v2. If you reacted to it, for example with "reconnect mailbox", you will no longer receive that signal; the connection is marked invalid in claritos and its owner is asked there to reconnect.
v1.44.0 · September 26, 2026
- Contacts carry the new field
anrede:STANDARD(as set for the organization),DU(informal) orSIE(formal). Readable on all contact endpoints and in the webhookscontacts.contact.createdandcontacts.contact.updated, writable on create and update. It only applies to people: for companies the contact person counts, the value there is alwaysSTANDARD, andDUorSIEon a company is rejected with 422 (validation-failed, pathbody.anrede).
v1.43.0 · September 25, 2026
- New field
paymentProvideron invoices, quotes and orders and on their sections:MOLLIEwhen paid online via the payment layer, otherwisenull. Readable everywhere, writable on invoices and quotes (head and sections). It excludesstripeEnabled(one online provider); to switch from Stripe to Mollie, setstripeEnabled: falsein the same call. It can only be set if the organization has connected Mollie, otherwisevalidation-failed. When writing sections, omitting it means no provider. Theinvoices.invoice.*events carry the field as well.
v1.42.0 · September 25, 2026
- New event
letters.certificate.expiredfor documents from PDF templates with an expiry date (for example a certificate valid for three years). It is sent once, on the day after the last valid day; if a daily run was missed, it is caught up for up to three days. It carriescertificate(id, template, number, contact,validUntil,signed, verification code) andcontact. Revoked documents and those still awaiting signature send nothing. A reminder before expiry is not an event but a date trigger of automations.
v1.41.0 · September 24, 2026
POST /letters/{id}/sendnow refuses to send with409 conflictandreason=certificate-attachment-invalidwhen an attachment is an issued document (a certificate from a PDF template) in a version that is not valid: cancelled, not yet signed or superseded by the signed version. Until now such an attachment was sent. The same check applies to letters from the "letter from template" action.
v1.40.0 · September 24, 2026
- New endpoints for automations and integrations.
POST /letters/from-templatecreates a letter from a letter template for a contact and delivers it once its PDF is ready (channel:EMAIL,POSTALorBOTH; response 202 with the letter asDRAFT).POST /outbound-emailssends a free-form email to a contact; subject and body may carry the same placeholders as letter templates, and the record then appears underGET /outbound-emailswithkind=message. If the contact lacks the required detail, both respond withprecondition-failedand areasonsuch ascontact-without-email,contact-without-address,postal-not-connected,template-archivedorsender-invalid. There is no fallback to another delivery channel. - When called from an automation, both endpoints recognise a resumed run: the same step finds the same letter or email again instead of creating a second one. If a letter fails to be delivered only after it was accepted (202), the acting user receives a notification; the caller is not yet informed of this.
v1.39.0 · September 24, 2026
- New error code
precondition-failed(422): a precondition on the object is not met, for example a contact without an email address. The response carriesreason(a stable code such ascontact-without-email) andfixable(whether changing the data resolves it). Retrying after fixing the data needs a newIdempotency-Key: the store also remembers this error response.
v1.38.0 · September 24, 2026
- New events
contacts.tag.addedandcontacts.tag.removed: one event per tag set on or removed from a contact, carryingcontactIdandtagin the same shape astagDetails(id, text, label, source, group). The event is sent only once the change is stored. A different spelling of the same tag is not a change. Renaming, merging and deleting in tag management do not trigger events, nor does merging contacts.
v1.37.0 · September 24, 2026
kindon SMS (GET /sms,GET /sms/{id},sms.message.*events) has the new valueAPPOINTMENT_REMINDERfor appointment reminders. Until now reminders carriedAPIalthough they were not sent through the API; older reminders keepAPI. Appointment reminders do not count toward the SMS quota (sms-limit-reached).- Added retroactively: two values entered the contract without an entry of their own. (1) Since 13 September, the type of a form field (
GET /forms/{id}) can beUPLOAD; the answer to such a field is the ID of a document. (2) Since 24 September,taxCategoryon articles and on the items of quotes, orders and invoices can beOUTSIDE_SCOPE(not taxable domestically, section 3a German VAT Act). Clients that evaluate these fields exhaustively should know both values.
v1.36.0 · September 24, 2026
- Signature requests now know the source
PDF_TEMPLATE: a document created from a PDF template, such as a certificate with a running number. The value appears in thesourceKindfield of requests under/esign, as the filter?sourceKind=PDF_TEMPLATEand in the payload of theesign.request.*events. If you handlesourceKindexhaustively, for example in aswitch, add the new value.
v1.35.0 · September 24, 2026
- New error code
sms-limit-reached(429) onPOST /sms: through the API, the LeadConnector action and automations, an organization sends at most 300 SMS per calendar month (German time); the value can be set per organization. The response includeslimit,usedandresetsAtand carriesRetry-Afteruntil the start of the next month. Appointment reminders do not count.
v1.34.0 · September 24, 2026
- Changed behaviour for document
tags:PATCH /documents/{id}no longer stores tags lowercased and with-instead of spaces. Each tag comes back spelled as in the organization's tag vocabulary; sendingVIPwhilevipalready exists returnsvip. Tags that differ only in upper and lower case, spaces or hyphens count as the same tag. An unknown tag is created as sent; spaces and special characters are kept, previously spaces became-and special characters were removed. - The
GET /documents?tag=filter now matches regardless of case, spaces or hyphens; previously it compared exactly.
v1.33.0 · September 24, 2026
- Contacts now carry
tagDetailsnext totags: for each tag the stable id (id), the text (tag), the explanatory label (label), the source (source) and the group (group, or null). The planned events for a tag being added or removed will use the same shape. The webhookscontacts.contact.createdandcontacts.contact.updatedinclude the field as well. The id stays the same when a tag is renamed; if you map tags, use it instead of the text. - Changed behaviour for
tags: contact tags are no longer lowercased. They come back spelled as in the organization's tag vocabulary; sendingVIPwhilevipalready exists returnsvip. Tags that differ only in upper and lower case count as the same tag. Spaces and special characters are kept; previously spaces became-and special characters were removed. The?tag=filter now matches regardless of case; previously it did not find capitalised tags.
v1.32.1 · September 15, 2026
- Open items (
/open-items) are now available for every organization type, including personal spheres and households. Previously the API answered withfeature-not-availablethere although the app keeps the items. Unchanged: reminders (/dunning/reminders) remain limited to business organizations.
v1.32.0 · September 7, 2026
- OAuth foundation moved to Better Auth 1.7 (new oauth-provider plugin). New: token revocation and token introspection as their own endpoints, resource-bound tokens, public clients without a secret, stronger client authentication. Two security advisories affecting the previous version are resolved. Existing OAuth connections have to be re-established once — clients, consents and tokens from the old version cannot be carried over. API keys (capi_) are unaffected.
v1.31.0 · September 7, 2026
- Website-builder MCP: the tool list is now filtered by permission — an access with sites:read no longer sees the writing tools at all. Calling a disallowed tool directly still answers with 403 insufficient_scope.
v1.30.0 · September 7, 2026
- Connected apps in the profile: users see every OAuth grant (application, organisation, permissions in plain words, valid accesses, last sign-in) and can revoke it themselves. Revoking removes the organisation binding, the issued tokens and the consent — the application loses access immediately and asks again on the next connection.
v1.29.0 · September 7, 2026
- LeadConnector menu entry: claritos can appear as a custom menu link in LeadConnector (/embed/leadconnector in an iframe). The encrypted location context from LeadConnector is read with the app's SSO key and shows the linked organisation, active triggers and available actions. The context proves the location, not a claritos identity — it creates no sign-in and the page shows no business data.
v1.28.0 · September 7, 2026
- Zapier app: sign-in now uses OAuth 2.1 (authorization code + PKCE, automatic token refresh) instead of an API key — a prerequisite for public listing. On connect users pick the organisation and permissions in the claritos consent; the requested scope list is generated from the spec and leaves clients data out. Missing permissions surface as 403 on the affected action.
v1.27.0 · September 7, 2026
- Checkout events in the standard format: payments.checkout.pending / .completed / .failed (payment-link sales) now also run through the API webhook service — with standard signature, retries, delivery log, replay and alerts. The existing payment-link webhooks on the link stay unchanged; to migrate, subscribe to the new types and switch the old target off.
v1.26.0 · September 7, 2026
- OAuth consent: permissions can be deselected individually (least privilege). The client only receives the selected scopes — even if it requested all of them; clients-data scopes are deselected by default. Consent without any selected permission is no longer possible; an empty grant means “no API rights”.
v1.25.0 · September 6, 2026
- Website-builder MCP (POST /api/mcp) now also accepts OAuth 2.1 access tokens (login + consent, scopes sites:read/sites:write) — chat connectors (claude.ai, ChatGPT) no longer need a cmcp_ token; cmcp_ tokens stay valid. Scopes are enforced per tool (get_/list_/verify_/suggest_ = read, everything else = write; 403 insufficient_scope). Protected-resource metadata per MCP server: /.well-known/oauth-protected-resource/api/mcp and …/api/mcp/v1.
v1.24.0 · September 6, 2026
- Make custom app (integrations/make): app tree generated entirely from the spec — connection API key + environment, webhook (attach/detach via /webhooks), one instant trigger per event type, action/search/get/delete modules per endpoint (search with cursor pagination, actions with Idempotency-Key), Problem-Details error mapping; upload script for the Make Apps SDK API. “Make” guide. All four platform apps (LeadConnector, Zapier, n8n, Make) are now in the repository.
v1.23.0 · September 6, 2026
- n8n community node (integrations/n8n, npm n8n-nodes-claritos): regular node with resource = domain and operation = endpoint (declarative, generated from the spec; lists unwrapped to data), trigger node subscribing via POST /webhooks with signature verification and cleanup on deactivation, credential API key + environment. “n8n” guide.
v1.22.0 · September 6, 2026
- Zapier app (integrations/zapier): one REST-hook trigger per event type (subscription via POST /webhooks, signature verification, “Load sample” from /webhooks/events/{type}/recent), actions for every write endpoint, searches for every list — generated entirely from the spec. New snapshot docs/api/events.v1.json (event catalog with samples). “Zapier” guide.
v1.21.0 · September 6, 2026
- LeadConnector marketplace app (route C): one install per location (OAuth from the organisation settings or External Authentication with an API key), custom workflow actions (contact-create, task-create, sms-send, quote-create, invoice-create, form-response — routed through the API framework with the user's key), custom workflow triggers (lead_created, contact_created, invoice_paid, invoice_issued, quote_accepted, esign_completed, form_submitted, task_done — webhook endpoints internally). “LeadConnector” guide.
v1.20.0 · September 6, 2026
- MCP over the API: POST /api/mcp/v1 (Streamable HTTP) — one tool per endpoint (name <domain>_<action>, input params/query/body as in the reference, optional idempotencyKey on write calls). Same auth (API key or OAuth 2.1), same scopes, clients-data gate, rate limits and log as HTTP; the tool list shows only what the access is allowed to do. “MCP” guide.
v1.19.0 · September 6, 2026
- OAuth 2.1: Besides API keys the API now accepts OAuth access tokens (authorization code + PKCE, refresh tokens, dynamic client registration). The user grants exactly one organization in the consent screen; scopes are the same as for keys. Discovery at /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource. “OAuth” guide (flows, consent, Zapier/n8n).
v1.18.0 · September 6, 2026
- Finder + foods (read-only): GET /finder/practitioners (radius, place, language, qualification and topic filters; the same search as the organization’s public finder page), GET /finder/practitioners/{slug} (profile with locations, focuses, qualifications; old slugs are resolved), GET /finder/places (place suggestions). GET /foods/search (hits grouped by category), GET /foods (list per category), GET /foods/{id} (by ID or slug) — global, nutrients per 100 g, portion data, source and attribution in every response.
v1.17.0 · September 6, 2026
- Organization (read-only): GET /organization (master data, address, tax/register data, bank, logo, inbox address, branding domain, e-sign level, API settings), GET /organization/members (members with role, visibility, client access), GET /organization/invitations (invitations; expired ones are reported as EXPIRED), GET /organization/api-keys (own keys — metadata only, never hash/plaintext; isCurrent marks the calling key). Event organization.member.joined (invitation accepted, organization created).
v1.16.0 · September 6, 2026
- Finance (read-only): GET /accounts, GET /accounts/{id} (chart of accounts with kind, subtype, hierarchy, postability, bank data and balance — canonical debit − credit plus display balance), GET /bookings, GET /bookings/{id} (journal with lines per account/contact/cost category, documents, open-item links, reversal reference; filter by period, status, account, contact, document), GET /statements, GET /statements/{id}, GET /statements/{id}/lines (bank statements with line states, assigned bank account and credit-card summary). Events finance.booking.created (all creation paths) and finance.booking.reversed. No write paths in v1.
v1.15.0 · September 6, 2026
- Post/SMS/e-mail: GET/POST /letters (create a letter, optionally generate the PDF right away), GET/PATCH /letters/{id}, POST /letters/{id}/generate (PDF asynchronously, pdfState), POST /letters/{id}/send (channel EMAIL, POSTAL or BOTH — postal dispatch via the connected provider is charged), GET /letters/{id}/pdf, GET /postal-letters, GET /postal-letters/{id} (queue with status, pages, cost, tracking), GET/POST /sms, GET /sms/{id} (send SMS — charged — and read delivery status), GET /outbound-emails, GET /outbound-emails/{id} (outbound e-mails of all areas; client-record e-mails excluded). Events letters.letter.sent, letters.postal.submitted/sent/delivered/failed, sms.message.sent/delivered/failed.
v1.14.0 · September 6, 2026
- Contracts/e-sign: GET /contract-templates, GET /contract-templates/{id} (template with party plan, variable slugs and HTML), GET/POST /contracts (contract from template: parties per slot, title/place/date, extra variables; the worker renders the PDF asynchronously — renderState), GET /contracts/{id}, GET/POST /signature-requests (signature request from a PDF document with parties, optional field placement, signature level, consent; sent immediately by default), GET /signature-requests/{id}, POST …/send (sends or resends; contracts only after rendering), POST …/cancel, GET …/events (hash chain), GET …/pdf (sealed copy or original, short-lived URL). Events esign.request.sent/completed/sealed/expired/declined/cancelled. Signing links are never exposed.
v1.13.0 · September 6, 2026
- Affiliates: GET /affiliates, GET /affiliates/{id} (partner with status, contract kind, ref code, primary contact; no bank/tax data), GET /campaigns, GET /campaigns/{id} (campaign with depth, model, attribution window, articles, landing pages, ref parameter), GET /affiliate-links (enrollments partner × campaign with clicks and ready-made share links per landing page), GET /conversions, GET /conversions/{id} (conversion with gross/fee/climate contribution/base, status, payment state, payout dates and commission entries per level/role), POST /conversions (register an external conversion — by ref code or coupon code, idempotent via externalRef; same semantics as the conversion webhook), GET /commissions (commission entries, read-only). Events affiliates.conversion.registered (from all ingestion paths: Stripe, coupon, webhook, manual, API) and affiliates.conversion.settled. No payouts, no credit notes.
v1.12.0 · September 6, 2026
- Clients (practice management, health data): GET/POST /clients, GET/PATCH /clients/{id} (record with record number, status, channel overrides, care period, retention), GET/PATCH /clients/{id}/fields (all record fields with current value; write several fields with measured-at/measured-by/reason), GET/POST /clients/{id}/measurements (value history with correction chain; record a single measurement), GET/POST /clients/{id}/messages (conversation with the client, practice side), GET /clients/{id}/files. All only with clients-data enablement (data processing agreement) + clients:read/clients:write; every access is logged per record (IDs only). Events clients.record.created, clients.record.updated, clients.message.received (references only, no health data in the webhook).
v1.11.0 · September 6, 2026
- Forms: GET /forms, GET /forms/{id} (definition: pages, fields with key/type/options/required/conditions, matrix/repeater blocks, consents), GET /forms/{id}/responses, GET /responses/{id}, POST /forms/{id}/responses (server-side submit without OTP; same validation as the public form; optional affiliateId for attribution; creates prospect + lead event). Responses of client-record forms only with clients-data enablement + clients:read. Event forms.response.submitted (also for public forms and funnel forms; client-record forms as reference only).
v1.10.0 · September 6, 2026
- Documents: GET /documents (status, type, taskId/
none, contactId, tag, financeRelevant, q, updatedSince), GET /documents/{id}, POST /documents (presigned PUT URL for direct upload to R2, 5 min) + POST /documents/{id}/confirm (READY, starts OCR/AI or statement parser), GET /documents/{id}/download-url (short-lived URL with filename), PATCH /documents/{id} (title, type, task, contact, tags). AI-extracted fields underextracted. Events documents.document.ready/analyzed/updated.
v1.9.0 · September 6, 2026
- Time tracking: GET/POST /time-entries, GET/PATCH/DELETE /time-entries/{id}, POST /time-entries/{id}/stop. POST without endTime starts a running timer (one per user; stops others, sets the task to IN_PROGRESS). Billed entries are immutable (409 billed). Filters taskId, userId, projectId, from/to, isBillable, isBilled, running, updatedSince. Events time.timeEntry.created/updated/deleted.
v1.8.0 · September 6, 2026
- Projects: GET/POST /projects, GET/PATCH/DELETE /projects/{id} — multilingual name like tasks, customer + contact person, parent project (cycle-free), time budget (minutes, prepaid), period; metrics open tasks, booked and billable minutes. Filters q, customerContactId, parentId (
none= top level), activeOn, updatedSince. Events projects.project.created/updated/deleted.
v1.7.0 · September 6, 2026
- Tasks: GET/POST /tasks, GET/PATCH/DELETE /tasks/{id}, POST /tasks/{id}/status, GET/POST /tasks/{id}/comments. Multilingual title/description: read in the request language (?locale or Accept-Language) plus the full titleI18n; write as string or object {de,en,ru}, the organization language is translated automatically. Completing stops running timers, closes watchers and spawns the next recurrence like in the app. Events tasks.task.created/updated/completed/deleted, tasks.comment.created.
v1.6.0 · September 6, 2026
- Open items: GET /open-items (direction, status incl. open/overdue, contactId, invoiceId, q, updatedSince), GET /open-items/{id} (amounts in cents, cash discount, dunning state, payments = linked bookings), POST /open-items/{id}/payments (payment as booking “bank to personal account” incl. § 367 allocation of outstanding dunning costs; partial via amountCents; markOnly for a plain status flip). Dunning: GET /dunning/reminders and GET /dunning/reminders/{id} (level, claim/fee/interest/total in cents, PDF, portal link). Events payments.payment.recorded (all payment paths), dunning.reminder.sent, invoices.invoice.overdue (when a dunning level is created).
v1.5.0 · September 6, 2026
- Invoices: GET /invoices (filters status incl. open/overdue, kind, contactId, orderId, q, updatedSince), GET/POST /invoices, PATCH /invoices/{id} (drafts only — GoBD), POST …/issue (number, booking, open item, PDF + ZUGFeRD), POST …/correct (mode cancel = cancellation document, mode value = value correction KOR-…), GET …/pdf (final or preview), GET …/xml (ZUGFeRD XML as application/xml). Amounts as cents + exact decimal strings; gross mode (priceMode GROSS) with gross unit prices. Events invoices.invoice.created/issued/sent/paid/cancelled/corrected — also for payments via Stripe/checkout/installments/open-item settlement.
v1.4.0 · September 6, 2026
- Orders: GET /orders (filters status/draft, contactId, sourceQuoteId, q, updatedSince), GET /orders/{id} (lines with billed/dropped/open quantity, sections, linked invoices, confirmation PDF), GET /orders/{id}/pdf. POST /quotes/{id}/convert: issue and accept the quote and turn it into an order via the acceptance router (order number, PDF, automatic sending, possibly advance/deposit invoice); waits up to 25 s, otherwise routing-pending. Event orders.order.created (source quote|manual|duplicate).
v1.3.0 · September 6, 2026
- Quotes: GET/POST /quotes, GET/PATCH /quotes/{id} (head, items, sections; article reference fills name/unit/price/tax), POST …/issue (number + portal link + PDF), POST …/send (e-mail with PDF; waits up to 25 s for rendering, otherwise pdf-pending), POST …/accept and …/decline (on the customer's behalf; acceptance triggers order/advance invoice), GET …/pdf (status + URL). Amounts as cents + exact decimal string. Events quotes.quote.created/updated/sent/accepted/declined — also when accepted in the customer portal.
v1.2.0 · September 6, 2026
- Articles: GET/POST /articles, GET/PATCH /articles/{id} — search q, filters kind/archived, updatedSince; prices as unitPriceCents + unitPriceExact (four fraction digits), currency = the organization's base currency; archive via PATCH archived (no DELETE). Events articles.article.created/updated. New error code feature-not-available (403) when a feature is unavailable for the organization type.
v1.1.0 · September 6, 2026
- Webhooks: GET/POST /webhooks, GET/PATCH/DELETE /webhooks/{id}, POST …/rotate-secret, POST …/test, GET …/deliveries, POST …/replay; catalog GET /webhooks/events with …/{type}/sample and …/{type}/recent. Standard Webhooks signature (webhook-id, webhook-timestamp, webhook-signature), retries after 1 min/5 min/30 min/2 h/12 h, endpoint disabled after five consecutive failures. Scope webhooks:manage.
- Events: contacts.contact.created/updated/deleted, leads.lead.created, webhooks.test.
v1.0.0 · September 6, 2026
- First release of the public API: keys (capi_…), scopes, RFC 9457 errors, cursor pagination, Idempotency-Key, rate limits, GET /me.
- Contacts: GET/POST /contacts, GET/PATCH/DELETE /contacts/{id} — search (q), filters type/tag, updatedSince; gender resolved by AI when omitted.