export const commonIdDescription =
'It should be a 32-character string (excluding hyphens) formatted as 8-4-4-4-12 with hyphens (-).';
// Rich text object schema
export const richTextObjectSchema = {
type: 'object',
description: 'A rich text object.',
properties: {
type: {
type: 'string',
description:
'The type of this rich text object. Possible values: text, mention, equation.',
enum: ['text', 'mention', 'equation'],
},
text: {
type: 'object',
description:
"Object containing text content and optional link info. Required if type is 'text'.",
properties: {
content: {
type: 'string',
description: 'The actual text content.',
},
link: {
type: 'object',
description: "Optional link object with a 'url' field.",
properties: {
url: {
type: 'string',
description: 'The URL the text links to.',
},
},
},
},
},
mention: {
type: 'object',
description:
"Mention object if type is 'mention'. Represents an inline mention of a database, date, link preview, page, template mention, or user.",
properties: {
type: {
type: 'string',
description: 'The type of the mention.',
enum: [
'database',
'date',
'link_preview',
'page',
'template_mention',
'user',
],
},
database: {
type: 'object',
description:
"Database mention object. Contains a database reference with an 'id' field.",
properties: {
id: {
type: 'string',
description:
'The ID of the mentioned database.' + commonIdDescription,
},
},
required: ['id'],
},
date: {
type: 'object',
description:
'Date mention object, containing a date property value object.',
properties: {
start: {
type: 'string',
description: 'An ISO 8601 formatted start date or date-time.',
},
end: {
type: ['string', 'null'],
description:
'An ISO 8601 formatted end date or date-time, or null if not a range.',
},
time_zone: {
type: ['string', 'null'],
description:
'Time zone information for start and end. If null, times are in UTC.',
},
},
required: ['start'],
},
link_preview: {
type: 'object',
description:
'Link Preview mention object, containing a URL for the link preview.',
properties: {
url: {
type: 'string',
description: 'The URL for the link preview.',
},
},
required: ['url'],
},
page: {
type: 'object',
description:
"Page mention object, containing a page reference with an 'id' field.",
properties: {
id: {
type: 'string',
description:
'The ID of the mentioned page.' + commonIdDescription,
},
},
required: ['id'],
},
template_mention: {
type: 'object',
description:
'Template mention object, can be a template_mention_date or template_mention_user.',
properties: {
type: {
type: 'string',
enum: ['template_mention_date', 'template_mention_user'],
description: 'The template mention type.',
},
template_mention_date: {
type: 'string',
enum: ['today', 'now'],
description: 'For template_mention_date type, the date keyword.',
},
template_mention_user: {
type: 'string',
enum: ['me'],
description: 'For template_mention_user type, the user keyword.',
},
},
},
user: {
type: 'object',
description: 'User mention object, contains a user reference.',
properties: {
object: {
type: 'string',
description: "Should be 'user'.",
enum: ['user'],
},
id: {
type: 'string',
description: 'The ID of the user.' + commonIdDescription,
},
},
required: ['object', 'id'],
},
},
required: ['type'],
oneOf: [
{ required: ['database'] },
{ required: ['date'] },
{ required: ['link_preview'] },
{ required: ['page'] },
{ required: ['template_mention'] },
{ required: ['user'] },
],
},
equation: {
type: 'object',
description:
"Equation object if type is 'equation'. Represents an inline LaTeX equation.",
properties: {
expression: {
type: 'string',
description: 'LaTeX string representing the inline equation.',
},
},
required: ['expression'],
},
annotations: {
type: 'object',
description: 'Styling information for the text.',
properties: {
bold: { type: 'boolean' },
italic: { type: 'boolean' },
strikethrough: { type: 'boolean' },
underline: { type: 'boolean' },
code: { type: 'boolean' },
color: {
type: 'string',
description: 'Color for the text.',
enum: [
'default',
'blue',
'blue_background',
'brown',
'brown_background',
'gray',
'gray_background',
'green',
'green_background',
'orange',
'orange_background',
'pink',
'pink_background',
'purple',
'purple_background',
'red',
'red_background',
'yellow',
'yellow_background',
],
},
},
},
href: {
type: 'string',
description: 'The URL of any link or mention in this text, if any.',
},
plain_text: {
type: 'string',
description: 'The plain text without annotations.',
},
},
required: ['type'],
};
// Block object schema
export const blockObjectSchema = {
type: 'object',
description: 'A Notion block object.',
properties: {
object: {
type: 'string',
description: "Should be 'block'.",
enum: ['block'],
},
type: {
type: 'string',
description:
"Type of the block. Possible values include 'paragraph', 'heading_1', 'heading_2', 'heading_3', 'bulleted_list_item', 'numbered_list_item', 'to_do', 'toggle', 'child_page', 'child_database', 'embed', 'callout', 'quote', 'equation', 'divider', 'table_of_contents', 'column', 'column_list', 'link_preview', 'synced_block', 'template', 'link_to_page', 'audio', 'bookmark', 'breadcrumb', 'code', 'file', 'image', 'pdf', 'video'. Not all types are supported for creation via API.",
},
paragraph: {
type: 'object',
description: 'Paragraph block object.',
properties: {
rich_text: richTextObjectSchema,
color: {
type: 'string',
description: 'The color of the block.',
enum: [
'default',
'blue',
'blue_background',
'brown',
'brown_background',
'gray',
'gray_background',
'green',
'green_background',
'orange',
'orange_background',
'pink',
'pink_background',
'purple',
'purple_background',
'red',
'red_background',
'yellow',
'yellow_background',
],
},
children: {
type: 'array',
description: 'Nested child blocks.',
items: {
type: 'object',
description: 'A nested block object.',
},
},
},
},
},
required: ['object', 'type'],
};