Reference

One sheet per endpoint: what you send on the left, what comes back on the right, and how it refuses underneath. Generated from the contract, so it cannot fall behind.

Meetings

Create meetings, upload audio, follow the status, collect the results.

GET/v1/meetingsmeetings:read

Page through the organisation's meetings, newest first.

Query

limitinteger
Meetings per page, 1 to 50. Defaults to 25.
cursorstring
`next_cursor` from the previous page.
external_idstring
Look up the single meeting carrying this reference. Cannot be combined with the other filters.
date_fromstring
Earliest meeting date, YYYY-MM-DD, inclusive.
date_tostring
Latest meeting date, YYYY-MM-DD, inclusive.

Response 200

MeetingPage

Success.

meetingsMeeting[]required
One page of meetings, newest first.
next_cursorstring
Pass as `cursor` to fetch the next page. Absent means the end. A page may contain fewer items than `limit`.

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
  • INVALID_LIMIT`limit` is not a whole number within the allowed range.
  • limit
  • INVALID_CURSOR`cursor` was not produced by a previous page of this list.
  • cursor
  • INVALID_DATEA date is not a calendar date in YYYY-MM-DD form.
  • INVALID_DATE_RANGE`date_from` lies after `date_to`.
  • date_from
  • date_to
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/meetings?limit=25' \
  -H 'Authorization: Bearer nla_live_...'
POST/v1/meetingsmeetings:write

Create a meeting.

Body

CreateMeetingRequest
datestringrequired^\d{4}-\d{2}-\d{2}$
Calendar date, YYYY-MM-DD.
external_idstringmax 128
Your own reference, unique within the organisation. A second call with the same value returns the existing meeting instead of a duplicate.
participant_idsstring[]
Member ids of those attending. Pass them when creating the meeting: their names improve how names are spelled in the transcript and make speaker attribution in the minutes possible. The transcript itself keeps unattributed speaker labels.
project_idstring
Project to group this meeting under.
shared_withstring[]
Member ids. Only meaningful when visibility is shared.
template_idstring
Template for the minutes. Empty means the organisation's default.
timestring^\d{2}:\d{2}$
Start time, HH:MM. Display only.
titlestringrequiredmin 1max 300
Subject of the meeting.
visibilityenum
Empty means this integration's default visibility.
privateorganisationshared

Response 200

Meeting

A meeting with this `external_id` already existed and is returned unchanged.

created_atintegerrequired
Creation time, Unix seconds.
datestringrequired
Calendar date, YYYY-MM-DD.
duration_secondsinteger
Length of the recording. Absent until audio has been processed.
external_idstring
Your own reference for this meeting, unique within the organisation. Only ever set through this API.
idstringrequired
Identifier of the meeting, prefixed `mtg_`.
participant_idsstring[]
Member ids of those attending.
project_idstring
Project this meeting is grouped under, if any.
statusenumrequired
Where the meeting is in the pipeline. Poll this to follow a recording from upload to finished minutes.
createdaudio_uploadedtranscribingtranscribedgenerating_minutesminutes_readytranscription_failedminutes_failedtranscribe_blockedaudio_rejected
template_idstringrequired
Template the minutes are shaped by.
timestring
Start time, HH:MM. Display only.
titlestringrequired
Subject of the meeting.
updated_atintegerrequired
Time of the last change, Unix seconds.
visibilityenumrequired
Who inside the organisation can see this meeting.
privateorganisationshared

Response 201

Meeting

The meeting was created.

