Object Models
Understand the core V2 API objects, including user, page, database, block, list, and error.
Object Models
These are the core shapes returned by V2 endpoints. Endpoint pages may show partial examples, but these models describe the stable object categories.
Core Objects
| Object | Description |
|---|---|
user |
A person account visible to the token. |
bot_user |
The integration identity returned by GET /v2/users/me. |
page |
A page or database record. Buildin extensions such as folders and mind maps also use object: "page". |
database |
A database with property schema directly on the object. |
database_view |
A database view carrying filter, sorts, layout, grouping, and type-specific config. |
mind_map |
A normalized mind-map tree returned by the mind-map endpoints. |
block |
A content block with type-specific content under the field named by type. |
list |
A paginated response wrapper. |
error |
The unified error response. |
user
{
"object": "user",
"id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb",
"type": "person",
"name": "Alex Chen",
"avatar_url": "https://example.com/avatar.png",
"person": {
"email": "alex@example.com"
}
}
Without users.email.read, person.email is null.
bot_user
{
"object": "bot_user",
"id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa",
"name": "My Integration",
"workspace_id": "99999999-9999-4999-8999-999999999999",
"workspace_name": "Team Workspace",
"owner": {
"object": "user",
"id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb"
},
"capabilities": {
"pages.read": true,
"pages.write": true,
"blocks.read": true,
"blocks.write": true,
"databases.read": true,
"databases.write": true,
"users.read": true,
"users.email.read": false,
"search.read": true
},
"type": "integration",
"integration_id": "77777777-7777-4777-8777-777777777777"
}
page
{
"object": "page",
"id": "11111111-1111-4111-8111-111111111111",
"page_type": "page",
"created_time": "2026-04-09T08:00:00.000Z",
"last_edited_time": "2026-04-09T09:30:00.000Z",
"created_by": {
"object": "user",
"id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb"
},
"last_edited_by": {
"object": "user",
"id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb"
},
"parent": {
"type": "page_id",
"page_id": "55555555-5555-4555-8555-555555555555"
},
"in_trash": false,
"icon": null,
"cover": null,
"properties": {
"title": {
"id": "title",
"type": "title",
"title": [
{
"type": "text",
"text": {
"content": "Launch Plan",
"link": null
},
"plain_text": "Launch Plan",
"href": null
}
]
}
},
"url": "https://buildin.ai/docs/11111111-1111-4111-8111-111111111111"
}
in_trashrepresents soft-delete state.iconandcovercan benull.page_typeis a Buildin extension and can bepage,folder, ormind_map.- Folders and mind maps still use
object: "page".
When returned from the dedicated mind-map endpoints, a mind map uses object: "mind_map" and includes its complete node tree and settings. See Mind Maps for that response shape and edit operations.
database
{
"object": "database",
"id": "66666666-6666-4666-8666-666666666666",
"created_time": "2026-04-09T08:00:00.000Z",
"last_edited_time": "2026-04-09T09:30:00.000Z",
"created_by": {
"object": "user",
"id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb"
},
"last_edited_by": {
"object": "user",
"id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb"
},
"title": [
{
"type": "text",
"text": {
"content": "Task Board",
"link": null
},
"plain_text": "Task Board",
"href": null
}
],
"description": [],
"icon": null,
"cover": null,
"parent": {
"type": "page_id",
"page_id": "55555555-5555-4555-8555-555555555555"
},
"properties": {
"Name": {
"id": "title",
"type": "title",
"name": "Name"
},
"Status": {
"id": "16161616-1616-4616-8616-161616161616",
"type": "select",
"name": "Status"
}
},
"in_trash": false,
"is_inline": false,
"url": "https://buildin.ai/database/66666666-6666-4666-8666-666666666666"
}
database.propertiescontains schema and is not split into a data source object.is_inlineindicates whether the database is displayed inline in its parent page.titleanddescriptionare rich_text arrays.
database_view
database_view is a view of a database (table/board/gallery/list/calendar/timeline/form) and a sub-resource of database.
objectis always"database_view".typecannot be changed after creation; thespacetype is not exposed through v2.property_layoutis the ordered column layout and references the exactproperty_idreturned by the database or view API; legacy databases may use a non-titleid for the title property. On layout writes, the literaltitleremains a compatibility alias and resolves to the sole title property when the schema has no exacttitlekey. It is empty fortimeline/formviews.filter/sortsuse the structure saved by the web client (nested groups, string-onlyvalue, operators likeeq/neq/in/...). Forselectandmulti_selectfilters, the canonical value is the option id exposed by Retrieve a database. Writes also accept a unique option name for backward compatibility and normalize it to the id. This is a separate contract from the Notion-style query request dialect; the two are never converted into each other. Conditions referencing deleted properties are pruned on read.page_sortis only returned by the view detail endpoint and holds the manual record order.group_byis only supported bytable/boardviews.configis the curated per-type config projection (table wrap/freeze/aggregations, board/gallery card and cover settings, calendar/timeline date properties, form display switches).
block
{
"object": "block",
"id": "44444444-4444-4444-8444-444444444444",
"parent": {
"type": "page_id",
"page_id": "11111111-1111-4111-8111-111111111111"
},
"created_time": "2026-04-09T08:00:00.000Z",
"last_edited_time": "2026-04-09T09:30:00.000Z",
"created_by": {
"object": "user",
"id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb"
},
"last_edited_by": {
"object": "user",
"id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb"
},
"has_children": false,
"in_trash": false,
"type": "paragraph",
"paragraph": {
"rich_text": [
{
"type": "text",
"text": {
"content": "Project kickoff notes",
"link": null
},
"annotations": {
"text_color": "red",
"background_color": "light_yellow"
},
"plain_text": "Project kickoff notes",
"href": null
}
],
"text_color": "blue",
"background_color": "yellow_green"
}
}
The type-specific content for paragraphs, headings, list items, to-do items, quotes, toggles, and callouts has two independent color channels:
text_color:default,black,gray,brown,orange,pink,yellow,green,blue,purple, orred.background_color:default,gray,brown,orange,pink,yellow,green,blue,purple,red,light_yellow,light_green,light_blue,light_purple,light_red,yellow_green,green_blue,blue_purple,purple_red, orred_orange.
Both fields may be set at the same time. The same fields are available in every rich_text[].annotations object, including captions and table cells. default clears only that channel. The legacy single-channel color field remains accepted for compatibility, but new integrations should use the explicit fields.
See Block Types for block content schemas and writable type coverage.
list
{
"object": "list",
"results": [],
"next_cursor": "opaque_cursor",
"has_more": true
}
| Field | Type | Description |
|---|---|---|
object |
string | Always list. |
results |
array | Items for the current page. |
next_cursor |
string or null | Cursor for the next page; null when there are no more results. |
has_more |
boolean | Whether another page is available. |
error
{
"object": "error",
"status": 400,
"code": "validation_error",
"message": "parent.page_id is required",
"request_id": "req_xxx",
"details": [
{
"path": "parent.page_id",
"reason": "required"
}
]
}
See Error Codes for the complete error model.