Layouts
Layouts, which candidates fill in to make proposals
The layout object
Attributes
iduuidUnique identifier
creator_idread-onlyuuid | nullIdentifier of the user that created this layout. Set automatically: the signed-in user, or the user who connected the OAuth app. Null for layouts created with an API key
created_atread-onlytimestamp with time zoneCreation timestamp
updated_attimestamp with time zoneLast modification timestamp
archived_attimestamp with time zone | nullArchival timestamp
assetsArray<LayoutAsset>Reusable assets used in the layout
custom_csstextCustom CSS applied to the layout
default_valuesPartial<Record<Language, JsonObject>>Default values of the layout's variables, per language. When empty, they are generated
descriptiontextDescription of the layout, shown in the layout library
export_filenametextFilename of exported PDF files (without .pdf). Can contain {{variables}}
featuredread-onlybooleanWhether the layout is featured in the layout library
ftsread-onlytsvectorFull text search index
languages[Language, ...Array<Language>]Languages the layout is translated into. The first is the default
nametextName of the layout
page_heightintegerPage height, in pixels
page_widthintegerPage width, in pixels
secretread-onlyuuidSecret string. Required to view the layout when its visibility is private
sectionsArray<LayoutSection>Sections the layout consists of
share_instructionstextInstructions shown in the share dialog, if any
slugtextUnique string to look up the layout in the layout library
thumbnailtext | nullThumbnail image of the layout. Generated automatically
tokensArray<LayoutDesignToken>Design tokens used in the layout
variablesArray<LayoutVariable>Variables used in the layout. Each candidate using the layout fills them in
visibilityLayoutVisibilityVisibility of the layout. public layouts are published to the layout library
web_settingsLayoutWebSettings | nullSettings for sharing the layout's proposals on the web
Related resources
Embed related resources in the response with the select parameter, for example select=*,organizations!organization_id(*). See selecting data. Resources related through more than one column need the column as a hint, like table!column(*).
organizations!organization_id(*)object | nullThe organization referenced by organization_id.
candidates(*)arrayThe candidates referencing this layout through candidates.layout_id.
organizations!default_layout_id(*)arrayThe organizations referencing this layout through organizations.default_layout_id.
{
"id": "00000000-0000-0000-0000-000000000000",
"creator_id": "00000000-0000-0000-0000-000000000000",
"organization_id": "00000000-0000-0000-0000-000000000000",
"parent_id": "00000000-0000-0000-0000-000000000000",
"created_at": "2026-01-01T12:00:00+00:00",
"updated_at": "2026-01-01T12:00:00+00:00",
"archived_at": null,
"assets": [
{
"family": "Roboto",
"type": "font",
"url": "https://ddcaybdkekwxbpgpotoa.supabase.co/storage/v1/object/public/common/organizations/00000000-0000-0000-0000-000000000000/roboto.ttf"
},
{
"label": "Example",
"type": "image",
"url": "https://ddcaybdkekwxbpgpotoa.supabase.co/storage/v1/object/public/common/organizations/00000000-0000-0000-0000-000000000000/example.png"
}
],
"custom_css": "",
"default_values": {
"en": {
"message": "Hello"
},
"nl": {
"message": "Hallo"
}
},
"description": "",
"export_filename": "",
"featured": false,
"fts": "'doe':2 'john':1",
"languages": [
"en",
"cs",
"da-DK",
"de",
"en-GB",
"es",
"fr",
"ja-JP",
"nb-NO",
"nl",
"pt-BR",
"sv-SE",
"yue",
"zh"
],
"name": "",
"page_height": 0,
"page_width": 0,
"secret": "00000000-0000-0000-0000-000000000000",
"sections": [
{
"body": {
"align": "left",
"background": "#FFFFFF",
"bold": false,
"border": null,
"borderRadius": "0",
"color": "#000000",
"columns": 1,
"font": {
"family": "Roboto",
"letter_spacing": 0,
"line_height": 1.5,
"paragraph_spacing": 0.5,
"size": 16
},
"grow": true,
"id": "text",
"italic": false,
"margin": "0",
"padding": 16,
"listStyle": "disc",
"split": false,
"strikethrough": false,
"textTransform": "none",
"transform": "",
"underline": false,
"value": {
"default": "Hello",
"nl": "Hallo"
},
"visibility": true,
"type": "text"
},
"footer": null,
"header": null,
"id": "section",
"label": "Section",
"type": "multi-page"
}
],
"share_instructions": "",
"slug": "",
"thumbnail": "",
"tokens": [
{
"id": "primary-color",
"name": "Primary color",
"type": "color",
"value": "#000000"
},
{
"id": "font-size",
"name": "Font size",
"type": "length",
"value": 16
}
],
"variables": [
{
"ai_instructions": "",
"sensitive": false,
"default": "",
"key": "name",
"max_length": null,
"min_length": 0,
"type": "inline-text"
},
{
"ai_instructions": "",
"sensitive": false,
"default": "",
"key": "description",
"max_length": null,
"min_length": 0,
"type": "text-block"
}
],
"visibility": "public",
"web_settings": {
"color_accent": "#000000",
"color_background": "#FFFFFF",
"color_text": "#000000"
}
}curl "https://api.cv-transformer.com/v1/layouts?limit=10&select=*,organizations!organization_id(*),user_profiles(*)" \
-H "Authorization: Bearer YOUR_API_KEY"List layouts
Requireslayouts:read
Filters
idFilter<uuid>Unique identifier
creator_idFilter<uuid | null>Identifier of the user that created this layout. Set automatically: the signed-in user, or the user who connected the OAuth app. Null for layouts created with an API key
created_atFilter<timestamp with time zone>Creation timestamp
updated_atFilter<timestamp with time zone>Last modification timestamp
archived_atFilter<timestamp with time zone | null>Archival timestamp
assetsFilter<Array<LayoutAsset>>Reusable assets used in the layout
custom_cssFilter<text>Custom CSS applied to the layout
default_valuesFilter<Partial<Record<Language, JsonObject>>>Default values of the layout's variables, per language. When empty, they are generated
descriptionFilter<text>Description of the layout, shown in the layout library
export_filenameFilter<text>Filename of exported PDF files (without .pdf). Can contain {{variables}}
featuredFilter<boolean>Whether the layout is featured in the layout library
ftsFilter<tsvector>Full text search index
languagesFilter<[Language, ...Array<Language>]>Languages the layout is translated into. The first is the default
nameFilter<text>Name of the layout
page_heightFilter<integer>Page height, in pixels
page_widthFilter<integer>Page width, in pixels
secretFilter<uuid>Secret string. Required to view the layout when its visibility is private
sectionsFilter<Array<LayoutSection>>Sections the layout consists of
share_instructionsFilter<text>Instructions shown in the share dialog, if any
slugFilter<text>Unique string to look up the layout in the layout library
thumbnailFilter<text | null>Thumbnail image of the layout. Generated automatically
tokensFilter<Array<LayoutDesignToken>>Design tokens used in the layout
variablesFilter<Array<LayoutVariable>>Variables used in the layout. Each candidate using the layout fills them in
visibilityFilter<LayoutVisibility>Visibility of the layout. public layouts are published to the layout library
web_settingsFilter<LayoutWebSettings | null>Settings for sharing the layout's proposals on the web
Responses
200A list of layouts with the selected columns. The Content-Range header holds the range returned and the total count, like 0-9/42.
206Partial Content
400The request is malformed, for example an unknown column or an invalid filter.
401The API key is missing or invalid.
403The API key doesn't have the scope this request needs.
429The API key made more requests per minute than its rate limit allows. Retry after the number of seconds in the Retry-After header.
message, details and hint, and for database errors a code. See errors.curl "https://api.cv-transformer.com/v1/layouts?limit=10&select=*" \
-H "Authorization: Bearer YOUR_API_KEY"[
{
"id": "00000000-0000-0000-0000-000000000000",
"creator_id": "00000000-0000-0000-0000-000000000000",
"organization_id": "00000000-0000-0000-0000-000000000000",
"parent_id": "00000000-0000-0000-0000-000000000000",
"created_at": "2026-01-01T12:00:00+00:00",
"updated_at": "2026-01-01T12:00:00+00:00",
"archived_at": null,
"assets": [
{
"family": "Roboto",
"type": "font",
"url": "https://ddcaybdkekwxbpgpotoa.supabase.co/storage/v1/object/public/common/organizations/00000000-0000-0000-0000-000000000000/roboto.ttf"
},
{
"label": "Example",
"type": "image",
"url": "https://ddcaybdkekwxbpgpotoa.supabase.co/storage/v1/object/public/common/organizations/00000000-0000-0000-0000-000000000000/example.png"
}
],
"custom_css": "",
"default_values": {
"en": {
"message": "Hello"
},
"nl": {
"message": "Hallo"
}
},
"description": "",
"export_filename": "",
"featured": false,
"fts": "'doe':2 'john':1",
"languages": [
"en",
"cs",
"da-DK",
"de",
"en-GB",
"es",
"fr",
"ja-JP",
"nb-NO",
"nl",
"pt-BR",
"sv-SE",
"yue",
"zh"
],
"name": "",
"page_height": 0,
"page_width": 0,
"secret": "00000000-0000-0000-0000-000000000000",
"sections": [
{
"body": {
"align": "left",
"background": "#FFFFFF",
"bold": false,
"border": null,
"borderRadius": "0",
"color": "#000000",
"columns": 1,
"font": {
"family": "Roboto",
"letter_spacing": 0,
"line_height": 1.5,
"paragraph_spacing": 0.5,
"size": 16
},
"grow": true,
"id": "text",
"italic": false,
"margin": "0",
"padding": 16,
"listStyle": "disc",
"split": false,
"strikethrough": false,
"textTransform": "none",
"transform": "",
"underline": false,
"value": {
"default": "Hello",
"nl": "Hallo"
},
"visibility": true,
"type": "text"
},
"footer": null,
"header": null,
"id": "section",
"label": "Section",
"type": "multi-page"
}
],
"share_instructions": "",
"slug": "",
"thumbnail": "",
"tokens": [
{
"id": "primary-color",
"name": "Primary color",
"type": "color",
"value": "#000000"
},
{
"id": "font-size",
"name": "Font size",
"type": "length",
"value": 16
}
],
"variables": [
{
"ai_instructions": "",
"sensitive": false,
"default": "",
"key": "name",
"max_length": null,
"min_length": 0,
"type": "inline-text"
},
{
"ai_instructions": "",
"sensitive": false,
"default": "",
"key": "description",
"max_length": null,
"min_length": 0,
"type": "text-block"
}
],
"visibility": "public",
"web_settings": {
"color_accent": "#000000",
"color_background": "#FFFFFF",
"color_text": "#000000"
}
}
]Create layouts
Requireslayouts:write
Body
Partial<Layout> | Array<Partial<Layout>>The attributes are listed under the layout object. Read-only attributes are set by CV-Transformer and can't be written.
Responses
201Created. With the header Prefer: return=representation, the body holds the created layouts with the selected columns.
400The request is malformed, for example an unknown column, an invalid filter or an invalid body.
401The API key is missing or invalid.
403The API key doesn't have the scope this request needs, or no permission for this change, for example when writing rows of another organization.
409The change conflicts with existing data, for example a duplicate key or a reference to a row that does not exist.
429The API key made more requests per minute than its rate limit allows. Retry after the number of seconds in the Retry-After header.
message, details and hint, and for database errors a code. See errors.curl "https://api.cv-transformer.com/v1/layouts" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"organization_id": "00000000-0000-0000-0000-000000000000",
"assets": [
{
"family": "Roboto",
"type": "font",
"url": "https://ddcaybdkekwxbpgpotoa.supabase.co/storage/v1/object/public/common/organizations/00000000-0000-0000-0000-000000000000/roboto.ttf"
},
{
"label": "Example",
"type": "image",
"url": "https://ddcaybdkekwxbpgpotoa.supabase.co/storage/v1/object/public/common/organizations/00000000-0000-0000-0000-000000000000/example.png"
}
],
"custom_css": "",
"default_values": {
"en": { "message": "Hello" },
"nl": { "message": "Hallo" }
},
"description": "",
"export_filename": "",
"languages": [
"en",
"cs",
"da-DK",
"de",
"en-GB",
"es",
"fr",
"ja-JP",
"nb-NO",
"nl",
"pt-BR",
"sv-SE",
"yue",
"zh"
],
"name": "",
"page_height": 0,
"page_width": 0,
"sections": [
{
"body": {
"align": "left",
"background": "#FFFFFF",
"bold": false,
"border": null,
"borderRadius": "0",
"color": "#000000",
"columns": 1,
"font": {
"family": "Roboto",
"letter_spacing": 0,
"line_height": 1.5,
"paragraph_spacing": 0.5,
"size": 16
},
"grow": true,
"id": "text",
"italic": false,
"margin": "0",
"padding": 16,
"listStyle": "disc",
"split": false,
"strikethrough": false,
"textTransform": "none",
"transform": "",
"underline": false,
"value": { "default": "Hello", "nl": "Hallo" },
"visibility": true,
"type": "text"
},
"footer": null,
"header": null,
"id": "section",
"label": "Section",
"type": "multi-page"
}
],
"share_instructions": "",
"slug": "",
"tokens": [
{
"id": "primary-color",
"name": "Primary color",
"type": "color",
"value": "#000000"
},
{
"id": "font-size",
"name": "Font size",
"type": "length",
"value": 16
}
],
"variables": [
{
"ai_instructions": "",
"sensitive": false,
"default": "",
"key": "name",
"max_length": null,
"min_length": 0,
"type": "inline-text"
},
{
"ai_instructions": "",
"sensitive": false,
"default": "",
"key": "description",
"max_length": null,
"min_length": 0,
"type": "text-block"
}
],
"visibility": "public"
}'(no content)Delete layouts
Requireslayouts:write
Filters
Without filters, this request deletes all layouts the API key has access to. Always filter on at least one column, like id=eq.{id}.
idFilter<uuid>Unique identifier
creator_idFilter<uuid | null>Identifier of the user that created this layout. Set automatically: the signed-in user, or the user who connected the OAuth app. Null for layouts created with an API key
created_atFilter<timestamp with time zone>Creation timestamp
updated_atFilter<timestamp with time zone>Last modification timestamp
archived_atFilter<timestamp with time zone | null>Archival timestamp
assetsFilter<Array<LayoutAsset>>Reusable assets used in the layout
custom_cssFilter<text>Custom CSS applied to the layout
default_valuesFilter<Partial<Record<Language, JsonObject>>>Default values of the layout's variables, per language. When empty, they are generated
descriptionFilter<text>Description of the layout, shown in the layout library
export_filenameFilter<text>Filename of exported PDF files (without .pdf). Can contain {{variables}}
featuredFilter<boolean>Whether the layout is featured in the layout library
ftsFilter<tsvector>Full text search index
languagesFilter<[Language, ...Array<Language>]>Languages the layout is translated into. The first is the default
nameFilter<text>Name of the layout
page_heightFilter<integer>Page height, in pixels
page_widthFilter<integer>Page width, in pixels
secretFilter<uuid>Secret string. Required to view the layout when its visibility is private
sectionsFilter<Array<LayoutSection>>Sections the layout consists of
share_instructionsFilter<text>Instructions shown in the share dialog, if any
slugFilter<text>Unique string to look up the layout in the layout library
thumbnailFilter<text | null>Thumbnail image of the layout. Generated automatically
tokensFilter<Array<LayoutDesignToken>>Design tokens used in the layout
variablesFilter<Array<LayoutVariable>>Variables used in the layout. Each candidate using the layout fills them in
visibilityFilter<LayoutVisibility>Visibility of the layout. public layouts are published to the layout library
web_settingsFilter<LayoutWebSettings | null>Settings for sharing the layout's proposals on the web
Responses
204Deleted. With the header Prefer: return=representation, the response is a 200 whose body holds the deleted layouts with the selected columns.
400The request is malformed, for example an unknown column or an invalid filter.
401The API key is missing or invalid.
403The API key doesn't have the scope this request needs, or no permission for this change, for example when writing rows of another organization.
429The API key made more requests per minute than its rate limit allows. Retry after the number of seconds in the Retry-After header.
message, details and hint, and for database errors a code. See errors.curl -X DELETE "https://api.cv-transformer.com/v1/layouts?id=eq.00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer YOUR_API_KEY"(no content)Update layouts
Requireslayouts:write
Filters
Without filters, this request updates all layouts the API key has access to. Always filter on at least one column, like id=eq.{id}.
idFilter<uuid>Unique identifier
creator_idFilter<uuid | null>Identifier of the user that created this layout. Set automatically: the signed-in user, or the user who connected the OAuth app. Null for layouts created with an API key
created_atFilter<timestamp with time zone>Creation timestamp
updated_atFilter<timestamp with time zone>Last modification timestamp
archived_atFilter<timestamp with time zone | null>Archival timestamp
assetsFilter<Array<LayoutAsset>>Reusable assets used in the layout
custom_cssFilter<text>Custom CSS applied to the layout
default_valuesFilter<Partial<Record<Language, JsonObject>>>Default values of the layout's variables, per language. When empty, they are generated
descriptionFilter<text>Description of the layout, shown in the layout library
export_filenameFilter<text>Filename of exported PDF files (without .pdf). Can contain {{variables}}
featuredFilter<boolean>Whether the layout is featured in the layout library
ftsFilter<tsvector>Full text search index
languagesFilter<[Language, ...Array<Language>]>Languages the layout is translated into. The first is the default
nameFilter<text>Name of the layout
page_heightFilter<integer>Page height, in pixels
page_widthFilter<integer>Page width, in pixels
secretFilter<uuid>Secret string. Required to view the layout when its visibility is private
sectionsFilter<Array<LayoutSection>>Sections the layout consists of
share_instructionsFilter<text>Instructions shown in the share dialog, if any
slugFilter<text>Unique string to look up the layout in the layout library
thumbnailFilter<text | null>Thumbnail image of the layout. Generated automatically
tokensFilter<Array<LayoutDesignToken>>Design tokens used in the layout
variablesFilter<Array<LayoutVariable>>Variables used in the layout. Each candidate using the layout fills them in
visibilityFilter<LayoutVisibility>Visibility of the layout. public layouts are published to the layout library
web_settingsFilter<LayoutWebSettings | null>Settings for sharing the layout's proposals on the web
Body
Partial<Layout>The attributes are listed under the layout object. Read-only attributes are set by CV-Transformer and can't be written.
Responses
204Updated. With the header Prefer: return=representation, the response is a 200 whose body holds the updated layouts with the selected columns.
400The request is malformed, for example an unknown column, an invalid filter or an invalid body.
401The API key is missing or invalid.
403The API key doesn't have the scope this request needs, or no permission for this change, for example when writing rows of another organization.
409The change conflicts with existing data, for example a duplicate key or a reference to a row that does not exist.
429The API key made more requests per minute than its rate limit allows. Retry after the number of seconds in the Retry-After header.
message, details and hint, and for database errors a code. See errors.curl -X PATCH "https://api.cv-transformer.com/v1/layouts?id=eq.00000000-0000-0000-0000-000000000000" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"assets": [
{
"family": "Roboto",
"type": "font",
"url": "https://ddcaybdkekwxbpgpotoa.supabase.co/storage/v1/object/public/common/organizations/00000000-0000-0000-0000-000000000000/roboto.ttf"
},
{
"label": "Example",
"type": "image",
"url": "https://ddcaybdkekwxbpgpotoa.supabase.co/storage/v1/object/public/common/organizations/00000000-0000-0000-0000-000000000000/example.png"
}
]
}'(no content)