Layouts

Layouts, which candidates fill in to make proposals

The layout object

Attributes

iduuid

Unique identifier

creator_idread-onlyuuid | null
user_profiles.user_id

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

organization_iduuid
organizations.id

Identifier of the related organization

parent_iduuid | null
layouts.id

Identifier of the layout this layout was copied from

created_atread-onlytimestamp with time zone

Creation timestamp

updated_attimestamp with time zone

Last modification timestamp

archived_attimestamp with time zone | null

Archival timestamp

assetsArray<LayoutAsset>

Reusable assets used in the layout

custom_csstext

Custom CSS applied to the layout

default_valuesPartial<Record<Language, JsonObject>>

Default values of the layout's variables, per language. When empty, they are generated

descriptiontext

Description of the layout, shown in the layout library

export_filenametext

Filename of exported PDF files (without .pdf). Can contain {{variables}}

featuredread-onlyboolean

Whether the layout is featured in the layout library

ftsread-onlytsvector

Full text search index

languages[Language, ...Array<Language>]

Languages the layout is translated into. The first is the default

nametext

Name of the layout

page_heightinteger

Page height, in pixels

page_widthinteger

Page width, in pixels

secretread-onlyuuid

Secret string. Required to view the layout when its visibility is private

sectionsArray<LayoutSection>

Sections the layout consists of

share_instructionstext

Instructions shown in the share dialog, if any

slugtext

Unique string to look up the layout in the layout library

thumbnailtext | null

Thumbnail 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

visibilityLayoutVisibility

Visibility of the layout. public layouts are published to the layout library

web_settingsLayoutWebSettings | null

Settings 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 | null
organizations.id

The organization referenced by organization_id.

user_profiles(*)object | null
user_profiles.user_id

The user profile referenced by creator_id.

candidates(*)array
candidates.layout_id

The candidates referencing this layout through candidates.layout_id.

organizations!default_layout_id(*)array
organizations.default_layout_id

The organizations referencing this layout through organizations.default_layout_id.

The layout object
JSON
{
  "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"
  }
}
Including related resources
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>
user_profiles.user_id

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

organization_idFilter<uuid>
organizations.id

Identifier of the related organization

parent_idFilter<uuid | null>
layouts.id

Identifier of the layout this layout was copied from

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

200

A list of layouts with the selected columns. The Content-Range header holds the range returned and the total count, like 0-9/42.

206

Partial Content

400

The request is malformed, for example an unknown column or an invalid filter.

401

The API key is missing or invalid.

403

The API key doesn't have the scope this request needs.

429

The API key made more requests per minute than its rate limit allows. Retry after the number of seconds in the Retry-After header.

Errors have a JSON body with a message, details and hint, and for database errors a code. See errors.
GET/layouts
curl "https://api.cv-transformer.com/v1/layouts?limit=10&select=*" \
  -H "Authorization: Bearer YOUR_API_KEY"
Example response
JSON
[
  {
    "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

201

Created. With the header Prefer: return=representation, the body holds the created layouts with the selected columns.

400

The request is malformed, for example an unknown column, an invalid filter or an invalid body.

401

The API key is missing or invalid.

403

The API key doesn't have the scope this request needs, or no permission for this change, for example when writing rows of another organization.

409

The change conflicts with existing data, for example a duplicate key or a reference to a row that does not exist.

429

The API key made more requests per minute than its rate limit allows. Retry after the number of seconds in the Retry-After header.

Errors have a JSON body with a message, details and hint, and for database errors a code. See errors.
POST/layouts
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"
  }'
Example response
JSON
(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>
user_profiles.user_id

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

organization_idFilter<uuid>
organizations.id

Identifier of the related organization

parent_idFilter<uuid | null>
layouts.id

Identifier of the layout this layout was copied from

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

204

Deleted. With the header Prefer: return=representation, the response is a 200 whose body holds the deleted layouts with the selected columns.

400

The request is malformed, for example an unknown column or an invalid filter.

401

The API key is missing or invalid.

403

The API key doesn't have the scope this request needs, or no permission for this change, for example when writing rows of another organization.

429

The API key made more requests per minute than its rate limit allows. Retry after the number of seconds in the Retry-After header.

Errors have a JSON body with a message, details and hint, and for database errors a code. See errors.
DELETE/layouts
curl -X DELETE "https://api.cv-transformer.com/v1/layouts?id=eq.00000000-0000-0000-0000-000000000000" \
  -H "Authorization: Bearer YOUR_API_KEY"
Example response
JSON
(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>
user_profiles.user_id

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

organization_idFilter<uuid>
organizations.id

Identifier of the related organization

parent_idFilter<uuid | null>
layouts.id

Identifier of the layout this layout was copied from

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

204

Updated. With the header Prefer: return=representation, the response is a 200 whose body holds the updated layouts with the selected columns.

400

The request is malformed, for example an unknown column, an invalid filter or an invalid body.

401

The API key is missing or invalid.

403

The API key doesn't have the scope this request needs, or no permission for this change, for example when writing rows of another organization.

409

The change conflicts with existing data, for example a duplicate key or a reference to a row that does not exist.

429

The API key made more requests per minute than its rate limit allows. Retry after the number of seconds in the Retry-After header.

Errors have a JSON body with a message, details and hint, and for database errors a code. See errors.
PATCH/layouts
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"
      }
    ]
  }'
Example response
JSON
(no content)