Comments are threaded replies attached to a task (step), a
message, or a
project info section. The same comment object is used across all three; the
commentable_type field tells you what it is attached to.
{
"id": 901,
"commentable_type": "step",
"commentable_id": 123,
"content": "Looks good — just tweak the hero copy.",
"user": {
"id": 123,
"name": "John Doe"
},
"created_at": "2023-01-01T12:00:00.000000Z",
"updated_at": "2023-01-01T12:00:00.000000Z"
}
| Attribute | Type | Description |
|---|---|---|
| id | integer | Unique identifier for the comment |
| commentable_type | string | What the comment is attached to: step, message, or projectinfo |
| commentable_id | integer | ID of the parent resource |
| content | string | Comment body, returned as Markdown |
| user | object | The author (id, name) |
| created_at | string | ISO 8601 timestamp |
| updated_at | string | ISO 8601 timestamp |
Comments are listed per parent resource, oldest first. Use the endpoint that matches the resource type you're reading.
/api/v1/steps/{step}/comments
/api/v1/messages/{message}/comments
/api/v1/project-infos/{projectInfo}/comments
| Parameter | Type | Description |
|---|---|---|
| per_page | integer | Number of results per page (max 1000) |
GET /api/v1/steps/123/comments
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json
[
{
"id": 901,
"commentable_type": "step",
"commentable_id": 123,
"content": "Looks good — just tweak the hero copy.",
"user": { "id": 123, "name": "John Doe" },
"created_at": "2023-01-01T12:00:00.000000Z",
"updated_at": "2023-01-01T12:00:00.000000Z"
}
]
Posts a comment to a step, message, or project info section. Content may be plain text or Markdown and is converted to Outlign's rich text format on save.
/api/v1/steps/{step}/comments
/api/v1/messages/{message}/comments
/api/v1/project-infos/{projectInfo}/comments
| Parameter | Type | Required | Description |
|---|---|---|---|
| content | string | Yes | Comment body (plain text or Markdown, max 200,000 characters) |
Internal content: Commenting on an internal task (a step in an internal phase) or
an internal message requires that you are a member of the agency company that owns the project.
Otherwise the request returns 403 Forbidden.
POST /api/v1/steps/123/comments
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
Accept: application/json
{
"content": "Looks good — just tweak the hero copy."
}
201 Created
{
"id": 902,
"commentable_type": "step",
"commentable_id": 123,
"content": "Looks good — just tweak the hero copy.",
"user": { "id": 123, "name": "John Doe" },
"created_at": "2023-01-15T10:00:00.000000Z",
"updated_at": "2023-01-15T10:00:00.000000Z"
}
Edits a comment you authored. You can only edit your own comments, and only while you still have access to the parent resource.
Attachments, form fields, and embeds are preserved on content updates. Markdown cannot express these elements, so when content replaces the body, any such elements in the existing content are kept in place even if your markdown omits them (elements retained as plain links are upgraded back to their original form). To remove them deliberately, pass allow_removing_attachments: true.
/api/v1/comments/{comment}
| Parameter | Type | Required | Description |
|---|---|---|---|
| content | string | Yes | Updated body (plain text or Markdown, max 200,000 characters) |
PATCH /api/v1/comments/902
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
Accept: application/json
{
"content": "Updated: tighten the hero copy and bump the CTA."
}
Deletes a comment you authored.
/api/v1/comments/{comment}
DELETE /api/v1/comments/902
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json
204 No Content