Orshot Logo
OrshotDocs

POST: Bulk Create Studio Templates

Create multiple studio templates at once via CSV or JSON

Enterprise Only

This is an Enterprise only private endpoint. Checkout the Enterprise Pricing to get access.

Create multiple studio templates in a single API call. This endpoint is ideal for importing templates in bulk from external systems or migrating existing template libraries.

For detailed information about the template data structure, see Anatomy of a Template.

Endpoint

https://api.orshot.com/v1/studio/templates/bulk-create

Request

await fetch("https://api.orshot.com/v1/studio/templates/bulk-create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer <ORSHOT_API_KEY>",
  },
  body: JSON.stringify({
    templates: [
      {
        name: "Instagram Post - Square",
        description: "1:1 aspect ratio for Instagram feed",
        canvas_width: 1080,
        canvas_height: 1080
      },
      {
        name: "Instagram Story",
        description: "9:16 aspect ratio for Instagram stories",
        canvas_width: 1080,
        canvas_height: 1920
      },
      {
        name: "Facebook Cover",
        description: "Facebook page cover photo",
        canvas_width: 820,
        canvas_height: 312
      },
      {
        name: "Twitter Header",
        description: "Twitter profile header image",
        canvas_width: 1500,
        canvas_height: 500
      },
      {
        name: "LinkedIn Banner",
        description: "LinkedIn company page banner",
        canvas_width: 1128,
        canvas_height: 191
      }
    ]
  }),
});
{
  "success": true,
  "created": 5,
  "failed": 0,
  "templates": [
    {
      "id": 12345,
      "name": "Instagram Post - Square",
      "canvas_width": 1080,
      "canvas_height": 1080
    },
    {
      "id": 12346,
      "name": "Instagram Story",
      "canvas_width": 1080,
      "canvas_height": 1920
    },
    {
      "id": 12347,
      "name": "Facebook Cover",
      "canvas_width": 820,
      "canvas_height": 312
    },
    {
      "id": 12348,
      "name": "Twitter Header",
      "canvas_width": 1500,
      "canvas_height": 500
    },
    {
      "id": 12349,
      "name": "LinkedIn Banner",
      "canvas_width": 1128,
      "canvas_height": 191
    }
  ]
}
{
  "success": true,
  "created": 3,
  "failed": 2,
  "templates": [
    {
      "id": 12345,
      "name": "Valid Template 1",
      "canvas_width": 1080,
      "canvas_height": 1080
    },
    {
      "id": 12346,
      "name": "Valid Template 2",
      "canvas_width": 1200,
      "canvas_height": 628
    },
    {
      "id": 12347,
      "name": "Valid Template 3",
      "canvas_width": 800,
      "canvas_height": 600
    }
  ],
  "errors": [
    {
      "index": 3,
      "name": "Invalid Template",
      "errors": ["'canvas_width' must be between 1 and 8192"]
    },
    {
      "index": 4,
      "name": "Another Invalid",
      "errors": ["'name' is required and must be a string"]
    }
  ]
}

Rate Limits

LimitValue
Requests per minute30
Max templates per request50

Request Body Parameters

ParameterTypeRequiredDescription
templatesArrayYesArray of template objects to create

Template Object Structure

Each template in the templates array should include:

FieldTypeRequiredDescription
nameStringYesName of the template (max 255 characters)
descriptionStringNoDescription of the template
canvas_widthIntegerYesWidth of the canvas in pixels (1-5000)
canvas_heightIntegerYesHeight of the canvas in pixels (1-5000)
pages_dataArrayNoArray of page objects with elements
thumbnail_urlStringNoURL to a thumbnail image

Response Fields

FieldTypeDescription
successBooleanWhether the operation completed (may be partial success)
createdIntegerNumber of templates successfully created
failedIntegerNumber of templates that failed validation
templatesArrayArray of successfully created template summaries
errorsArrayArray of error objects for failed templates (only if any failed)

Error Object Structure

FieldTypeDescription
indexIntegerIndex of the failed template in the original array
nameStringName of the template that failed
errorsArrayList of validation error messages

Bulk Import with Pages Data

You can also include full page structures with elements for each template:

await fetch("https://api.orshot.com/v1/studio/templates/bulk-create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Bearer <ORSHOT_API_KEY>",
  },
  body: JSON.stringify({
    templates: [
      {
        name: "Product Card A",
        canvas_width: 800,
        canvas_height: 600,
        pages_data: [
          {
            id: "page-uuid-1",
            name: "Page 1",
            canvas: { width: 800, height: 600, backgroundColor: "#f5f5f5" },
            elements: [
              {
                id: "title-1",
                type: "text",
                x: 50,
                y: 50,
                width: 700,
                height: 60,
                content: "Product Title",
                parameterId: "title",
                parameterizable: true,
              },
            ],
          },
        ],
      },
      {
        name: "Product Card B",
        canvas_width: 800,
        canvas_height: 600,
        pages_data: [
          {
            id: "page-uuid-2",
            name: "Page 1",
            canvas: { width: 800, height: 600, backgroundColor: "#ffffff" },
            elements: [
              {
                id: "title-2",
                type: "text",
                x: 50,
                y: 50,
                width: 700,
                height: 60,
                content: "Product Title",
                parameterId: "title",
                parameterizable: true,
              },
            ],
          },
        ],
      },
    ],
  }),
});

Error Responses

Status CodeErrorDescription
400Validation failedtemplates array is missing, empty, or exceeds 50 items
400All templates failed validationEvery template in the array had validation errors
403Access ForbiddenInvalid or missing API key
429Rate limit exceededToo many requests (max 30/min)
500Internal server errorServer-side error

Best Practices

  1. Batch Size: While the limit is 50 templates per request, we recommend batches of 20-30 for optimal performance
  2. Validation: Validate your data client-side before sending to avoid partial failures
  3. Error Handling: Always check both created and failed counts in the response
  4. Idempotency: This endpoint creates new templates each time - there's no upsert functionality
  5. Pages Data: If importing templates with complex structures, ensure pages_data follows the Orshot Studio format

On this page