Messages are project-level posts used to communicate within a project. A message can be internal (visible only to agency team members) or client-facing, and can carry its own thread of comments.
{
"id": 321,
"title": "Kickoff notes",
"content": "Welcome to the project! Here's what we'll cover this week...",
"is_internal": false,
"project": {
"id": 789,
"title": "Website Redesign"
},
"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 message |
| title | string|null | Optional message title |
| content | string | Message body, returned as Markdown |
| is_internal | boolean | Whether the message is internal (agency only) or client-facing |
| project | object | The project the message belongs to (id, title) |
| user | object | The author (id, name) |
| created_at | string | ISO 8601 timestamp |
| updated_at | string | ISO 8601 timestamp |
Retrieves messages for a project, most recent first. Only projects belonging to a company you are a member of are accessible.
/api/v1/projects/{project}/messages
| Parameter | Type | Description |
|---|---|---|
| per_page | integer | Number of results per page (max 1000) |
GET /api/v1/projects/789/messages
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json
[
{
"id": 321,
"title": "Kickoff notes",
"content": "Welcome to the project!...",
"is_internal": false,
"project": { "id": 789, "title": "Website Redesign" },
"user": { "id": 123, "name": "John Doe" },
"created_at": "2023-01-01T12:00:00.000000Z",
"updated_at": "2023-01-01T12:00:00.000000Z"
}
]
Posts a new message to a project. The content may be supplied as plain text or Markdown and is automatically converted to Outlign's rich text format for storage.
/api/v1/projects/{project}/messages
| Parameter | Type | Required | Description |
|---|---|---|---|
| content | string | Yes | Message body (plain text or Markdown, max 200,000 characters) |
| title | string | No | Optional title (max 255 characters) |
| is_internal | boolean | No | Mark the message as internal (agency only). Defaults to false |
POST /api/v1/projects/789/messages
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
Accept: application/json
{
"title": "Kickoff notes",
"content": "Welcome to the project! Here's what we'll cover this week...",
"is_internal": false
}
201 Created
{
"id": 322,
"title": "Kickoff notes",
"content": "Welcome to the project!...",
"is_internal": false,
"project": { "id": 789, "title": "Website Redesign" },
"user": { "id": 123, "name": "John Doe" },
"created_at": "2023-01-15T10:00:00.000000Z",
"updated_at": "2023-01-15T10:00:00.000000Z"
}
Updates a message you authored. All fields are optional — only the fields you send are changed.
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/messages/{message}
| Parameter | Type | Description |
|---|---|---|
| title | string|null | Updated title (max 255 characters) |
| content | string | Updated body (plain text or Markdown, max 200,000 characters) |
Note: A message's is_internal visibility cannot be changed after it is
posted. Sending an is_internal value that differs from the stored one returns
403 Forbidden.
PATCH /api/v1/messages/322
Authorization: Bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
Accept: application/json
{
"content": "Updated kickoff notes with the revised schedule."
}
Deletes a message you authored.
/api/v1/messages/{message}
DELETE /api/v1/messages/322
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json
204 No Content