> ## Documentation Index
> Fetch the complete documentation index at: https://docs.inkrelay.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Quickstart

> Print your first PDF in under 10 minutes.

This guide takes you from a new account to a printed page. You will create a test key, print to a virtual test printer, then install the agent and print to a real printer with a live key.

<Steps>
  <Step title="Create an account and a test key">
    Sign in at [app.inkrelay.app](https://app.inkrelay.app/login) with your email. We send a one time code, no password needed. Open API keys, create a key with Test mode on and the print scope, and copy it. It is shown once. Keys that start with `pe_` from before the rename keep working.

    ```bash theme={null}
    export INKRELAY_API_KEY="ir_test_your_key"
    ```
  </Step>

  <Step title="Check the key">
    Call `whoami` to confirm the key works and see which organization and mode it belongs to.

    ```bash theme={null}
    curl https://api.inkrelay.app/v1/whoami \
      -H "Authorization: Bearer $INKRELAY_API_KEY"
    ```
  </Step>

  <Step title="List printers">
    Test keys see the four virtual printers on InkRelay Test Computer. Copy the `id` of "Test A4 Laser".

    ```bash theme={null}
    curl https://api.inkrelay.app/v1/printers \
      -H "Authorization: Bearer $INKRELAY_API_KEY"
    ```
  </Step>

  <Step title="Print">
    Send a PDF by URL. The job walks from `queued` to `done` in about 3 seconds.

    ```bash theme={null}
    curl https://api.inkrelay.app/v1/printjobs \
      -H "Authorization: Bearer $INKRELAY_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"printerId":"PRINTER_ID","title":"Hello","contentType":"pdf_uri","content":"https://inkrelay.app/sample.pdf"}'
    ```

    Or use an SDK, which also waits for the job to finish:

    <CodeGroup>
      ```ts TypeScript theme={null}
      import { InkRelay } from "@inkrelay/sdk";

      const ir = new InkRelay({ apiKey: process.env.INKRELAY_API_KEY });
      const printerId = "PRINTER_ID";
      const url = "https://inkrelay.app/sample.pdf";

      const job = await ir.printJobs.createAndWait({ printerId, title: "Hello", contentType: "pdf_uri", content: url });
      console.log(job.state);
      ```

      ```python Python theme={null}
      from inkrelay import InkRelay

      ir = InkRelay()  # reads INKRELAY_API_KEY
      printer_id = "PRINTER_ID"
      url = "https://inkrelay.app/sample.pdf"

      job = ir.print_jobs.create_and_wait({"printerId": printer_id, "title": "Hello", "contentType": "pdf_uri", "content": url})
      print(job["state"])
      ```
    </CodeGroup>
  </Step>

  <Step title="Go live with a real printer">
    [Install the agent](/install-agent) on a computer that has a printer, approve it in the dashboard and mark the printer live. Then create a key without Test mode (it starts with `ir_live_`), list printers again and repeat the print call with the real printer id.
  </Step>
</Steps>

## Next steps

* Read [Printing PDFs](/guides/printing-pdfs) for the job fields, limits and states.
* Subscribe to [webhooks](/guides/webhooks) instead of polling.
* Learn how [test mode](/guides/test-mode) behaves so your tests match production.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.