# Linkup

> Search the web built for AI: get ranked results, a written answer with sources, or named fields filled from the web. Read any page or PDF as clean text, pull fields out of it, and run deep research or batches of searches in the background.

App · AI Search & Memory · 13 actions. Web page: https://docs.lodol.com/docs/integrations/linkup

## Actions

### Answer a question

Ask a question and get a written answer from the web, with the pages it came from. When nothing relevant is found the step still succeeds, with 'found_answer' false.

**Inputs**

- Question (`query`, text, required): What to look for, written as you would ask a person. A full question works better than keywords.
- Search depth (`depth`, text): How hard to look. Fast suits one specific fact; Deep chains several searches together for harder questions and takes up to 30 seconds. One of: `fast` (Fast (recommended)), `flash` (Flash (quickest)), `standard`, `deep` (Deep (slowest, most thorough)). Default: `fast`.
- Cite sources in the text (`include_inline_citations`, true/false): Put numbered source references inside the answer. Default: `false`.
- Most results (`max_results`, number): The most pages to use. Leave empty to let Linkup decide. At least 1.
- Only these sites (`include_domains`, list): Search only these sites, up to 100. Write each like example.com; a pasted address works too.
- Never these sites (`exclude_domains`, list): Leave these sites out of the search. Write each like example.com.
- Published after (`from_date`, date): Only use pages published on or after this day.
- Published before (`to_date`, date): Only use pages published on or before this day.

**Outputs**

- `answer` (text): The written answer.
- `found_answer` (true/false): Whether an answer was found.
- `query` (text): The question.
- `source_count` (number): How many sources there are.
- `sources` (list): The pages the answer drew on.

**Example output**

```json
{
  "answer": "Linkup was founded in 2024 by ...",
  "found_answer": true,
  "query": "Who founded Linkup?",
  "source_count": 1,
  "sources": [
    {
      "favicon": null,
      "name": "About Linkup",
      "snippet": "Linkup was founded in 2024...",
      "url": "https://www.linkup.so/about"
    }
  ]
}
```

### Check a task

See whether a background task has finished, and read its result once it has: search results, an answer, or a page's text.

**Inputs**

- Task (`task_id`, text, required): The task's id, as given back by a 'Start a batch' step.

**Outputs**

- `answer` (text): A finished answer search's answer.
- `created_at` (text): When the task was queued.
- `data` (object): Structured fields, when asked for.
- `error` (text): Why the task failed, if it did.
- `is_finished` (true/false): Whether the task has completed or failed.
- `markdown` (text): A finished page read's text.
- `output` (object): Linkup's full result, unchanged.
- `query` (text): The search question, for a search task.
- `results` (list): A finished search's results.
- `sources` (list): The pages an answer drew on.
- `status` (text): pending, processing, completed or failed.
- `succeeded` (true/false): Whether the task completed with a result.
- `task_id` (text): Linkup's id for the task. Hand it to 'Check a task'.
- `type` (text): search, fetch or research.
- `updated_at` (text): When the task last changed.
- `url` (text): The page address, for a page-read task.

**Example output**

```json
{
  "answer": "Linkup was founded in 2024 by ...",
  "created_at": "2026-09-21T10:00:00.000Z",
  "data": null,
  "error": null,
  "is_finished": true,
  "markdown": null,
  "output": {
    "answer": "Linkup was founded in 2024 by ..."
  },
  "query": "Who founded Linkup?",
  "results": [],
  "sources": [
    {
      "favicon": null,
      "name": "About Linkup",
      "snippet": "Linkup was founded in 2024...",
      "url": "https://www.linkup.so/about"
    }
  ],
  "status": "completed",
  "succeeded": true,
  "task_id": "tsk_8f2c1a",
  "type": "search",
  "updated_at": "2026-09-21T10:00:00.000Z",
  "url": null
}
```

### Check research

See whether a research job has finished, and read its report or fields once it has.

**Inputs**

- Research job (`research_id`, text, required): The job's id, as given back by 'Start research'.

**Outputs**

- `answer` (text): The written report, once finished (answer format).
- `created_at` (text): When the job was started.
- `data` (object): The named fields, once finished, when fields were asked for.
- `error` (text): Why the job failed, if it did.
- `is_finished` (true/false): Whether the job has completed or failed.
- `query` (text): The question that was researched.
- `research_id` (text): Linkup's id for the job. Hand it to 'Check research'.
- `sources` (list): The pages the report drew on.
- `status` (text): pending, processing, completed or failed.
- `succeeded` (true/false): Whether the job completed with a result.
- `updated_at` (text): When the job last changed.

