Team notes are the private notes your team leaves on an article in the editor: a note on a highlighted passage, and the replies under it. Readers never see them. With the API, an integration or an AI agent can read the open notes on an article, answer them and resolve them, so feedback your team writes on a draft reaches the tool that revises it.
A typical loop: the agent reads the open notes, revises the article without touching the live version (see Staged changes and versions), replies to each note with what it changed, and resolves the notes it has dealt with. A person still reviews and publishes.
Team notes are available on every plan. To see how your team writes them, see Leave notes for your team. Reader comments are a separate resource: see Comments. Internal notes, the blocks your team types into the article text, have no endpoint, and article content you fetch through the API leaves them out.
Endpoints
Method and path | What it does | Access |
|---|---|---|
| List the notes on an article. | Any API key with Team notes. OAuth: |
| Reply to a note. | Read & write key with Team notes. OAuth: |
| Resolve a note. | Read & write key with Team notes. OAuth: |
There is no endpoint to create, edit or delete a note. A note belongs to a passage your team highlights in the editor, so it starts there.
Get access
Access to team notes is granted separately from access to your content, and checked twice on every request.
The key must be created with Team notes. When you create the key, turn on Allow access to editorial notes under Team notes (see Create an API key). A Read only key can then read notes; a Read & write key can also reply and resolve. An existing key can't be given access: create a new one. Without it, the API answers
403 Forbiddenwith the codeinsufficient_scope.OAuth apps get
notes.readandnotes.writeonly when they ask for these scopes and the person connecting the app approves them (see Scopes).content.readandcontent.writedon't include them.The person behind the credential must still be on the team. Every request checks that the team member who created the key, or who approved the app, can open team notes on this help center in the dashboard: an Owner, Admin, Editor or Translator. If they left the team or lost that role, the API answers
403with the codenotes_forbidden, and a new key from a current team member fixes it.Private articles stay private. If that person can't open the article in the dashboard, because it is private and not shared with them or it sits in a private category they are not a member of, its notes answer
404 Not Found. So do articles in the Trash.
The note object
Field | Type | Description |
|---|---|---|
| integer | The note's ID. |
| integer | The article the note is on. |
| integer or null |
|
| string | The article language the note was written in, for example |
| string | The text, as plain text. |
| object |
|
| object or null |
|
| boolean |
|
| string | ISO 8601 in UTC, for example |
| array | On a note: its replies, oldest first, each a note object without |
| object |
|
Replies carry _links too, but you reply to and resolve the note, not a reply: use the links of the note at the top of the thread. A reply's own links answer 404.
List the notes on an article
/v1/articles/{articleId}/notesList the open team notes on an article, oldest first, each with its replies and the passage it is about.
Parameter | Type | Description |
|---|---|---|
| 1 or 0 | Default |
| string | Only notes in this language. It is matched exactly and not checked against your languages, so a typo returns an empty list. |
Notes come oldest first, with every note on the article in one response. meta.threads_count is the number of notes returned, meta.open_count how many of them are open, and meta.includes_resolved echoes your choice. The top-level article.title is an object with every language of the title.
Reply to a note
/v1/articles/{articleId}/notes/{noteId}/repliesReply to a note. The response is the whole thread: the note with all its replies, yours last.
Field | Type | Description |
|---|---|---|
| string | Required. Plain text, 1 to 5000 characters. The field is |
The reply is signed by the team member who created the key, or who approved the app, and takes the note's language.
The response is the whole thread: the note, with every reply and yours last.
Replying sends no email and doesn't change the article.
Sending the same request twice adds two replies.
A resolved note answers
404with "That note is resolved. Re-open it in the dashboard to continue the thread." A resolved note can't be reopened, in the dashboard or over the API, so ask your team to start a new note in the editor.
Resolve a note
/v1/articles/{articleId}/notes/{noteId}/resolveResolve a note and all its replies. There is no request body, and it cannot be undone.
Resolving closes the note and all its replies. Resolving a note that is already resolved answers 200 with "That note was already resolved.", so a retry is safe. It can't be undone, and resolved notes stay readable only through this API, with include_resolved=1.
Resolving through the API doesn't change the article. When your team resolves a note in the editor, the editor also removes the highlight from the text; after an API resolve, the passage stays highlighted and the highlight no longer opens a note.
Errors
Status | When |
|---|---|
| The key or token is missing or not valid: |
|
|
| "Article not found." for an article you can't reach, "No such note on this article." for an unknown note or a reply's ID, or "That note is resolved." when you reply to a resolved note. |
| A parameter or field is not valid. |
| Over the rate limit (see Rate limits). Wait for the seconds in |