API v1

Developer API

Run every GreatAutomate PDF tool from your own code. Upload files, get the processed file back in the same response. No polling and nothing stored on our side.

Authentication

Every request needs an API key. Keys are issued by an administrator, start with ga_, and are included with Pro plans. Request a key with your username and intended use.

Send the key in either header:

X-API-Key: ga_your_key_here
# or
Authorization: Bearer ga_your_key_here
Keep keys secret. Call the API from your server, never from browser code or a public repository. If a key leaks, contact us and we will revoke it and issue a new one.

Quick start

Check that your key works and see your remaining allowance:

export GA_KEY=ga_your_key_here
curl -H "X-API-Key: $GA_KEY" https://greatautomate.com/api/v1/status

Merge two PDFs and save the result:

curl -X POST https://greatautomate.com/api/v1/tools/merge \
  -H "X-API-Key: $GA_KEY" \
  -F "[email protected]" \
  -F "[email protected]" \
  -o merged.pdf -D headers.txt

Service info

GET/api/v1/info

Describes the service and lists the endpoints. Does not require a key, so it is handy as a health check.

curl https://greatautomate.com/api/v1/info
{
  "service": "GreatAutomate API",
  "version": "v1",
  "docs": "https://greatautomate.com/api-docs",
  "authentication": "X-API-Key: <key>  or  Authorization: Bearer <key>",
  "endpoints": {
    "info": "GET /api/v1/info",
    "tools": "GET /api/v1/tools",
    "status": "GET /api/v1/status",
    "process": "POST /api/v1/tools/:id (multipart: files[], options=<JSON>)"
  }
}

List tools

GET/api/v1/tools

Returns every tool you can call, with the file types it accepts, how many files it takes and the options it understands. Build your integration from this list rather than hard-coding it. No key is needed for this endpoint.

curl https://greatautomate.com/api/v1/tools
{
  "tools": [
    {
      "id": "rotate",
      "name": "Rotate PDF",
      "category": "organize",
      "accept": [".pdf"],
      "minFiles": 1,
      "maxFiles": 1,
      "options": [
        { "name": "angle", "label": "Rotation", "type": "select", "default": "90",
          "choices": [{ "value": "90", "label": "90° clockwise" }, ...] }
      ]
    },
    ...
  ],
  "categories": [ ... ]
}
FieldDescription
idTool identifier used in POST /api/v1/tools/:id, for example merge, compress, rotate.
acceptAccepted file extensions.
minFiles / maxFilesHow many files the tool takes in one call.
optionsOption definitions: name, label, type, default, choices and an optional showIf condition.

Key status

GET/api/v1/status

Shows the allowance of the key you are using. Calling it does not count as a task.

curl -H "X-API-Key: $GA_KEY" https://greatautomate.com/api/v1/status
{
  "success": true,
  "timestamp": "2026-09-28T12:00:00.000Z",
  "data": {
    "key_name": "Production",
    "daily_limit": 500,
    "limit_period_days": 1,
    "used_today": 12,
    "used_in_period": 12,
    "remaining_in_period": 488,
    "remaining_today": 488,
    "next_reset_at": "2026-09-29T00:00:00.000Z"
  }
}

Process files

POST/api/v1/tools/:id

Runs a tool and returns the resulting file as the response body (Content-Disposition: attachment). Tools that produce several files return a ZIP archive.

Form fieldRequiredDescription
filesYesOne or more files. Repeat the field for each file; order is kept (important for merge).
optionsNoA JSON string with tool options, for example {"angle":"90"}. Omitted options use their defaults.
curl -X POST https://greatautomate.com/api/v1/tools/rotate \
  -H "X-API-Key: $GA_KEY" \
  -F "[email protected]" \
  -F 'options={"angle":"90"}' \
  -o rotated.pdf

Tool options

Options differ per tool. Read them from GET /api/v1/tools: send the option name as the key and one of the choices values (or a value of the given type) as the value. A few common examples:

ToolExample options
rotate{"angle":"180"}
split{"mode":"ranges","ranges":"1-3,4-6"} (returns a ZIP)
compress{"level":"recommended"}
protect{"password":"s3cret"}
watermark{"text":"CONFIDENTIAL"}