**Example output**

```json
{
  "answer": "Three shifts stand out...",
  "created_at": "2026-09-21T10:00:00.000Z",
  "data": null,
  "error": null,
  "is_finished": true,
  "query": "How is the European web-search API market changing?",
  "research_id": "res_4b1d9e",
  "sources": [
    {
      "favicon": null,
      "name": "About Linkup",
      "snippet": "Linkup was founded in 2024...",
      "url": "https://www.linkup.so/about"
    }
  ],
  "status": "completed",
  "succeeded": true,
  "updated_at": "2026-09-21T10:05:12.000Z"
}
```

### Check your Linkup credit

See how much credit is left on the Linkup account, in US dollars. Free to call, so it also makes a good first step for checking the connection works.

**Inputs**: None.

**Outputs**

- `balance` (number): Credit left, in US dollars.
- `has_credit` (true/false): Whether any credit is left.

**Example output**

```json
{
  "balance": 18.42,
  "has_credit": true
}
```

### Extract data from a page

Read one web page or PDF and pull out the fields you name, such as a price, a job title or a contact email. A field that is not on the page is left out rather than guessed.

**Inputs**

- Page address (`url`, text, required): The address of the page or PDF to read.
- Fields to fill (`fields`, list): The pieces of information you want back, one per entry. Add what each means after a colon to steer it: 'price: the list price in US dollars'.
- JSON Schema (advanced) (`json_schema`, text): Instead of 'Fields to fill', paste a JSON Schema whose root is an object, for numbers, lists or nested fields. When set, it is used and 'Fields to fill' is ignored.
- Instructions (`instructions`, text): Rules the fields cannot express, such as 'prices in US dollars'. Up to 4,000 characters.
- Run JavaScript (`render_js`, true/false): Let the page's scripts run before reading it. Needed for pages that fill themselves in after they load; slower and costs a little more. Default: `false`.
- Read mode (`mode`, text): Pro succeeds far more often on pages that are hard to read, and costs more. Try Standard first. One of: `standard`, `pro` (Pro (for pages that are hard to read)). Default: `standard`.

**Outputs**

- `data` (object): The fields found, by the names asked for.
- `favicon` (text): The site's icon.
- `found_fields` (list): The names of the fields that were found.
- `markdown` (text): The page's content as Markdown.
- `url` (text): The page read.

**Example output**

```json
{
  "data": {
    "starter price": "$19"
  },
  "favicon": null,
  "found_fields": [
    "starter price"
  ],
  "markdown": "# Pricing\n\nStarter is $19 a month...",
  "url": "https://example.com/pricing"
}
```

### List research

List the research jobs on the account, newest first.

**Inputs**

- Page (`page`, number): Which page of the list to return, starting at 1. At least 1. Default: `1`.
- Per page (`page_size`, number): How many to return, up to 100. From 1 to 100. Default: `10`.
- Sort by (`sort_by`, text): Which date to sort on. One of: `createdAt` (When it was started), `updatedAt` (When it last changed). Default: `createdAt`.
- Order (`order`, text): Newest or oldest first. One of: `desc` (Newest first), `asc` (Oldest first). Default: `desc`.

**Outputs**

- `count` (number): How many are on this page.
- `page` (number): This page's number.
- `page_size` (number): Entries per page.
- `research` (list): The jobs.
- `total` (number): How many there are in all.
- `total_pages` (number): How many pages there are.

**Example output**

```json
{
  "count": 1,
  "page": 1,
  "page_size": 10,
  "research": [
    {
      "answer": "Three shifts stand out...",
      "created_at": "2026-09-21T10:00:00.000Z",
      "data": null,
      "error": null,
      "is_finished": true,
      "query": "How is the European web-search API market changing?",
      "research_id": "res_4b1d9e",
      "sources": [
        {
          "favicon": null,
          "name": "About Linkup",
          "snippet": "Linkup was founded in 2024...",
          "url": "https://www.linkup.so/about"
        }
      ],
      "status": "completed",
      "succeeded": true,
      "updated_at": "2026-09-21T10:05:12.000Z"
    }
  ],
  "total": 1,
  "total_pages": 1
}
```