Same body as above.

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
  • INVALID_DATEA date is not a calendar date in YYYY-MM-DD form.
  • INVALID_TIME`time` is not a time of day in HH:MM form.
  • time
  • INVALID_EXTERNAL_ID`external_id` is empty or longer than allowed.
  • external_id
  • INVALID_SHARED_WITH`shared_with` names members who cannot be shared with, because they have no account or are an integration. `details.invalid` lists them.
  • shared_with
  • details.invalid
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
409
  • EXTERNAL_ID_TAKENAnother meeting in this organisation already carries this `external_id`.
  • external_id
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X POST 'https://api.notulai.nl/v1/meetings' \
  -H 'Authorization: Bearer nla_live_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "date": "2026-09-01",
  "external_id": "CRM-4821",
  "participant_ids": [
    "emp_2f1c9a",
    "emp_7d4b02"
  ],
  "project_id": "proj_5b28e4",
  "shared_with": [
    "emp_2f1c9a"
  ],
  "template_id": "tpl_9c31a7",
  "time": "09:30",
  "title": "Weekly stand-up",
  "visibility": "organisation"
}'
DELETE/v1/meetings/{meeting_id}meetings:delete

Delete a meeting and everything belonging to it. Irreversible.

With a personal key you can delete meetings you created yourself, or any visible meeting if you are an organisation admin.

Path

meeting_idstringrequired
Identifier of the meeting, prefixed `mtg_`.

Response 204

Deleted. No content.

No body.

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
  • FORBIDDENThe action is not allowed for this caller.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X DELETE 'https://api.notulai.nl/v1/meetings/mtg_b39d31c7' \
  -H 'Authorization: Bearer nla_live_...'
GET/v1/meetings/{meeting_id}meetings:read

Fetch a single meeting, including its status.

Path

meeting_idstringrequired
Identifier of the meeting, prefixed `mtg_`.

Response 200

Meeting

Success.

created_atintegerrequired
Creation time, Unix seconds.
datestringrequired
Calendar date, YYYY-MM-DD.
duration_secondsinteger
Length of the recording. Absent until audio has been processed.
external_idstring
Your own reference for this meeting, unique within the organisation. Only ever set through this API.
idstringrequired
Identifier of the meeting, prefixed `mtg_`.
participant_idsstring[]
Member ids of those attending.
project_idstring
Project this meeting is grouped under, if any.
statusenumrequired
Where the meeting is in the pipeline. Poll this to follow a recording from upload to finished minutes.
createdaudio_uploadedtranscribingtranscribedgenerating_minutesminutes_readytranscription_failedminutes_failedtranscribe_blockedaudio_rejected
template_idstringrequired
Template the minutes are shaped by.
timestring
Start time, HH:MM. Display only.
titlestringrequired
Subject of the meeting.
updated_atintegerrequired
Time of the last change, Unix seconds.
visibilityenumrequired
Who inside the organisation can see this meeting.
privateorganisationshared

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/meetings/mtg_b39d31c7' \
  -H 'Authorization: Bearer nla_live_...'
PATCH/v1/meetings/{meeting_id}meetings:write

Change a meeting's title, date, start time or project.

Only the fields you send are touched. An empty `time` or `project_id` clears it; an empty `title` is refused. Allowed at any point in the meeting's life. With a personal key this follows the rule of the web application: you can change meetings you created yourself, or any visible meeting if you are an organisation admin. An integration key is bounded by visibility alone. Changing the title, the date or the project re-indexes the meeting for search, which costs one credit once its minutes have been indexed; moving only the start time is free.

Path

meeting_idstringrequired
Identifier of the meeting, prefixed `mtg_`.

Body

UpdateMeetingRequest
datestring^\d{4}-\d{2}-\d{2}$
Calendar date, YYYY-MM-DD.
project_idstring
Project to group this meeting under. Empty detaches it.
timestring^(\d{2}:\d{2})?$
Start time, HH:MM. Empty clears it.
titlestringmin 1max 300
Subject of the meeting.

Response 200

Meeting

Success.

