Skip to main content
Keys in properties are property names. When writing, you can use either the property name or its ID as the key.

Rich text items

title and rich_text are arrays of rich text items. When reading
An item’s type is text, mention, or equation. mention.type is user, page, database, date, or custom_emoji. A mention of a document or database the integration can’t read has plain_text set to Untitled. A person mention read by an integration with user information set to None is @Anonymous. Long text comes back as several items of up to 2,000 characters, so rich_text[0] holds only the first part. Join every item to read the whole text. When writing
  • Links accept http(s), mailto, and document-relative addresses. Anything else returns 400 Invalid URL for link.
  • An item holds up to 2,000 characters, and an array up to 100 items. See Values and request size.
  • Items with the same formatting are merged when stored. Reading returns them split every 2,000 characters.
  • You can write rich text items back as you read them. Person mentions are the exception: send only { "id": "..." }.
  • A mention with an unknown document ID returns 200 and reads back as an Untitled document mention. An item with an unknown custom emoji ID is dropped.
  • Empty text items aren’t stored.
  • A date mention whose end is earlier than its start loses the end.

Writable properties

Read-only properties

formula, rollup, unique_id, created_time, created_by, last_edited_time, last_edited_by, and button can’t be written. Writing them returns 400. Session, linked pages, and PR properties don’t appear in responses.

Options

  • When both id and name are sent, id wins. An unknown id returns 400.
  • Names are trimmed and matched case-insensitively.
  • If no name matches, select and multi_select create a new option. If the write fails, the new option isn’t kept.
  • A name with a comma returns 400.
  • A color has to be one of default, gray, brown, orange, yellow, green, blue, purple, pink, or red. Sending a different color for an existing option returns 400.
  • status doesn’t create options. An unknown name returns 400.

Dates

When reading, time_zone is always null. Values with a time include an offset.
When writing, these rules apply:
  • An end earlier than the start returns 400, including when the start and end have different offsets. Times with no offset and date-only values are compared as UTC.
  • To send time_zone, both start and end need a time, with no offset or a zero offset.
  • Values with a time are normalized to one offset: the start’s offset if the start has a time (+00:00 if it has none), otherwise the end’s offset.
  • An invalid date returns 400 ... date.start should be a valid ISO 8601 date string ...

People

  • Sending a user object as read returns 400. Send { "id": "..." }.
  • An unknown ID or a group returns 404 Could not find user with ID: ...
  • Going over a property’s person limit returns 400 The request failed validation. Error: Invalid value for property with limit
  • People already in the property aren’t checked again. An integration with user information set to None can’t send people at all.

Relations

  • A write replaces the whole value. A row response returns at most 25 relations, so if has_more is true, read them all first with Retrieve a property value.
  • An ID for a row the integration can’t read returns 404.
  • Only top-level rows of the target database are kept. Rows of other readable databases and subpages are silently dropped.
  • Existing relations the integration can’t see are kept.
  • Sending more than one value to a property limited to 1 returns 400 Relation property ... has a limit of 1, but ... values were provided.
  • Adding or removing a row of a database with a task agent attached returns 403.

Files

When reading
When writing

Common validation errors