### List tasks

List background tasks, newest first, and see how many are running against the account's limit.

**Inputs**

- Kinds (`types`, list): Only these kinds of task. Leave empty for all. One or more of: `search` (Searches), `fetch` (Page reads), `research`.
- States (`statuses`, list): Only tasks in these states. Leave empty for all. One or more of: `pending` (Waiting to start), `processing` (Running), `completed` (Finished), `failed`.
- Page (`page`, number): Which page of the list to return, starting at 1. At least 1. Default: `1`.
- Per page (`page_size`, number): How many to return, up to 100. From 1 to 100. Default: `10`.
- Sort by (`sort_by`, text): Which date to sort on. One of: `createdAt` (When it was started), `updatedAt` (When it last changed). Default: `createdAt`.
- Order (`order`, text): Newest or oldest first. One of: `desc` (Newest first), `asc` (Oldest first). Default: `desc`.

**Outputs**

- `count` (number): How many are on this page.
- `in_flight` (number): Tasks waiting or running right now.
- `in_flight_limit` (number): The most that may wait or run at once.
- `page` (number): This page's number.
- `page_size` (number): Entries per page.
- `tasks` (list): The tasks.
- `total` (number): How many there are in all.
- `total_pages` (number): How many pages there are.

**Example output**

```json
{
  "count": 1,
  "in_flight": 1,
  "in_flight_limit": 100,
  "page": 1,
  "page_size": 10,
  "tasks": [
    {
      "created_at": "2026-09-21T10:00:00.000Z",
      "error": null,
      "is_finished": false,
      "query": "Who founded Linkup?",
      "status": "pending",
      "task_id": "tsk_8f2c1a",
      "type": "search",
      "updated_at": "2026-09-21T10:00:00.000Z",
      "url": null
    }
  ],
  "total": 1,
  "total_pages": 1
}
```

### Read a page

Read one web page or PDF and get its content as clean text (Markdown), ready for an AI step. Reads only that address; it does not follow links.

**Inputs**

- Page address (`url`, text, required): The address of the page or PDF to read.
- Run JavaScript (`render_js`, true/false): Let the page's scripts run before reading it. Needed for pages that fill themselves in after they load; slower and costs a little more. Default: `false`.
- Read mode (`mode`, text): Pro succeeds far more often on pages that are hard to read, and costs more. Try Standard first. One of: `standard`, `pro` (Pro (for pages that are hard to read)). Default: `standard`.
- List the images (`extract_images`, true/false): Also return every image on the page. Slower. Default: `false`.
- Include the raw source (`include_raw_content`, true/false): Also return the page's original source (HTML, or the PDF's text). Default: `false`.

**Outputs**

- `content_type` (text): The source's type, such as text/html.
- `favicon` (text): The site's icon.
- `images` (list): The page's images, when asked for.
- `markdown` (text): The page's content as Markdown.
- `raw_content` (text): The original source, when asked for.
- `url` (text): The page read.

**Example output**

```json
{
  "content_type": null,
  "favicon": null,
  "images": [],
  "markdown": "# Pricing\n\nStarter is $19 a month...",
  "raw_content": null,
  "url": "https://example.com/pricing"
}
```

### Search for structured data

Search the web and get the answer back as named fields, ready for a spreadsheet row or a CRM record. Name the fields you want; no schema writing needed.

**Inputs**

- Question (`query`, text, required): What to look for, written as you would ask a person. A full question works better than keywords.
- Fields to fill (`fields`, list): The pieces of information you want back, one per entry. Add what each means after a colon to steer it: 'price: the list price in US dollars'.
- JSON Schema (advanced) (`json_schema`, text): Instead of 'Fields to fill', paste a JSON Schema whose root is an object, for numbers, lists or nested fields. When set, it is used and 'Fields to fill' is ignored.
- Include sources (`include_sources`, true/false): Also return the pages the fields were taken from. Default: `false`.
- Search depth (`depth`, text): How hard to look. Fast suits one specific fact; Deep chains several searches together for harder questions and takes up to 30 seconds. One of: `fast` (Fast (recommended)), `flash` (Flash (quickest)), `standard`, `deep` (Deep (slowest, most thorough)). Default: `fast`.
- Most results (`max_results`, number): The most pages to use. Leave empty to let Linkup decide. At least 1.
- Only these sites (`include_domains`, list): Search only these sites, up to 100. Write each like example.com; a pasted address works too.
- Never these sites (`exclude_domains`, list): Leave these sites out of the search. Write each like example.com.
- Published after (`from_date`, date): Only use pages published on or after this day.
- Published before (`to_date`, date): Only use pages published on or before this day.