created_atintegerrequired
Creation time, Unix seconds.
datestringrequired
Calendar date, YYYY-MM-DD.
duration_secondsinteger
Length of the recording. Absent until audio has been processed.
external_idstring
Your own reference for this meeting, unique within the organisation. Only ever set through this API.
idstringrequired
Identifier of the meeting, prefixed `mtg_`.
participant_idsstring[]
Member ids of those attending.
project_idstring
Project this meeting is grouped under, if any.
statusenumrequired
Where the meeting is in the pipeline. Poll this to follow a recording from upload to finished minutes.
createdaudio_uploadedtranscribingtranscribedgenerating_minutesminutes_readytranscription_failedminutes_failedtranscribe_blockedaudio_rejected
template_idstringrequired
Template the minutes are shaped by.
timestring
Start time, HH:MM. Display only.
titlestringrequired
Subject of the meeting.
updated_atintegerrequired
Time of the last change, Unix seconds.
visibilityenumrequired
Who inside the organisation can see this meeting.
privateorganisationshared

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
  • BAD_REQUESTThe request was refused and no more specific code applies.
  • INVALID_DATEA date is not a calendar date in YYYY-MM-DD form.
  • INVALID_TIME`time` is not a time of day in HH:MM form.
  • time
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
  • FORBIDDENThe action is not allowed for this caller.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X PATCH 'https://api.notulai.nl/v1/meetings/mtg_b39d31c7' \
  -H 'Authorization: Bearer nla_live_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "date": "2026-09-01",
  "project_id": "proj_5b28e4",
  "time": "09:30",
  "title": "Weekly stand-up"
}'
GET/v1/meetings/{meeting_id}/minutesminutes:read

Fetch the minutes as HTML or as Markdown.

Path

meeting_idstringrequired
Identifier of the meeting, prefixed `mtg_`.

Query

formatstring
`html` (the default) or `markdown`.

Response 200

Minutes

Success.

contentstringrequired
The minutes in the requested form.
formatenumrequired
The form the content is delivered in.
htmlmarkdown
template_idstringrequired
Template the minutes were shaped by.

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
409
  • MINUTES_NOT_READYThe minutes have not been generated yet. Poll the meeting until its status says so.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/meetings/mtg_b39d31c7/minutes' \
  -H 'Authorization: Bearer nla_live_...'
PUT/v1/meetings/{meeting_id}/participantsmeetings:write

Replace the participants, as long as no audio has been uploaded yet.

Path

meeting_idstringrequired
Identifier of the meeting, prefixed `mtg_`.

Body

ParticipantsRequest
participant_idsstring[]required
Member ids of those attending. An empty list clears the list.

Response 200

Meeting

Success.

created_atintegerrequired
Creation time, Unix seconds.
datestringrequired
Calendar date, YYYY-MM-DD.
duration_secondsinteger
Length of the recording. Absent until audio has been processed.
external_idstring
Your own reference for this meeting, unique within the organisation. Only ever set through this API.
idstringrequired
Identifier of the meeting, prefixed `mtg_`.
participant_idsstring[]
Member ids of those attending.
project_idstring
Project this meeting is grouped under, if any.
statusenumrequired
Where the meeting is in the pipeline. Poll this to follow a recording from upload to finished minutes.
createdaudio_uploadedtranscribingtranscribedgenerating_minutesminutes_readytranscription_failedminutes_failedtranscribe_blockedaudio_rejected
template_idstringrequired
Template the minutes are shaped by.
timestring
Start time, HH:MM. Display only.
titlestringrequired
Subject of the meeting.
updated_atintegerrequired
Time of the last change, Unix seconds.
visibilityenumrequired
Who inside the organisation can see this meeting.
privateorganisationshared

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
409
  • PARTICIPANTS_LOCKEDParticipants steer transcription, so they can only be changed while the meeting has no audio yet.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X PUT 'https://api.notulai.nl/v1/meetings/mtg_b39d31c7/participants' \
  -H 'Authorization: Bearer nla_live_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "participant_ids": [
    "emp_2f1c9a",
    "emp_7d4b02"
  ]
}'
GET/v1/meetings/{meeting_id}/transcripttranscript:read

Fetch a meeting's transcript.

Path

meeting_idstringrequired
Identifier of the meeting, prefixed `mtg_`.

Response 200

Transcript

Success.

transcriptstringrequired
Plain text with a speaker label per turn, such as `spk_0`. Those labels are not attributed: they say that speakers differ, not who they are. Attribution to named people happens when the minutes are generated, so the names appear there and not here.

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
409
  • TRANSCRIPT_NOT_READYTranscription has not finished. Poll the meeting until its status says so.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/meetings/mtg_b39d31c7/transcript' \
  -H 'Authorization: Bearer nla_live_...'
