Messages API

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.

The Message Object

{
  "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"
}

Attributes

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

List Messages

Retrieves messages for a project, most recent first. Only projects belonging to a company you are a member of are accessible.

GET /api/v1/projects/{project}/messages

Query Parameters

Parameter Type Description
per_page integer Number of results per page (max 1000)

Example Request

GET /api/v1/projects/789/messages
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json

Example Response

[
  {
    "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"
  }
]

Create a Message

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.

POST /api/v1/projects/{project}/messages

Request Body

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

Example Request

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
}

Example Response

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"
}

Update a Message

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.

PUT PATCH /api/v1/messages/{message}

Request Body

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.

Example Request

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."
}

Delete a Message

Deletes a message you authored.

DELETE /api/v1/messages/{message}

Example Request

DELETE /api/v1/messages/322
Authorization: Bearer YOUR_ACCESS_TOKEN
Accept: application/json

Example Response

204 No Content