**Outputs**

- `data` (object): The fields, by the names asked for.
- `found_data` (true/false): Whether any field was filled.
- `query` (text): What was searched.
- `sources` (list): The pages used, when 'Include sources' is on.

**Example output**

```json
{
  "data": {
    "ceo": "Jane Doe",
    "headquarters city": "Paris"
  },
  "found_data": true,
  "query": "Acme Corp company facts",
  "sources": []
}
```

### Search the web

Search the web and get back the most relevant pages, each with the passage that answers the question. Finding nothing is not an error: the step returns an empty list.

**Inputs**

- Question (`query`, text, required): What to look for, written as you would ask a person. A full question works better than keywords.
- Search depth (`depth`, text): How hard to look. Fast suits one specific fact; Deep chains several searches together for harder questions and takes up to 30 seconds. One of: `fast` (Fast (recommended)), `flash` (Flash (quickest)), `standard`, `deep` (Deep (slowest, most thorough)). Default: `fast`.
- Most results (`max_results`, number): The most pages to use. Leave empty to let Linkup decide. At least 1.
- Only these sites (`include_domains`, list): Search only these sites, up to 100. Write each like example.com; a pasted address works too.
- Never these sites (`exclude_domains`, list): Leave these sites out of the search. Write each like example.com.
- Published after (`from_date`, date): Only use pages published on or after this day.
- Published before (`to_date`, date): Only use pages published on or before this day.
- Include images (`include_images`, true/false): Also return matching images. Default: `false`.

**Outputs**

- `query` (text): What was searched.
- `result_count` (number): How many results came back.
- `results` (list): The matching pages and images.
- `urls` (list): The page addresses, ready to read.

**Example output**

```json
{
  "query": "Who founded Linkup?",
  "result_count": 1,
  "results": [
    {
      "content": "Linkup was founded in 2024...",
      "favicon": null,
      "name": "About Linkup",
      "type": "text",
      "url": "https://www.linkup.so/about"
    }
  ],
  "urls": [
    "https://www.linkup.so/about"
  ]
}
```

### Start a batch of page reads

Queue up to 100 pages to read in the background. Follow with a Wait step and 'Check a task' for each id returned.

**Inputs**

- Page addresses (`urls`, list, required): The pages to read, one per entry.
- Run JavaScript (`render_js`, true/false): Let the page's scripts run before reading it. Needed for pages that fill themselves in after they load; slower and costs a little more. Default: `false`.
- Read mode (`mode`, text): Pro succeeds far more often on pages that are hard to read, and costs more. Try Standard first. One of: `standard`, `pro` (Pro (for pages that are hard to read)). Default: `standard`.
- List the images (`extract_images`, true/false): Also return every image on the page. Slower. Default: `false`.
- Include the raw source (`include_raw_content`, true/false): Also return the page's original source (HTML, or the PDF's text). Default: `false`.

**Outputs**

- `first_task_id` (text): The first task's id, handy for a single check.
- `task_count` (number): How many were queued.
- `task_ids` (list): Every task's id, in the order they were asked for.
- `tasks` (list): One entry per queued task, in order.

**Example output**

```json
{
  "first_task_id": "tsk_8f2c1a",
  "task_count": 1,
  "task_ids": [
    "tsk_8f2c1a"
  ],
  "tasks": [
    {
      "created_at": "2026-09-21T10:00:00.000Z",
      "error": null,
      "is_finished": false,
      "query": null,
      "status": "pending",
      "task_id": "tsk_8f2c1a",
      "type": "fetch",
      "updated_at": "2026-09-21T10:00:00.000Z",
      "url": "https://example.com"
    }
  ]
}
```

### Start a batch of searches

Queue up to 100 searches to run in the background, billed as ordinary searches. Follow with a Wait step and 'Check a task' for each id returned.

**Inputs**

