> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getqr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Templates

> Save reusable QR code designs and apply them to new QR codes.

> [!NOTE]
>
> The GetQR API is in beta and is available to selected workspaces. Details may change before the general release.

A template stores a reusable design: `styles`, `frameOptions` and `logoOptions`. It never carries content or a link. Templates are shared by everyone in the workspace.

| Method | Path | Description |
| - | - | - |
| `GET` | `/api/v1/templates` | [List templates](#list-templates) |
| `POST` | `/api/v1/templates` | [Create a template](#create-a-template) |
| `GET` | `/api/v1/templates/{templateId}` | [Get a template](#get-a-template) |
| `PATCH` | `/api/v1/templates/{templateId}` | [Update a template](#update-a-template) |
| `DELETE` | `/api/v1/templates/{templateId}` | [Delete a template](#delete-a-template) |
| `POST` | `/api/v1/templates/{templateId}/duplicate` | [Duplicate a template](#duplicate-a-template) |

## Apply a template

Pass `templateId` when you [create a QR code](https://docs.getqr.com/api/endpoints/qr-codes.md). The template's design is applied to the new QR code. Any of the three design objects you send in the same request are merged on top of it.

* **Copied, not linked.** The QR code keeps its own copy of the design. Editing or deleting the template later doesn't change it.
* **Custom designs only.** A template with `designKind` `branded` or `ai` can't be applied through the API and returns `422` (`art_template_unsupported`).
* **Your workspace only.** An unknown template, or one from another workspace, returns `404`.

## Headers

**Authorization** `string` *required*

`Bearer` followed by your API key. See [Authentication](https://docs.getqr.com/api/authentication.md).

**Content-Type** `string`

`application/json`. Required on requests with a body.

## The template object

**id** `string`

ID of the template, for example `qrt_8Hs2mQvKpLd4RtYw`.

**name** `string`

Name shown when picking a template.

**designKind** `string`

Read-only. `custom` is a design the API can edit in full. `branded` and `ai` are a Branded design or AI design made in the dashboard: its picture can't be edited through the API, and it is kept when you change the other design fields.

**design** `object`

The stored design. Each field has the same shape as the request field of the same name, so you can send it back.

**properties**

**styles** `object | null`

Dot and corner shapes and colors.

**frameOptions** `object | null`

Frame around the QR code and its call-to-action text.

**logoOptions** `object | null`

Logo in the center.

**createdAt** `string`

Creation date, ISO 8601.

**updatedAt** `string`

Last update date, ISO 8601.

## List templates

`GET /api/v1/templates`

Returns the templates of your workspace, newest first. The list is paginated: see [Pagination](https://docs.getqr.com/api/introduction.md#pagination).

**page** `integer` (default: 1)

Page to return, 1 or higher.

**pageSize** `integer` (default: 100)

Results per page, 1 to 100.

```bash cURL theme={null}
curl "https://getqr.com/api/v1/templates?page=1&pageSize=100" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 200 theme={null}
{
  "data": [
    {
      "id": "qrt_8Hs2mQvKpLd4RtYw",
      "name": "Brand blue",
      "designKind": "custom",
      "design": {
        "styles": {
          "dotsOptions": { "type": "rounded", "color": "#1E40AF" },
          "backgroundOptions": { "color": "#FFFFFF" }
        },
        "frameOptions": null,
        "logoOptions": null
      },
      "createdAt": "2026-07-20T09:12:00.000Z",
      "updatedAt": "2026-07-20T09:12:00.000Z"
    }
  ],
  "pagination": { "page": 1, "pageSize": 100, "total": 1, "hasMore": false }
}
```

## Create a template

`POST /api/v1/templates`

Saves a new design. Answers `201 Created`. The design fields are checked against the catalogs in [Customization](https://docs.getqr.com/api/guides/customization.md), so an unknown shape, frame or logo is rejected with `422`.

**name** `string` *required*

Name shown when picking a template, 1 to 40 characters.

**styles** `object`

Dot and corner shapes and colors. See [Customization](https://docs.getqr.com/api/guides/customization.md).

**frameOptions** `object`

Frame drawn around the QR code and its call-to-action text. See [Customization](https://docs.getqr.com/api/guides/customization.md).

**logoOptions** `object`

Logo placed in the center: a suggested logo, or your own file uploaded with the `logo` target of [Files](https://docs.getqr.com/api/endpoints/files.md). See [Customization](https://docs.getqr.com/api/guides/customization.md).

```bash cURL theme={null}
curl -X POST "https://getqr.com/api/v1/templates" \
  -H "Authorization: Bearer $GETQR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Brand blue",
    "styles": {
      "dotsOptions": { "type": "rounded", "color": "#1E40AF" },
      "backgroundOptions": { "color": "#FFFFFF" }
    }
  }'
```

```json 201 theme={null}
{
  "id": "qrt_8Hs2mQvKpLd4RtYw",
  "name": "Brand blue",
  "designKind": "custom",
  "design": {
    "styles": {
      "dotsOptions": { "type": "rounded", "color": "#1E40AF" },
      "backgroundOptions": { "color": "#FFFFFF" }
    },
    "frameOptions": null,
    "logoOptions": null
  },
  "createdAt": "2026-07-20T09:12:00.000Z",
  "updatedAt": "2026-07-20T09:12:00.000Z"
}
```

## Get a template

`GET /api/v1/templates/{templateId}`

**templateId** `string` *required*

ID of the template. Take it from the list or create response.

```bash cURL theme={null}
curl "https://getqr.com/api/v1/templates/qrt_8Hs2mQvKpLd4RtYw" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 200 theme={null}
{
  "id": "qrt_8Hs2mQvKpLd4RtYw",
  "name": "Brand blue",
  "designKind": "custom",
  "design": {
    "styles": {
      "dotsOptions": { "type": "rounded", "color": "#1E40AF" },
      "backgroundOptions": { "color": "#FFFFFF" }
    },
    "frameOptions": null,
    "logoOptions": null
  },
  "createdAt": "2026-07-20T09:12:00.000Z",
  "updatedAt": "2026-07-20T09:12:00.000Z"
}
```

## Update a template

`PATCH /api/v1/templates/{templateId}`

Send only the fields you want to change. Design objects are merged into the stored design, so a partial `styles` keeps the rest. QR codes already created from the template keep the design they were made with.

**templateId** `string` *required*

ID of the template.

**name** `string`

New name, 1 to 40 characters.

**styles** `object`

Style changes, merged into the stored `styles`.

**frameOptions** `object`

Frame changes, merged into the stored frame.

**logoOptions** `object`

Logo changes, merged into the stored logo.

```bash cURL theme={null}
curl -X PATCH "https://getqr.com/api/v1/templates/qrt_8Hs2mQvKpLd4RtYw" \
  -H "Authorization: Bearer $GETQR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Brand blue (2026)" }'
```

```json 200 theme={null}
{
  "id": "qrt_8Hs2mQvKpLd4RtYw",
  "name": "Brand blue (2026)",
  "designKind": "custom",
  "design": {
    "styles": {
      "dotsOptions": { "type": "rounded", "color": "#1E40AF" },
      "backgroundOptions": { "color": "#FFFFFF" }
    },
    "frameOptions": null,
    "logoOptions": null
  },
  "createdAt": "2026-07-20T09:12:00.000Z",
  "updatedAt": "2026-08-14T09:00:00.000Z"
}
```

## Delete a template

`DELETE /api/v1/templates/{templateId}`

Deletes the template. QR codes created from it keep their design.

**templateId** `string` *required*

ID of the template.

```bash cURL theme={null}
curl -X DELETE "https://getqr.com/api/v1/templates/qrt_8Hs2mQvKpLd4RtYw" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 200 theme={null}
{ "id": "qrt_8Hs2mQvKpLd4RtYw", "deleted": true }
```

## Duplicate a template

`POST /api/v1/templates/{templateId}/duplicate`

Creates a copy named `<name> copy`, with its own ID and an independent design you can edit freely. Takes no request body. Answers `201 Created`.

**templateId** `string` *required*

ID of the template to copy.

```bash cURL theme={null}
curl -X POST "https://getqr.com/api/v1/templates/qrt_8Hs2mQvKpLd4RtYw/duplicate" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 201 theme={null}
{
  "id": "qrt_2Kd9pLm4Xs7BnVcQ",
  "name": "Brand blue copy",
  "designKind": "custom",
  "design": {
    "styles": {
      "dotsOptions": { "type": "rounded", "color": "#1E40AF" },
      "backgroundOptions": { "color": "#FFFFFF" }
    },
    "frameOptions": null,
    "logoOptions": null
  },
  "createdAt": "2026-08-14T09:30:00.000Z",
  "updatedAt": "2026-08-14T09:30:00.000Z"
}
```

## Common issues

> [accordion] 404 "QR template not found."
>
> The `templateId` doesn't match a template in your workspace. Take it from [List templates](#list-templates).

> [accordion] 422 when creating or updating a template
>
> A design field doesn't match the catalogs, for example an unknown dot type, frame or suggested logo. The message names the field. See [Customization](https://docs.getqr.com/api/guides/customization.md).

> [accordion] 422 art\_template\_unsupported when creating a QR code
>
> The template uses a Branded design or AI design. Apply a template with `designKind` `custom` instead.

## What's next

> [card] [Customization](https://docs.getqr.com/api/guides/customization.md)

> [card] [QR codes](https://docs.getqr.com/api/endpoints/qr-codes.md)

> [card] [Templates in the app](https://docs.getqr.com/templates/save-template.md)

> [card] [Files](https://docs.getqr.com/api/endpoints/files.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.