POST/v1/meetings/{meeting_id}/upload-urlmeetings:write

Request a one-time upload target for this meeting's audio.

Path

meeting_idstringrequired
Identifier of the meeting, prefixed `mtg_`.

Body

UploadUrlRequest
content_typestringrequired
MIME type of the audio file.

Response 200

UploadTarget

Success.

expires_inintegerrequired
Validity in seconds.
methodconst
The HTTP method the upload URL expects.
PUT
upload_urlstringrequired
Presigned URL. PUT the audio file here.

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
402
  • TRANSCRIBE_QUOTA_EXHAUSTEDNot enough transcription credit left for this recording. `details.next_reset_at` says when the quota replenishes.
  • details.next_reset_at
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
409
  • AUDIO_ALREADY_PRESENTThis meeting already has audio. A recording is uploaded once; create a new meeting to start over.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X POST 'https://api.notulai.nl/v1/meetings/mtg_b39d31c7/upload-url' \
  -H 'Authorization: Bearer nla_live_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "content_type": "audio/mpeg"
}'

Templates

The templates the minutes can be shaped by.

GET/v1/templatestemplates:read

The templates this organisation can choose from.

Request

Nothing to send beyond the key.

Response 200

TemplateList

Success.

templatesTemplate[]required
The templates this organisation can choose from.

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/templates' \
  -H 'Authorization: Bearer nla_live_...'

Members

The people a meeting's participants are chosen from.

GET/v1/employeesemployees:read

The organisation's human members, so participants can be assigned. Integrations are never in this list.

Request

Nothing to send beyond the key.

Response 200

MemberList

Success.

membersMember[]required
The organisation's human members. Integrations are never listed.

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/employees' \
  -H 'Authorization: Bearer nla_live_...'
POST/v1/employeesemployees:write

Add a member without an account. Costs no licence.

Body

CreateMemberRequest
descriptionstringmax 300
Job description. Helps attribute speakers in a recording.
emailstring
Unique within the organisation.
namestringrequiredmin 1max 80
Name of the member.
rolestringmax 80
Role within the organisation.

Response 201

Member

The member was created.

idstringrequired
Identifier of the member, prefixed `emp_`.
namestringrequired
Name of the member.
rolestring
Role within the organisation.
statusenumrequired
Whether this member can sign in. Only `active` and `invited` members can be shared a meeting with.
activeinvitedno_accountdeactivated

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
  • INVALID_EMAILThe email address is not a valid address.
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
409
  • EMAIL_TAKENAnother member already uses this address. `details` names the member that holds it.
  • details
  • MEMBER_LIMIT_EXCEEDEDThe organisation has reached the maximum number of member records.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X POST 'https://api.notulai.nl/v1/employees' \
  -H 'Authorization: Bearer nla_live_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "description": "Advises clients on their annual accounts.",
  "email": "alex@example.com",
  "name": "Alex de Vries",
  "role": "Consultant"
}'

Projects

Labels a meeting can be grouped under.

GET/v1/projectsprojects:read

The active projects: exactly what `project_id` on a meeting accepts.

Request

Nothing to send beyond the key.

Response 200

ProjectList

Success.

projectsProject[]required
The organisation's active projects.

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/projects' \
  -H 'Authorization: Bearer nla_live_...'
POST/v1/projectsprojects:write

Create a project.

Body

CreateProjectRequest
namestringrequiredmin 1max 120
Name of the project.

Response 201

Project

The project was created.

idstringrequired
Identifier to pass as `project_id` on a meeting.
namestringrequired
Name of the project.

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X POST 'https://api.notulai.nl/v1/projects' \
  -H 'Authorization: Bearer nla_live_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "Alex de Vries"
}'
DELETE/v1/projects/{project_id}projects:write

Delete a project. Existing meetings stay valid.

Path