- Questions (`queries`, list, required): The searches to run, one per entry.
- Bring back (`output`, text): What each search should return. One of: `searchResults` (Search results), `sourcedAnswer` (A written answer with sources). Default: `searchResults`.
- Search depth (`depth`, text): How hard to look. Fast suits one specific fact; Deep chains several searches together for harder questions and takes up to 30 seconds. One of: `fast` (Fast (recommended)), `flash` (Flash (quickest)), `standard`, `deep` (Deep (slowest, most thorough)). Default: `fast`.
- Most results (`max_results`, number): The most pages to use. Leave empty to let Linkup decide. At least 1.
- Only these sites (`include_domains`, list): Search only these sites, up to 100. Write each like example.com; a pasted address works too.
- Never these sites (`exclude_domains`, list): Leave these sites out of the search. Write each like example.com.
- Published after (`from_date`, date): Only use pages published on or after this day.
- Published before (`to_date`, date): Only use pages published on or before this day.

**Outputs**

- `first_task_id` (text): The first task's id, handy for a single check.
- `task_count` (number): How many were queued.
- `task_ids` (list): Every task's id, in the order they were asked for.
- `tasks` (list): One entry per queued task, in order.

**Example output**

```json
{
  "first_task_id": "tsk_8f2c1a",
  "task_count": 1,
  "task_ids": [
    "tsk_8f2c1a"
  ],
  "tasks": [
    {
      "created_at": "2026-09-21T10:00:00.000Z",
      "error": null,
      "is_finished": false,
      "query": "Who founded Linkup?",
      "status": "pending",
      "task_id": "tsk_8f2c1a",
      "type": "search",
      "updated_at": "2026-09-21T10:00:00.000Z",
      "url": null
    }
  ]
}
```

### Start research

Start a deep research job: Linkup searches, reads and cross-checks many sources and writes a report. It takes 2 to 20 minutes and runs in the background, so follow this with a Wait step and 'Check research'. Costs $0.25 to $2.50 by size.

**Inputs**

- Question (`query`, text, required): What to look for, written as you would ask a person. A full question works better than keywords.
- Size (`reasoning_depth`, text): How long Linkup may work on it. Bigger is more thorough, slower and dearer. One of: `S` (Small: 2-5 minutes, $0.25), `M` (Medium: 3-7 minutes, $0.50), `L` (Large: 5-10 minutes, $1.50), `XL` (Extra large: 10-20 minutes, $2.50). Default: `M`.
- Kind of report (`mode`, text): What to produce. Linkup can pick from the question. One of: `auto` (Let Linkup decide), `answer` (A precise answer), `investigate` (A focused report on one subject), `research` (A broad report across many topics). Default: `auto`.
- Fields to fill (`fields`, list): Leave empty for a written report. Name fields here to get them back as data instead, adding what each means after a colon.
- JSON Schema (advanced) (`json_schema`, text): Instead of 'Fields to fill', paste a JSON Schema whose root is an object, for numbers, lists or nested fields. When set, it is used and 'Fields to fill' is ignored.
- Only these sites (`include_domains`, list): Search only these sites, up to 100. Write each like example.com; a pasted address works too.
- Never these sites (`exclude_domains`, list): Leave these sites out of the search. Write each like example.com.
- Published after (`from_date`, date): Only use pages published on or after this day.
- Published before (`to_date`, date): Only use pages published on or before this day.

**Outputs**

- `answer` (text): The written report, once finished (answer format).
- `created_at` (text): When the job was started.
- `data` (object): The named fields, once finished, when fields were asked for.
- `error` (text): Why the job failed, if it did.
- `is_finished` (true/false): Whether the job has completed or failed.
- `query` (text): The question that was researched.
- `research_id` (text): Linkup's id for the job. Hand it to 'Check research'.
- `sources` (list): The pages the report drew on.
- `status` (text): pending, processing, completed or failed.
- `succeeded` (true/false): Whether the job completed with a result.
- `updated_at` (text): When the job last changed.

**Example output**

```json
{
  "answer": null,
  "created_at": "2026-09-21T10:00:00.000Z",
  "data": null,
  "error": null,
  "is_finished": false,
  "query": "How is the European web-search API market changing?",
  "research_id": "res_4b1d9e",
  "sources": [],
  "status": "pending",
  "succeeded": false,
  "updated_at": "2026-09-21T10:05:12.000Z"
}
```
