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

# Fetch structured output

> _Released: August 2026_

[**Fetch**](/pages/documentation/endpoints/fetch/overview) can now return typed JSON from a known URL on the same `/fetch` call.

Pass a JSON Schema in `schema` and the response keeps the existing markdown while adding `data`. Optional `instructions` steer extraction for rules the schema cannot express. Default **Fetch** is unchanged: URL in, markdown out.

### What's new

* `schema` — JSON Schema of `type` `"object"`. Turns structured output on. Field `description`s tell the model what to look for.
* `instructions` — optional. Requires `schema`. Maximum 4,000 characters.
* `data` — present in the response only when `schema` is set. Fields with no grounded value are omitted, even if marked `required`.
* Same call otherwise: `mode`, `renderJs`, raw content, and images are independent.

**Fetch** still reads this URL only. It does not follow links. For many rows from a listing page, use [**Extract**](/pages/documentation/endpoints/extract/overview). Search structured output stays on `structuredOutputSchema`.

### How to use

<CodeGroup>
  ```shell curl theme={"system"}
  curl -X POST "https://api.linkup.so/v1/fetch" \
    -H "Authorization: Bearer $LINKUP_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "url": "https://www.linkup.so/careers",
      "schema": {
        "type": "object",
        "properties": {
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "position": {
                  "type": "string",
                  "description": "The job title or position"
                },
                "city": {
                  "type": "string",
                  "description": "The city where the job is located"
                }
              }
            }
          }
        }
      },
      "instructions": "If a position is listed in multiple cities, emit one jobs item per city so jobs[].city is a single city."
    }'
  ```

  ```python python theme={"system"}
  from linkup import LinkupClient

  client = LinkupClient(api_key="<YOUR_LINKUP_API_KEY>")

  response = client.fetch(
      url="https://www.linkup.so/careers",
      schema={
          "type": "object",
          "properties": {
              "jobs": {
                  "type": "array",
                  "items": {
                      "type": "object",
                      "properties": {
                          "position": {
                              "type": "string",
                              "description": "The job title or position",
                          },
                          "city": {
                              "type": "string",
                              "description": "The city where the job is located",
                          },
                      },
                  },
              }
          },
      },
      instructions="If a position is listed in multiple cities, emit one jobs item per city so jobs[].city is a single city.",
  )
  print(response.data)
  ```

  ```js js theme={"system"}
  import { LinkupClient } from 'linkup-sdk';

  const client = new LinkupClient({ apiKey: '<YOUR_LINKUP_API_KEY>' });

  const response = await client.fetch({
    url: 'https://www.linkup.so/careers',
    schema: {
      type: 'object',
      properties: {
        jobs: {
          type: 'array',
          items: {
            type: 'object',
            properties: {
              position: {
                type: 'string',
                description: 'The job title or position',
              },
              city: {
                type: 'string',
                description: 'The city where the job is located',
              },
            },
          },
        },
      },
    },
    instructions:
      'If a position is listed in multiple cities, emit one jobs item per city so jobs[].city is a single city.',
  });
  console.log(response.data);
  ```
</CodeGroup>

<Info>
  If your current SDK release does not accept `schema` or `instructions`, send
  the same JSON body to `POST /v1/fetch`.
</Info>

### Pricing

Adding a `schema` adds a flat **\$0.001** on top of any combination of `mode` and `renderJs`.

| `mode`       | `renderJs` | Markdown only    | With `schema`    |
| ------------ | ---------- | ---------------- | ---------------- |
| `"standard"` | `false`    | \$0.001 per call | \$0.002 per call |
| `"standard"` | `true`     | \$0.005 per call | \$0.006 per call |
| `"pro"`      | `false`    | \$0.005 per call | \$0.006 per call |
| `"pro"`      | `true`     | \$0.01 per call  | \$0.011 per call |

For schema design, missing-field behavior, and when to use **Fetch** versus **Extract** or **Search**, see [Fetch best practices](/pages/documentation/endpoints/fetch/best-practices).
