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.

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