Business API

API Quick Start

Generate your first PDF with the Sheets To Labels Business API

1. Create an API key

Open API Key Settings. A signed-in account can start a one-time 7-day trial and receives a Trial Key automatically. Business accounts can create and keep up to five active keys.

Keep the key in a server-side secret manager or environment variable. Never put it in browser JavaScript, public source code, or a mobile application bundle.

For this example, set the key in your terminal:

export SHEETS_TO_LABELS_API_KEY="sk-your-api-key"

2. Save a template

Open the Label Designer while signed in and design one label or card. Select Save Template, wait for the Cloud synced message, then copy the custom-... Template ID. You can retrieve it later from API Templates in API Key Settings.

3. Generate a PDF

The examples below send the same one-record request. layout.type: "single" makes the template dimensions the PDF page dimensions. Add more elements to records when you want a multi-page PDF with one item per page. For label sheets, use a supported preset; use manual only for stock whose exact paper, grid, margins, and gaps you know. See Choose a Print Layout for a side-by-side comparison and examples.

cURL

http_code=$(curl --silent --show-error \
  -X POST https://sheetstolabels.com/api/v1/generate-pdf \
  -H "Authorization: Bearer $SHEETS_TO_LABELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "custom-1234567890",
    "layout": { "type": "single" },
    "records": [
      {
        "variables": {
          "code": "ag193",
          "qrUrl": "https://example.com/ag193",
          "name": "Test Ambassador"
        }
      }
    ]
  }' \
  --output api-response.bin \
  --write-out "%{http_code}")

if [ "$http_code" = "200" ]; then
  mv api-response.bin card-ag193.pdf
  echo "Saved card-ag193.pdf"
else
  jq . api-response.bin
fi

JavaScript (Node.js 18+)

import { writeFile } from 'node:fs/promises';

const response = await fetch('https://sheetstolabels.com/api/v1/generate-pdf', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SHEETS_TO_LABELS_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    templateId: 'custom-1234567890',
    layout: { type: 'single' },
    records: [
      {
        variables: {
          code: 'ag193',
          qrUrl: 'https://example.com/ag193',
          name: 'Test Ambassador',
        },
      },
    ],
  }),
});

if (!response.ok) {
  const problem = await response.json();
  throw new Error(`${problem.code}: ${problem.detail}`);
}

await writeFile('card-ag193.pdf', Buffer.from(await response.arrayBuffer()));

Python

Install the Requests package first with python -m pip install requests.

import os
from pathlib import Path

import requests

response = requests.post(
    "https://sheetstolabels.com/api/v1/generate-pdf",
    headers={
        "Authorization": f"Bearer {os.environ['SHEETS_TO_LABELS_API_KEY']}",
        "Content-Type": "application/json",
    },
    json={
        "templateId": "custom-1234567890",
        "layout": {"type": "single"},
        "records": [
            {
                "variables": {
                    "code": "ag193",
                    "qrUrl": "https://example.com/ag193",
                    "name": "Test Ambassador",
                }
            }
        ],
    },
    timeout=60,
)

if not response.ok:
    problem = response.json()
    raise RuntimeError(f"{problem.get('code')}: {problem.get('detail')}")

Path("card-ag193.pdf").write_bytes(response.content)

Java (Java 17+)

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

public class GeneratePdf {
  public static void main(String[] args) throws Exception {
    String json = """
        {
          "templateId": "custom-1234567890",
          "layout": { "type": "single" },
          "records": [
            {
              "variables": {
                "code": "ag193",
                "qrUrl": "https://example.com/ag193",
                "name": "Test Ambassador"
              }
            }
          ]
        }
        """;

    HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://sheetstolabels.com/api/v1/generate-pdf"))
        .header(
            "Authorization",
            "Bearer " + System.getenv("SHEETS_TO_LABELS_API_KEY"))
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(json))
        .build();

    HttpResponse<byte[]> response = HttpClient.newHttpClient().send(
        request,
        HttpResponse.BodyHandlers.ofByteArray());

    if (response.statusCode() != 200) {
      String problem = new String(response.body(), StandardCharsets.UTF_8);
      throw new RuntimeException(problem);
    }

    Files.write(Path.of("card-ag193.pdf"), response.body());
  }
}

A successful response has HTTP status 200 and Content-Type: application/pdf. Errors use application/problem+json, so this example checks the status before naming the response as a PDF. If jq is not installed, open api-response.bin as a text file to read the error.

Every request uses the same records array. Add more records when you want one combined batch PDF. Trial Keys can complete 10 successful single-page requests and do not consume Credits. Business keys consume 1 Credit per generated PDF page and support normal production use.

4. Use the request ID when you need help

Every response includes an X-Request-Id header. Error responses also include requestId in the JSON body. Include that value when contacting technical support.