project_idstringrequired
Identifier of the project, prefixed `proj_`.

Response 204

Deleted. No content.

No body.

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
404
  • NOT_FOUNDNo such resource, or it is not visible to this integration. A private meeting of another member is answered as absent rather than as forbidden, so its existence is not revealed.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X DELETE 'https://api.notulai.nl/v1/projects/proj_5b28e4' \
  -H 'Authorization: Bearer nla_live_...'

Vocabulary

Terms that steer how transcription spells names and jargon.

GET/v1/vocabularyvocabulary:read

The spellings the transcript is corrected to.

Request

Nothing to send beyond the key.

Response 200

Vocabulary

Success.

entriesVocabularyEntry[]required
The same terms, each with the wrong spellings the system knows.
max_termsintegerrequired
How many terms the list may hold at most.
termsstring[]required
The organisation's complete vocabulary.

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/vocabulary' \
  -H 'Authorization: Bearer nla_live_...'
PUT/v1/vocabularyvocabulary:write

Replace the whole vocabulary.

Body

VocabularyRequest
termsstring[]required
The organisation's complete vocabulary.

Response 200

Vocabulary

Success.

entriesVocabularyEntry[]required
The same terms, each with the wrong spellings the system knows.
max_termsintegerrequired
How many terms the list may hold at most.
termsstring[]required
The organisation's complete vocabulary.

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
409
  • VOCABULARY_FULLThe vocabulary already holds the maximum number of terms.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X PUT 'https://api.notulai.nl/v1/vocabulary' \
  -H 'Authorization: Bearer nla_live_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "terms": [
    "Pennatoux BV",
    "Van der Meer Advies"
  ]
}'
POST/v1/vocabulary/termsvocabulary:write

Add a single term to the vocabulary, without having to read the rest.

Body

VocabularyTermRequest
termstringrequiredmin 1
A single term to add.

Response 200

Vocabulary

Success.

entriesVocabularyEntry[]required
The same terms, each with the wrong spellings the system knows.
max_termsintegerrequired
How many terms the list may hold at most.
termsstring[]required
The organisation's complete vocabulary.

Refusals

400
  • INVALID_REQUESTThe request body or the combination of query parameters is not valid. `details.fields` names the offending fields where the body is at fault.
  • details.fields
401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
409
  • VOCABULARY_FULLThe vocabulary already holds the maximum number of terms.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X POST 'https://api.notulai.nl/v1/vocabulary/terms' \
  -H 'Authorization: Bearer nla_live_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "term": "Pennatoux BV"
}'

Usage

What is left of this period's quota.

GET/v1/usageusage:read

What is left of this period's quota.

Request

Nothing to send beyond the key.

Response 200

Usage

Success.

credits_remainingintegerrequired
Credits left this period. Generating minutes spends credits.
next_reset_atstring
Date of the next top-up, or empty when there is none.
transcribe_seconds_remainingintegerrequired
Seconds of audio that may still be transcribed this period.

Refusals

401
  • UNAUTHENTICATEDThe Authorization header is missing, malformed, or the key is unknown, expired or revoked.
403
  • IP_NOT_ALLOWEDThe key has an IP allowlist and this caller's address is not on it.
  • API_ACCESS_DISABLEDThe organisation does not have API access, or the integration behind this key is no longer active.
  • PERSONAL_API_KEYS_DISABLEDThe organisation does not have personal API keys enabled, so this personal key cannot be used.
  • INSUFFICIENT_SCOPEThe key is valid but does not carry the scope this endpoint requires.
  • ORGANISATION_SUSPENDEDThe organisation is blocked.
  • ORGANISATION_EXPIREDThe organisation's access has expired.
429
Too many requests. Refused by the edge before it reaches the API, so this response does not carry the error envelope. Back off and retry.
500
  • INTERNAL_ERRORSomething went wrong on our side. The response carries a `request_id`; quote it in a support ticket.
  • request_id
curl -X GET 'https://api.notulai.nl/v1/usage' \
  -H 'Authorization: Bearer nla_live_...'