Start here

Quickstart

From an API key to a printed ticket, in one request.

This gets one ticket out of one printer. It assumes a connector is already enrolled and a printer assigned. If you are starting from a cardboard box, do the field runbook first.

1. Get an API key

In the dashboard, open Access → API Keys and create one. The key is shown once, at creation. Store it as a secret in your backend; it is never needed in a browser.

2. Find the printer's id

Every device you print to has a stable id. Take it from the printer's page in the dashboard, or list them:

curl https://raven-api.formfl.be/printers \
  -H "Authorization: ApiKey $RAVEN_KEY"

3. Print

POST /printers/{printerId}/print
curl -X POST https://raven-api.formfl.be/printers/{printerId}/print \
  -H "Authorization: ApiKey $RAVEN_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "<ticket><c><bold>HELLO</bold></c><br/><p>It works.</p><cut/></ticket>",
    "idempotencyKey": "quickstart-1"
  }'

You get a 202 Accepted back:

202 Accepted
{
  "id": "8f1c…",
  "status": "Routed",
  "acceptedAt": "2026-08-02T09:14:22Z",
  "expiresAt": "2026-08-03T09:14:22Z",
  "monitorUrl": "https://raven-api.formfl.be/devices/{printerId}/interactions/8f1c…",
  "attemptCount": 0,
  "createdAt": "2026-08-02T09:14:22Z"
}

202 means accepted, not printed. Raven took ownership of the job and will deliver it, including waiting if the venue happens to be offline right now. What actually happened to the paper is a separate question, and it has its own answer.

4. Find out what happened

Poll the monitorUrl from the response:

curl https://raven-api.formfl.be/devices/{printerId}/interactions/{interactionId} \
  -H "Authorization: ApiKey $RAVEN_KEY"

Wait for a terminal status. For a printer the good ones are PrintConfirmed (the printer positively confirmed it) and SentUnconfirmed (the bytes were delivered but the model cannot confirm: honest, not a failure). The full set, and what to do about each, is on Printing a ticket.

Next