Welcome to the Noa Notes Integration REST API!
This API is used to integrate Noa Notes with your existing systems. It allows you to create sessions, retrieve session statuses, and summaries.
Here is the available OpenAPI that you can import to Postman: noa_notes_integration.postman_collection.json.
Authentication is based on clients of the API. The new client is set up by the Docplanner Team and provided to the development team of the client.
Authenticates a client and returns an access token.
A client is a service that wants to use the Noa Notes API.
| clientId | string <uuid> |
| secret | string or null |
{- "clientId": "5e505642-9024-474d-9434-e5a44f505cc5",
- "secret": "string"
}A consumer is an external system that consumes the Noa Notes Integration API.
Each client is meant to be a separate consumer.
The default configuration of the business logic for the other endpoints (e.g. default WebHook, Language, Speciality, Template) is being configured on the consumer level.
Creates a new session.
In this endpoint, episodeId and doctorId are IDs coming directly from your software. We consider them as external IDs on our side.
If a session already exists for the given episodeId, doctorId, and facilityId tuple, the most advanced one is returned: an in-progress or Verified session takes precedence over a New one, and a brand-new session is created only when neither exists. It can allow you to resume a session UI-wise in the widget. When resuming a non-final session, if template in the request body differs from the stored session template, the session template is updated to match the request.
| api-version | string |
| episodeId required | string or null |
| doctorId required | string or null |
| webhookUrl | string or null |
object or null | |
| visitType | string or null Enum: "FirstVisit" "FollowUpVisit" null
|
object or null | |
| facilityId | string or null |
| language | string or null Enum: "en-US" "pl-PL" "pt-BR" "pt-PT" "es-MX" "es-ES" "es-AR" "es-CO" "es-CL" "es-PE" "it-IT" "de-DE" "cs-CZ" "tr-TR" "nr-NR" null |
| speciality | string or null |
| canUseDataForAiTraining | boolean or null |
| patientGender | string (NoaNotes.Shared.Abstractions.Core.Enums.PatientGender) Enum: "Male" "Female" "Neutral" |
{- "episodeId": "episode-123",
- "doctorId": "doctor-456",
- "template": {
- "value": {
- "Personal Information": "Include patient demographics and insurance information",
- "Reason for the Visit": "Detailed description of the presenting problem"
}
}, - "visitType": "FirstVisit",
- "metadata": {
- "key1": "value1",
- "key2": "value2"
}, - "facilityId": "facility-789",
- "language": "en-US",
- "speciality": "psychiatrist",
- "canUseDataForAiTraining": null,
- "patientGender": null
}Retrieves the sessions for a facilityId that are not yet in a final status and were started within the last 2 hours. The 2-hour bound exists because a session that a client never cleanly closed (e.g. a crash) is otherwise indistinguishable from one still recording.
startedAt is UTC, without an offset — the same as every other timestamp in this API.
status is the session's current status. Only non-final statuses appear here: Verified, EmptySummaryVerified, Failed and Expired are filtered out, so a failed session never occupies a slot in this list. Interrupted is the one to act on — the client went away (closed tab, lost connection), and the session can be resumed by calling Create Session again with the same episodeId, doctorId and facilityId.
| facilityId required | string |
| api-version | string |
Retrieves the summary of a specific session. Returned data contains the content of the summary and information if a doctor approved its content in the Edit/Confirm Summary page.
| sessionId required | string <uuid> |
| api-version | string |
Generates a new summary for a session from the transcript already held by Noa, optionally with a different template.
Only possible while the doctor has not verified the summary yet — a verified note is a finished document and is never replaced through this endpoint. Omitting template regenerates with the template the session already has.
The call only starts the regeneration and returns 202; the new summary arrives over the session webhook, and the doctor has to verify it again before it can be read back through Get Session Summary.
| sessionId required | string <uuid> |
| api-version | string |
object or null |
{- "template": {
- "property1": "string",
- "property2": "string"
}
}A session is meant to serve as a single usage of Noa Notes with a specific expiration time. The client needs to create a new session to receive a Noa Notes Recorder URL enabling the doctor to open the Noa Notes Recorder. The result of a session is a summary of the appointment, which should be used to populate EHR data in the client application.
Each session can be created with specific optional parameters, if not provided then default configuration from the consumer configuration will be applied.
Metadata parameters may contain any additional data that you want to share.
Retrieves the status of a specific session.
This endpoint might be used proactively by the client to check statuses of a given session. An alternative scenario is for the client to expose a webhook that will be used by the Noa Notes Integration API to notify about status changes of the sessions.
| sessionId required | string <uuid> |
| api-version | string |
Retrieves the verified summary of the session the supplied session token was issued for.
The response is identical to GET /api/v1/consumers/{sessionId}/summary: content is returned only once the doctor has approved the summary on the Edit/Confirm Summary page, and is null until then, while isVerified always reports whether the approval happened.
A session token grants access to exactly one session. Requesting any other session id returns 403, whether or not that session exists.
| sessionId required | string <uuid> |
| api-version | string |
Attaches analytics context from the calling application to a session, so that product analytics raised by the embedded Noa Notes clients can be correlated with your own.
Call it once the session exists and before the doctor starts recording — typically right after Create Session, when the Recorder is opened. The stored context is read when Noa Notes reports on the session (recording started, processing started, recording finished, note generated, note sent) and is cached from the first of those events onwards, so a later update is not guaranteed to reach the events that follow it.
The call is an upsert: a session holds at most one analytics context and each call replaces the previous one in full, including the fields left out of the request. Every field is optional; analyticsSessionId, analyticsDeviceId and analyticsUserId are what stitch the events to the analytics session, device and user of your own application, while the page fields, dpSource and clientPlatform describe where the Recorder was opened from. Values that do not match the Docplanner tracking taxonomy are not rejected — they fall back to the Noa Notes defaults documented on each field.
Keep string values within the documented lengths, and note that the session is addressed by the session token issued with it: requesting any other session id returns 403 Forbidden, whether or not that session exists, and an unknown session returns 404 Not Found. A successful call answers 200 OK with an empty body.
This endpoint is only available to consumers for whom unified tracking has been enabled by the Docplanner team. For all other consumers it returns 404 Not Found.
| sessionId required | string <uuid> |
| api-version | string |
| analyticsSessionId | string or null Identifier of the analytics session in your own application (for example the Amplitude session id). The backend events raised for this Noa Notes session are reported under it, so they land in the same analytics session as the events your application tracks. Up to 256 characters. |
| analyticsDeviceId | string or null Identifier of the device in your own application (for example the Amplitude device id). Used as the device the backend events are attributed to. Up to 256 characters. |
| analyticsUserId | string or null Identifier of the user the backend events are attributed to. When omitted, the doctorId the session was created with is used instead. Up to 256 characters. |
| pageCategory | string or null Tracking category of the page the Recorder was opened from, for example |
| pageSection | string or null Tracking section of the page the Recorder was opened from, for example |
| pageType | string or null Tracking type of the page the Recorder was opened from, for example |
| pageUrl | string or null URL of the page the Recorder was opened from. Up to 2048 characters. |
| dpSource | string or null Product the session originates from, for example |
| templateId | string or null Identifier, in your own system, of the template the note is generated from. Reported on the note generation event. |
| patientId | string or null Identifier, in your own system, of the patient the appointment belongs to. Reported on the note generation event. |
| isAnalyticsBlockedOnClient | boolean or null Whether client-side analytics is blocked or unavailable for this user (ad blocker, missing consent, application or browser settings). |
| clientPlatform | string or null Client surface the doctor is using, either |
{- "analyticsSessionId": "1726048291000",
- "analyticsDeviceId": "9f1c1b0e-6d2a-4f1e-9a1f-2c4b8d3e5a77",
- "analyticsUserId": "user-123",
- "pageCategory": "medical episodes",
- "pageSection": "noa notes widget",
- "pageType": "medical files",
- "dpSource": "3rd party pms",
- "templateId": "template-123",
- "patientId": "patient-456",
- "isAnalyticsBlockedOnClient": false,
- "clientPlatform": "web"
}Allows the doctor to add a rating and an optional comment to the summary of a specific session.
| sessionId required | string <uuid> |
| api-version | string |
| rating | string (NoaNotes.Modules.Integration.Core.Enums.SummaryRating) Enum: "Dislike" "Like" |
| comment | string or null |
{- "rating": "Dislike",
- "comment": "string"
}Allows the doctor to update session details such as training consent
| sessionId required | string <uuid> |
| api-version | string |
object (NoaNotes.Modules.Integration.Application.Clients.AppointmentWebHook) | |
object (NoaNotes.Modules.Integration.Application.Clients.AppointmentOptions) |
{- "webHook": {
- "url": "string",
- "token": "string"
}, - "options": {
- "summarySections": {
- "property1": "string",
- "property2": "string"
}, - "isTraining": true,
- "speciality": "string",
- "redirectUrl": "string",
- "useForTraining": true,
- "features": {
- "aiRolePlay": true,
- "recorderVersion": "string",
- "enableDiarization": true,
- "enableBeautify": true
}, - "patientGender": "Male"
}
}Returns the Noa Notes Recorder URL for an existing session, as a JSON string. Open it in a browser or embed it in your application to let the doctor record the appointment; the result is then retrieved with Get Verified Session Summary.
The URL points at the Recorder sign-in page and carries a freshly issued access token, so treat it as a credential: anyone holding the link can open that recording until the token expires. The token is time-limited rather than single-use, and the expiry is configured per environment.
Each call creates a new appointment behind the session and points the session at it, which is why the URL should be requested once, when the doctor is about to record. Calling it again replaces the appointment the session refers to, so a recording made through an earlier URL is no longer the one the session resolves to.
Failures are reported as 400 Bad Request with a plain-text Error processing token: ... message — including the case where the session the token was issued for no longer exists, and the case where the appointment could not be created. The session token grants access to exactly one session: requesting any other session id returns 403 Forbidden, whether or not that session exists.
| sessionId required | string <uuid> |
| language required | string Language of the Recorder interface, as an IETF tag such as |
| redirectUrl | string Where the doctor is sent once the recording is finished. It is both stored on the appointment and appended to the returned URL. When omitted, the redirect configured for this environment is used, which takes the doctor to the Noa-hosted Edit/Confirm Summary page through a freshly issued session token. |
| sourceClient | string Optional free-form marker identifying the client that opened the Recorder. When not empty it is appended to the returned URL; it is not stored on the session. |
| api-version | string |
Doctors that an external system has registered for one of its facilities.
Use these endpoints to keep the doctors known to Noa Notes in sync with your own system, and to control which of them can use the embedded Noa Notes widget.
Doctors are addressed by the identifiers from your own system (externalFacilityId, externalDoctorId), so you do not need to store any Noa Notes identifier on your side.
Returns every doctor currently registered for the given facility, as a JSON array.
Each entry reports the doctor's name, the externalDoctorId from your own system and whether the embedded Noa Notes widget is enabled for them. Doctors removed with Remove Facility Doctor are left out, and a facility with no doctors returns an empty array.
A facility that does not exist returns 404 Not Found, and one that belongs to another consumer returns 403 Forbidden.
| externalFacilityId required | string Identifier of the facility in your own system, as registered with Noa Notes. |
Registers a doctor for the given facility and returns the registered doctor with 201 Created.
externalDoctorId is the identifier of the doctor in your own system and must be unique within the facility. Registering an identifier that is already registered returns 409 Conflict. Registering one that was removed earlier restores that doctor instead of creating a second one: it keeps its Noa Notes id and its previous isWidgetEnabled setting, and takes the name from this request.
isWidgetEnabled decides whether the doctor may use the embedded Noa Notes widget. It applies when the doctor is created and is ignored when an earlier registration is restored. name and externalDoctorId must both be non-empty.
An unknown facility returns 404 Not Found, and one belonging to another consumer 403 Forbidden.
| externalFacilityId required | string Identifier of the facility in your own system, as registered with Noa Notes. |
| name required | string or null Display name of the doctor, as it should appear in Noa Notes. Must not be empty. |
| externalDoctorId required | string or null Identifier of the doctor in your own system. It must be unique within the facility and is how the doctor is addressed in the rest of the API, including as doctorId when a session is created. Must not be empty. |
| isWidgetEnabled | boolean Whether the doctor may use the embedded Noa Notes widget. It is applied when the doctor is created, and ignored when the call restores a previously removed doctor, which keeps the setting it had before. |
{- "name": "Dr Anna Kowalska",
- "externalDoctorId": "doctor-456",
- "isWidgetEnabled": true
}Updates the display name of a doctor already registered for the facility and returns the updated doctor.
The doctor is identified by the externalDoctorId from your own system, and name is the only thing that changes: the Noa Notes id and isWidgetEnabled are left as they are.
A doctor that was removed can still be renamed this way; it stays out of Get Facility Doctors until it is registered again. 404 Not Found is returned if either the facility or the doctor is unknown, and 403 Forbidden if the facility belongs to another consumer.
| externalFacilityId required | string Identifier of the facility in your own system, as registered with Noa Notes. |
| externalDoctorId required | string Identifier of the doctor in your own system, as supplied when the doctor was registered. |
| name required | string or null New display name of the doctor. It is the only property this endpoint changes. |
{- "name": "Dr Anna Kowalska-Nowak"
}Removes a doctor from the facility and answers 204 No Content.
The removal is soft: the doctor stops being listed by Get Facility Doctors and the embedded Noa Notes widget is no longer offered for them, while their Noa Notes id, their widget setting and every session and summary already created for them are kept. Registering the same externalDoctorId again restores that doctor rather than creating a second one, and repeating the removal answers 204 No Content as well.
Sessions are created from the identifiers you supply and are not matched against this registry, so removing a doctor here does not by itself stop sessions being created for that externalDoctorId. Where the widget visibility check is enabled for your consumer, it is the doctor's isWidgetEnabled setting — not their removal — that makes Create Session reject a request carrying a facilityId.
404 Not Found is returned if either the facility or the doctor is unknown, and 403 Forbidden if the facility belongs to another consumer.
| externalFacilityId required | string Identifier of the facility in your own system, as registered with Noa Notes. |
| externalDoctorId required | string Identifier of the doctor in your own system, as supplied when the doctor was registered. |