Malformed options JSON is rejected with BAD_OPTIONS; a value a tool does not accept is rejected with BAD_OPTION (or a more specific code such as BAD_PAGE_RANGE) and a message explaining what is wrong.

Response headers

Successful processing responses include these headers alongside the file:

HeaderDescription
X-GreatAutomate-Job-IdUnique ID of this task. Quote it when contacting support.
X-GreatAutomate-ToolThe tool that ran.
X-GreatAutomate-FilenameSuggested output file name, URI-encoded.
X-GreatAutomate-Duration-MsProcessing time in milliseconds.
X-GreatAutomate-MetaURI-encoded JSON with tool-specific details, such as page counts or size savings.

Errors

Errors use standard HTTP status codes and a JSON body:

{
  "error": "Authentication required",
  "message": "API key is required. Provide it via X-API-Key header or Authorization: Bearer token.",
  "code": "MISSING_API_KEY",
  "timestamp": "2026-09-28T12:00:00.000Z",
  "meta": {}
}

Branch on code; message is meant for people and may change.

StatusCodeMeaning
400NO_FILES, TOO_MANY_FILES, UNSUPPORTED_TYPE, EMPTY_FILE, BAD_OPTIONS, UPLOAD_FAILEDThe request is invalid: check the files and the options JSON.
400BAD_OPTION, BAD_PAGE_RANGE, PDF_INVALID, PDF_ENCRYPTED, TOO_MANY_PAGES and other tool-specific codesThe tool rejected an option value or the file itself; message says what to fix.
401MISSING_API_KEY, INVALID_API_KEY, INVALID_KEY_FORMATNo key, or the key is not recognised.
403KEY_EXPIRED, KEY_DISABLEDThe key exists but can no longer be used.
404UNKNOWN_TOOLNo tool with that id.
413FILE_TOO_LARGEA file exceeds the size limit.
422NO_OUTPUTThe tool ran but produced nothing, for example an empty page selection.
429RATE_LIMIT_EXCEEDEDAllowance or request rate exceeded. Wait for the reset shown in /status.
500PROCESSING_FAILED, INTERNAL_ERRORAn unexpected error occurred while processing. Retry once; if it persists, contact support with the job ID.
503TOOLS_DISABLED, TOOL_DISABLED, BUSYProcessing is paused for maintenance or the server is at capacity. Retry later with backoff.

Limits

Code examples

Rotate a PDF by 90° and save the result with the suggested file name.

curl -X POST https://greatautomate.com/api/v1/tools/rotate \
  -H "Authorization: Bearer $GA_KEY" \
  -F "[email protected]" \
  -F 'options={"angle":"90"}' \
  -OJ
import { readFile, writeFile } from 'node:fs/promises';

const form = new FormData();
form.append('files', new Blob([await readFile('scan.pdf')]), 'scan.pdf');
form.append('options', JSON.stringify({ angle: '90' }));

const res = await fetch('https://greatautomate.com/api/v1/tools/rotate', {
  method: 'POST',
  headers: { 'X-API-Key': process.env.GA_KEY },
  body: form,
});
if (!res.ok) {
  const err = await res.json();
  throw new Error(`${err.code}: ${err.message}`);
}
const name = decodeURIComponent(res.headers.get('X-GreatAutomate-Filename'));
await writeFile(name, Buffer.from(await res.arrayBuffer()));
import json, os, urllib.parse
import requests

with open("scan.pdf", "rb") as fh:
    res = requests.post(
        "https://greatautomate.com/api/v1/tools/rotate",
        headers={"X-API-Key": os.environ["GA_KEY"]},
        files=[("files", ("scan.pdf", fh, "application/pdf"))],
        data={"options": json.dumps({"angle": "90"})},
    )

if not res.ok:
    err = res.json()
    raise SystemExit(f"{err['code']}: {err['message']}")

name = urllib.parse.unquote(res.headers["X-GreatAutomate-Filename"])
with open(name, "wb") as out:
    out.write(res.content)

Need help?

Questions, higher limits or a key for your team? E-mail [email protected] or request a key. Include the X-GreatAutomate-Job-Id of any failing call.