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

# Quickstart

> Parse a document, extract fields from it, and read both results.

This guide takes you from an API key to your first results: you parse a sample bank statement, extract two fields from it, and read both results.

**1. Get an API key**

Create a key in the [Pulse dashboard](https://platform.runpulse.com) under **API Keys**, as [Authentication](https://docs.runpulse.com/v2/authentication.md) describes. Then set it as an environment variable, so the examples below can read it:

```bash theme={null}
export PULSE_API_KEY="your-api-key"
```

**2. Install an SDK**

Install the Python or TypeScript SDK. To call the API with cURL instead, skip this step.

```bash Python theme={null}
pip install pulse-ai
```

```bash TypeScript theme={null}
npm install @pulse-software/sdk
```

The SDKs send your key and the `Pulse-Version: 2` header on every request. With cURL, you send both headers yourself.

**3. Parse a document**

This request parses the sample statement from its URL and waits for the parse to finish. `config.model` is the only option you must send.

```python Python theme={null}
import os
from pulse import Pulse

client = Pulse(api_key=os.environ["PULSE_API_KEY"])

job = client.parse.run(
    file_url="https://platform.runpulse.com/api/examples/637e5678-30b1-45fa-acc4-877f2d636419/pdf",
    config={"model": "ultra-2"},
)
parse_id = job.parse_id
```

```typescript TypeScript theme={null}
import { PulseClient } from "@pulse-software/sdk";

const client = new PulseClient({ apiKey: process.env.PULSE_API_KEY! });

const { parseId } = await client.parse.run({
  fileUrl: "https://platform.runpulse.com/api/examples/637e5678-30b1-45fa-acc4-877f2d636419/pdf",
  config: { model: "ultra-2" },
});
```

```bash cURL theme={null}
curl -X POST https://api.runpulse.com/parse \
  -H "x-api-key: $PULSE_API_KEY" \
  -H "Pulse-Version: 2" \
  -H "Content-Type: application/json" \
  -d '{
    "file_url": "https://platform.runpulse.com/api/examples/637e5678-30b1-45fa-acc4-877f2d636419/pdf",
    "config": {"model": "ultra-2"}
  }'
```

The response names the parse. It doesn't hold the content: you read that from the parse's result route in the last step.

```json theme={null}
{
  "parse_id": "parse-3f6c2a9e-8d4b-4c1a-9e0f-5b7d2c8a1e64",
  "created_at": "2026-10-29T17:02:11.482913Z",
  "completed_at": "2026-10-29T17:02:19.105377Z"
}
```

To send a file from disk instead of a URL, send it as `file`: see [Files and limits](https://docs.runpulse.com/v2/files.md). For long documents, send `async: true` to get the `parse_id` right away, then poll the job: see [Jobs and results](https://docs.runpulse.com/v2/jobs.md).

**4. Extract fields**

This request sends the `parse_id` to Extract with a JSON Schema of the two fields you want. It waits for the extraction to finish and returns its `extract_id`.

```python Python theme={null}
job = client.extract.run(
    parse_id=parse_id,
    config={
        "input_schema": {
            "type": "object",
            "properties": {
                "account_holder": {"type": "string"},
                "closing_balance": {"type": "number"},
            },
        }
    },
)
extract_id = job.extract_id
```

```typescript TypeScript theme={null}
const { extractId } = await client.extract.run({
  parseId,
  config: {
    inputSchema: {
      type: "object",
      properties: {
        account_holder: { type: "string" },
        closing_balance: { type: "number" },
      },
    },
  },
});
```

```bash cURL theme={null}
PARSE_ID=parse-3f6c2a9e-8d4b-4c1a-9e0f-5b7d2c8a1e64  # the parse_id from the previous step

curl -X POST https://api.runpulse.com/extract \
  -H "x-api-key: $PULSE_API_KEY" \
  -H "Pulse-Version: 2" \
  -H "Content-Type: application/json" \
  --data @- <<EOF
{
  "parse_id": "$PARSE_ID",
  "config": {
    "input_schema": {
      "type": "object",
      "properties": {
        "account_holder": {"type": "string"},
        "closing_balance": {"type": "number"}
      }
    }
  }
}
EOF
```

**5. Read the results**

This code reads the extraction's values, then the parse's Markdown.

```python Python theme={null}
extraction = client.extract.get_result(extract_id)
print(extraction.extraction.enriched)

parse = client.parse.get_result(parse_id)
print(parse.markdown[:500])
```

```typescript TypeScript theme={null}
const extraction = await client.extract.getResult({ extractId });
console.log(extraction.extraction.enriched);

const parse = await client.parse.getResult({ parseId });
console.log(parse.markdown.slice(0, 500));
```

```bash cURL theme={null}
EXTRACT_ID=extract-…  # the extract_id from the previous step

curl https://api.runpulse.com/extract/$EXTRACT_ID/result \
  -H "x-api-key: $PULSE_API_KEY" \
  -H "Pulse-Version: 2"

curl https://api.runpulse.com/parse/$PARSE_ID/result \
  -H "x-api-key: $PULSE_API_KEY" \
  -H "Pulse-Version: 2"
```

In the extraction, each field comes back as `{value, citation, confidence}`. The `citation` names the parse elements the value was read from.

In the parse, `markdown` is the document in reading order. `elements` holds the same content as text blocks, tables and figures, each with an `id`, a `page` and its position on the page. See [Elements and bounding boxes](https://docs.runpulse.com/v2/elements.md).

> [!NOTE]
>
> Some organizations delete each result the first time it's read. There, finish every step on a parse before you read the parse's result, as this guide does, or run them together in a [pipeline](https://docs.runpulse.com/v2/pipelines.md).

The parse costs 1 credit per page, and the extraction 1 credit per page it reads. See [Pricing](https://docs.runpulse.com/v2/pricing.md) for every step.

## Next steps

> [card] [Parse](https://docs.runpulse.com/v2/parse.md)
>
> Add figures, refine passes, spreadsheet options, footnotes and chunks.

> [card] [Extract](https://docs.runpulse.com/v2/extract.md)
>
> Write schemas, read citations, and choose the effort level.

> [card] [Jobs and results](https://docs.runpulse.com/v2/jobs.md)
>
> Run jobs async, poll their status, and learn how long results are kept.

> [card] [Pipelines](https://docs.runpulse.com/v2/pipelines.md)
>
> Parse a document and run several steps on it in one call.


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