← scrollify.io

API Reference

Scrollify's API lets you list, create, and download exports, and create scheduled captures, programmatically. This is what internal teams — compliance, audit, QA, marketing ops — use to archive pages on a repeatable, automated basis instead of clicking through the UI. See archiving pages for compliance for the workflow this is built for. The API uses Bearer token authentication via an API key you generate in your account settings.

API access requires a Pro plan or higher. Free and Starter accounts can upgrade from Settings → API Access.

Authentication

All requests must include your API key as a Bearer token in the Authorization header.

Authorization: Bearer <your-api-key>

Generate a key in Settings → API Access. Each user has one active key at a time. Rotating generates a new key and invalidates the old one immediately. If your plan drops below Pro, the key stops working immediately (it does not need to be revoked separately).

Scopes

A key carries one or more scopes, controlling what it can do:

ScopeGrants
exports:readList and get exports, download outputs.
captures:writeCreate a one-off export job, and create/list/enable/disable/delete scheduled captures.

Keys generated from Settings → API Access currently receive both scopes by default. Pass {"scopes": ["exports:read"]} in the generation request body for a read-only key.

Base URL

https://scrollify.io

Endpoints

GET /api/v1/exports

List all exports for the authenticated user. Returns the same shape as the in-app library.

Response

{
  "object": "list",
  "data": [
    {
      "jobId": "01JXXXXXXXXXXXXXXXXXXXXXXX",
      "url": "https://example.com/page",
      "status": "ready",
      "createdAt": "2026-06-17T10:00:00.000Z",
      "outputs": [
        {
          "outputId": "01JXXXXXXXXXXXXXXXXXXXXXXX",
          "format": "mp4",
          "status": "ready",
          "downloadUrl": "/api/v1/outputs/01JXXX.../download"
        }
      ]
    }
  ]
}
GET /api/v1/exports/:jobId

Get a single export by its jobId (ULID).

Response

Same shape as a single element from the list above. Returns 404 if not found or not owned by the key holder.

POST /api/v1/exports

Requires captures:write. Create a new capture job — the same pipeline the browser UI uses. Runs immediately.

Request body

{
  "url": "https://example.com/disclosures",
  "outputs": ["mp4"],
  "viewportWidth": 1280
}

Example

curl -X POST https://scrollify.io/api/v1/exports \
  -H "Authorization: Bearer <key>" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/disclosures","outputs":["mp4"]}'

Returns 201 with the created job (poll GET /api/v1/exports/:jobId for status). Returns 400 on an invalid payload.

Scheduled captures

Requires captures:write. Lets an internal team set up a recurring dated archive of a URL without a browser session — the primitive behind compliance page archiving.

GET /api/v1/schedules

List scheduled captures for the key owner.

POST /api/v1/schedules

Example

curl -X POST https://scrollify.io/api/v1/schedules \
  -H "Authorization: Bearer <key>" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/disclosures","interval_minutes":10080,"outputs":["mp4"]}'

See GET /api/v1/schedules/intervals for valid interval_minutes values (e.g. weekly = 10080). Plan limits on active schedule count apply the same as in the UI.

PATCH /api/v1/schedules/:uuid/enabled

Body: {"enabled": true|false}.

DELETE /api/v1/schedules/:uuid

Downloading outputs

Each output object includes a downloadUrl field when status is "ready". Append the base URL and request it with the same Authorization header — the server streams the file with a Content-Disposition: attachment header.

curl -H "Authorization: Bearer <key>" \
  https://scrollify.io/api/v1/outputs/<outputId>/download \
  -o my-export.mp4

Note: Download counts are tracked for each output. View counts are tracked when a share link is viewed.

Rate limits

EndpointLimitWindow
GET /api/v1/exports60 requests60 seconds
GET /api/v1/exports/:jobId120 requests60 seconds
POST /api/v1/exports10 requests60 seconds
GET /api/v1/schedules60 requests60 seconds
POST /api/v1/schedules, PATCH, DELETE20 requests60 seconds
GET /api/v1/outputs/:id/download72 requests60 seconds

Exceeding a limit returns 429 Too Many Requests.

Error responses

{ "error": "Human-readable error message" }
StatusMeaning
401Missing, invalid, or revoked API key
403Key holder's plan no longer includes API access (below Pro), or the key is missing the required scope
404Export not found or not owned by key holder
429Rate limit exceeded
500Unexpected server error