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

# Export opportunities

> Export opportunity library records under the same filters as list_opportunities, as JSONL (one record per line) or CSV (documented column order, list fields as JSON cells), with exactly the fields the read returns and nothing added.

`export_opportunities`

Export opportunity library records under the same filters as list\_opportunities, as JSONL (one record per line) or CSV (documented column order, list fields as JSON cells), with exactly the fields the read returns and nothing added. Bounded per call; continue with the returned cursor. The coverage block travels with every export so what leaves is dated and scope-stated.

<Note>Available in the deployed MCP and HTTP bundle. Confirm access and inputs with your connected catalog. Workspace scopes and enabled providers still apply.</Note>

| Access           | Behavior         |
| ---------------- | ---------------- |
| `discovery:read` | Reads saved data |

This read does not start a verification job.

## Example request

Connect through [MCP](/guides/connect-mcp), [CLI](/guides/connect-cli), or [HTTP](/guides/connect-http). Replace example identifiers with records from your workspace.

<CodeGroup>
  ```json MCP theme={null}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "export_opportunities",
      "arguments": {
        "niche": "us-probate",
        "format": "csv",
        "limit": 500
      }
    }
  }
  ```

  ```bash CLI theme={null}
  agentlinkops call export_opportunities --args '{"niche":"us-probate","format":"csv","limit":500}'
  ```

  ```bash HTTP theme={null}
  curl "$AGENTLINKOPS_API_URL/v1/commands/export_opportunities" \
    -H "Authorization: Bearer $AGENTLINKOPS_API_KEY" \
    -H 'Content-Type: application/json' \
    --data '{"niche":"us-probate","format":"csv","limit":500}'
  ```
</CodeGroup>

## Returned result

Illustrative data validated against the documented response schema. IDs and dates are examples, not a live account capture. MCP returns this data in `structuredContent` and in a text content block; generic HTTP and CLI return the JSON result directly.

<Accordion title="Full response example">
  ```json theme={null}
  {
    "schema_version": 1,
    "read_at": "2026-09-16T12:00:00.000Z",
    "freshness_basis": {
      "now": "2026-09-16T12:00:00.000Z",
      "window_days": 90,
      "aging_from_day": 60
    },
    "absence_claim": "not_supported",
    "whole_web_coverage": false,
    "absence_note": "A surface missing from this result is a surface the library did not read. Nothing here says a surface has no opportunity.",
    "coverage": [
      {
        "schema_version": 1,
        "niche": {
          "id": "us-probate",
          "label": "US probate and estate settlement"
        },
        "source_class": "owned_corpus",
        "run_id": "run_probate_2026_09_11",
        "generated_at": "2026-09-15T21:16:04.339Z",
        "scope": "2000 pages attempted and 1993 fetched across 25 named publishers, direct fetch under robots. A page absent from this list was not read or did not meet the rule.",
        "pages_read": 1993,
        "hosts_read": 25,
        "records_emitted": 722,
        "absence_claim": "not_supported",
        "whole_web_coverage": false
      }
    ],
    "format": "jsonl",
    "filters": {
      "niche": "us-probate",
      "opportunityType": null,
      "status": null,
      "routeState": null,
      "freshness": null,
      "sourceClass": null,
      "updatedSince": null
    },
    "ordering": "dates.updated_at descending, then record_id; never by authority, traffic or rel tokens",
    "limit": 500,
    "columns": null,
    "rows": 1,
    "content": "{\"schema_version\":1,\"record_id\":\"opp_us-probate_3f9c1d2a7b6e4c01\",\"status\":\"held\",\"niche\":{\"id\":\"us-probate\",\"label\":\"US probate and estate settlement\"},\"opportunity_type\":\"link_insertion\",\"type_basis\":\"heuristic\",\"subject\":{\"host\":\"guides.example.gov\",\"page_url\":\"https://guides.example.gov/legal-research-for-beginners\",\"route_url\":null,\"surface\":null},\"observed\":{\"rel_tokens\":[],\"indexing\":\"indexable\",\"cost_basis\":\"unknown\",\"audience_statement\":null,\"cited_destinations\":[{\"host\":\"www.example.org\",\"referring_pages\":5,\"publishers_linking\":3}],\"ai_citation\":null},\"contact_route\":{\"class\":\"none_observed\",\"deliverability\":\"not_checked\",\"observed_at\":null},\"eligibility\":{\"gates\":[{\"gate\":\"owned_observation\",\"verdict\":\"satisfied\",\"because\":\"corpus_crawl_run_probate_2026_09_11\",\"observed_at\":\"2026-09-11T12:51:36.033Z\"},{\"gate\":\"redistribution_safe_fields\",\"verdict\":\"agent_judgement\",\"because\":\"not_observable_by_infrastructure\",\"observed_at\":null},{\"gate\":\"route_evidence\",\"verdict\":\"satisfied\",\"because\":\"editorial_outbound_link_observed\",\"observed_at\":\"2026-09-11T12:51:36.033Z\"},{\"gate\":\"re_verified_within_window\",\"verdict\":\"satisfied\",\"because\":\"verifier_present_2026-09-15\",\"observed_at\":\"2026-09-15T09:02:11.000Z\"},{\"gate\":\"policy_screen\",\"verdict\":\"agent_judgement\",\"because\":\"not_observable_by_infrastructure\",\"observed_at\":null},{\"gate\":\"no_contact_enrichment\",\"verdict\":\"satisfied\",\"because\":\"no_contact_fields_exist\",\"observed_at\":\"2026-09-15T09:02:11.000Z\"}]},\"verification\":{\"route_state\":\"unverified\",\"listing_state\":\"present\",\"last_verified_at\":\"2026-09-15T09:02:11.000Z\",\"next_due_at\":\"2026-12-14T09:02:11.000Z\",\"window_days\":90,\"unknown_streak\":0,\"reason\":null},\"provenance\":{\"source_class\":\"owned_corpus\",\"run_id\":\"run_probate_2026_09_11\",\"seed_reason\":\"editorial_citation_share_rule_lt_0.20\",\"consent_ref\":null,\"first_seen_at\":\"2026-09-11T12:51:36.033Z\",\"last_seen_at\":\"2026-09-15T09:02:11.000Z\"},\"rights\":{\"basis\":\"owned_observation_of_public_page\",\"redistributable\":true,\"excluded_inputs_attested\":true,\"takedown_route\":\"withdraw_on_request\"},\"evidence\":[{\"observed_at\":\"2026-09-11T12:51:36.033Z\",\"observer\":\"corpus_crawl\",\"outcome\":\"fetched\",\"reason\":null,\"page_url\":\"https://guides.example.gov/legal-research-for-beginners\",\"http_status\":200,\"sha256\":null,\"complete\":true,\"run_id\":\"run_probate_2026_09_11\",\"checker_version\":null,\"rel_tokens\":[],\"anchor\":\"How to research a legal problem\"},{\"observed_at\":\"2026-09-15T09:02:11.000Z\",\"observer\":\"verifier\",\"outcome\":\"present\",\"reason\":null,\"page_url\":\"https://guides.example.gov/legal-research-for-beginners\",\"http_status\":200,\"sha256\":\"0000000000000000000000000000000000000000000000000000000000000000\",\"complete\":true,\"run_id\":null,\"checker_version\":\"verifier-2026-09-11\",\"rel_tokens\":[],\"anchor\":\"How to research a legal problem\"}],\"dates\":{\"created_at\":\"2026-09-15T09:02:11.000Z\",\"updated_at\":\"2026-09-15T09:02:11.000Z\",\"last_observed_at\":\"2026-09-15T09:02:11.000Z\"},\"withdrawal\":null,\"freshness\":\"fresh\"}\n",
    "has_more": false,
    "next_cursor": null,
    "fields_note": "Every exported record carries exactly the fields list_opportunities returns for the same filters, including read-time freshness; nothing is added and nothing is dropped."
  }
  ```
</Accordion>

## Input fields

Omit optional fields when you do not want to supply them. Null is accepted only where listed. Unknown input properties are rejected.

| Field             | Type    | Presence | Meaning and constraints                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ----------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `niche`           | string  | Optional | Niche id from the library niche table, such as us-probate. Omit to read every niche. maxLength: 64; pattern: "^\[a-z0-9-]+\$"                                                                                                                                                                                                                                                                                                                                                      |
| `opportunityType` | string  | Optional | How a link would be earned on the surface: one of the six library opportunity types. values: "directory", "resource\_page", "listicle\_or\_review", "guest\_post\_program", "link\_insertion", "ai\_citation\_source"                                                                                                                                                                                                                                                              |
| `status`          | string  | Optional | Record status: held, published or withdrawn. Records are never deleted, so withdrawn records remain readable with their reason. values: "held", "published", "withdrawn"                                                                                                                                                                                                                                                                                                           |
| `routeState`      | string  | Optional | Route verification state: verified (route page read and states the route), partial (renders client-side) or unverified (could not be read). values: "verified", "partial", "unverified"                                                                                                                                                                                                                                                                                            |
| `freshness`       | string  | Optional | Age of the last verification against the fixed 90-day window: fresh (under 60 days), aging (60 to 90 days) or stale (over 90 days or never verified). Computed at read time. values: "fresh", "aging", "stale"                                                                                                                                                                                                                                                                     |
| `sourceClass`     | string  | Optional | Provenance source class, which decides redistribution rights per class, never per row. values: "owned\_corpus", "directory\_inventory", "cc\_host\_graph\_seed", "consented\_project\_lane", "owned\_submission"                                                                                                                                                                                                                                                                   |
| `updatedSince`    | string  | Optional | ISO 8601 timestamp; only records whose dates.updated\_at is at or after this instant are returned. format: "date-time"; pattern: "^(?:(?:\d\d\[2468]\[048]\|\d\d\[13579]\[26]\|\d\d0\[48]\|\[02468]\[048]00\|\[13579]\[26]00)-02-29\|\d\{4}-(?:(?:0\[13578]\|1\[02])-(?:0\[1-9]\|\[12]\d\|3\[01])\|(?:0\[469]\|11)-(?:0\[1-9]\|\[12]\d\|30)\|(?:02)-(?:0\[1-9]\|1\d\|2\[0-8])))T(?:(?:\[01]\d\|2\[0-3]):\[0-5]\d:\[0-5]\d(?:\\.\d+)?(?:Z\|([+-](?:\[01]\d\|2\[0-3]):\[0-5]\d)))\$" |
| `format`          | string  | Required | jsonl returns one JSON record per line; csv returns the same records flattened to the documented column order. values: "jsonl", "csv"                                                                                                                                                                                                                                                                                                                                              |
| `cursor`          | string  | Optional | Opaque continuation returned by this same listing with the same filters; omit for the first page. minLength: 1; maxLength: 1024                                                                                                                                                                                                                                                                                                                                                    |
| `limit`           | integer | Optional | Maximum records in this export call, 1 to 1000; defaults to 500. Continue with the returned cursor for the rest. minimum: 1; maximum: 1000; default: 500                                                                                                                                                                                                                                                                                                                           |

### Validation and omitted values

The export carries exactly the fields list\_opportunities returns for the same filters, including read-time freshness; nothing is added and nothing is dropped.

jsonl is one JSON record per line. csv uses the documented columns in order, one per dotted record path; rel\_tokens, cited\_destinations, ai\_citation, gates, evidence and withdrawal are one JSON-encoded cell each so a row round-trips exactly.

Bounded to 1000 records per call; follow next\_cursor with the same filters for the rest. The coverage block travels with every call so what leaves is dated and scope-stated.

What you export is yours to keep; the library adds no lock-in.

### Defaults when omitted

| Field   | Default |
| ------- | ------- |
| `limit` | `500`   |

## Output fields

Fields inside optional or nullable parents apply only when that parent exists. [Common schema conventions](/reference/schemas) explain evidence states, empty lists and extensions.

* **`schema_version`** (number, required): must equal 1
* **`read_at`** (string, required): UTC timestamp the read used for freshness.
* **`freshness_basis`** (object, required).
* **`absence_claim`** (string, required): not\_supported: missing dataset rows cannot prove link absence. must equal "not\_supported"
* **`whole_web_coverage`** (boolean, required): False: these results do not measure the whole web. must equal false
* **`absence_note`** (string, required): Plain statement that a surface missing from this result was not read; it is never evidence that no opportunity exists.
* **`coverage`** (array, required): Dataset scope and completeness, including limits on what these results establish.
* **`format`** (string, required): values: "jsonl", "csv"
* **`filters`** (object, required).
* **`ordering`** (string, required): How the page is ordered: by update time then record id, never by authority, traffic or rel tokens.
* **`limit`** (number, required).
* **`columns`** (array / null, required).
* **`rows`** (number, required): Records in this export call, bounded by limit; continue with next\_cursor.
* **`content`** (string, required): The exported text: one JSON record per line for jsonl, or header plus one row per record for csv.
* **`has_more`** (boolean, required): True when another page is available.
* **`next_cursor`** (string / null, required): Opaque continuation for the same listing; null means no further page.
* **`fields_note`** (string, required): Statement that the export carries exactly the fields the read returns for the same filters.

<Accordion title="All fields and nested objects">
  | Field                            | Type          | Presence | Meaning and constraints                                                                                                                                                                                                                                                                                                                                                         |
  | -------------------------------- | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `schema_version`                 | number        | Required | must equal 1                                                                                                                                                                                                                                                                                                                                                                    |
  | `read_at`                        | string        | Required | UTC timestamp the read used for freshness.                                                                                                                                                                                                                                                                                                                                      |
  | `freshness_basis`                | object        | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `freshness_basis.now`            | string        | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `freshness_basis.window_days`    | number        | Required | must equal 90                                                                                                                                                                                                                                                                                                                                                                   |
  | `freshness_basis.aging_from_day` | number        | Required | must equal 60                                                                                                                                                                                                                                                                                                                                                                   |
  | `absence_claim`                  | string        | Required | not\_supported: missing dataset rows cannot prove link absence. must equal "not\_supported"                                                                                                                                                                                                                                                                                     |
  | `whole_web_coverage`             | boolean       | Required | False: these results do not measure the whole web. must equal false                                                                                                                                                                                                                                                                                                             |
  | `absence_note`                   | string        | Required | Plain statement that a surface missing from this result was not read; it is never evidence that no opportunity exists.                                                                                                                                                                                                                                                          |
  | `coverage`                       | array         | Required | Dataset scope and completeness, including limits on what these results establish.                                                                                                                                                                                                                                                                                               |
  | `coverage[].schema_version`      | number        | Required | must equal 1                                                                                                                                                                                                                                                                                                                                                                    |
  | `coverage[].niche`               | object        | Required | additional fields rejected                                                                                                                                                                                                                                                                                                                                                      |
  | `coverage[].niche.id`            | string        | Required | Resource identifier returned by the operation. maxLength: 64; pattern: "^\[a-z0-9-]+\$"                                                                                                                                                                                                                                                                                         |
  | `coverage[].niche.label`         | string        | Required | maxLength: 120                                                                                                                                                                                                                                                                                                                                                                  |
  | `coverage[].source_class`        | string        | Required | values: "owned\_corpus", "directory\_inventory", "cc\_host\_graph\_seed", "consented\_project\_lane", "owned\_submission"                                                                                                                                                                                                                                                       |
  | `coverage[].run_id`              | string / null | Required | Identifier returned by the related operation.                                                                                                                                                                                                                                                                                                                                   |
  | `coverage[].generated_at`        | string        | Required | format: "date-time"; pattern: "^(?:(?:\d\d\[2468]\[048]\|\d\d\[13579]\[26]\|\d\d0\[48]\|\[02468]\[048]00\|\[13579]\[26]00)-02-29\|\d\{4}-(?:(?:0\[13578]\|1\[02])-(?:0\[1-9]\|\[12]\d\|3\[01])\|(?:0\[469]\|11)-(?:0\[1-9]\|\[12]\d\|30)\|(?:02)-(?:0\[1-9]\|1\d\|2\[0-8])))T(?:(?:\[01]\d\|2\[0-3]):\[0-5]\d:\[0-5]\d(?:\\.\d+)?(?:Z\|([+-](?:\[01]\d\|2\[0-3]):\[0-5]\d)))\$" |
  | `coverage[].scope`               | string        | Required | maxLength: 600                                                                                                                                                                                                                                                                                                                                                                  |
  | `coverage[].pages_read`          | integer       | Required | minimum: 0; maximum: 9007199254740991                                                                                                                                                                                                                                                                                                                                           |
  | `coverage[].hosts_read`          | integer       | Required | minimum: 0; maximum: 9007199254740991                                                                                                                                                                                                                                                                                                                                           |
  | `coverage[].records_emitted`     | integer       | Required | minimum: 0; maximum: 9007199254740991                                                                                                                                                                                                                                                                                                                                           |
  | `coverage[].absence_claim`       | string        | Required | not\_supported: missing dataset rows cannot prove link absence. must equal "not\_supported"                                                                                                                                                                                                                                                                                     |
  | `coverage[].whole_web_coverage`  | boolean       | Required | False: these results do not measure the whole web. must equal false                                                                                                                                                                                                                                                                                                             |
  | `format`                         | string        | Required | values: "jsonl", "csv"                                                                                                                                                                                                                                                                                                                                                          |
  | `filters`                        | object        | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `filters.niche`                  | string / null | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `filters.opportunityType`        | string / null | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `filters.status`                 | string / null | Required | Resource lifecycle status.                                                                                                                                                                                                                                                                                                                                                      |
  | `filters.routeState`             | string / null | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `filters.freshness`              | string / null | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `filters.sourceClass`            | string / null | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `filters.updatedSince`           | string / null | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `ordering`                       | string        | Required | How the page is ordered: by update time then record id, never by authority, traffic or rel tokens.                                                                                                                                                                                                                                                                              |
  | `limit`                          | number        | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `columns`                        | array / null  | Required |                                                                                                                                                                                                                                                                                                                                                                                 |
  | `rows`                           | number        | Required | Records in this export call, bounded by limit; continue with next\_cursor.                                                                                                                                                                                                                                                                                                      |
  | `content`                        | string        | Required | The exported text: one JSON record per line for jsonl, or header plus one row per record for csv.                                                                                                                                                                                                                                                                               |
  | `has_more`                       | boolean       | Required | True when another page is available.                                                                                                                                                                                                                                                                                                                                            |
  | `next_cursor`                    | string / null | Required | Opaque continuation for the same listing; null means no further page.                                                                                                                                                                                                                                                                                                           |
  | `fields_note`                    | string        | Required | Statement that the export carries exactly the fields the read returns for the same filters.                                                                                                                                                                                                                                                                                     |
</Accordion>

[Download input schema](/schemas/export_opportunities.input.json) · [Download output schema](/schemas/export_opportunities.output.json)

## Errors and retries

The command is annotated idempotent. Reuse an accepted idempotency key when the input provides one; changing the payload under a reused key can conflict.

See [error recovery](/reference/errors) for status, scope, cooldown, cursor and retry handling. Unknown observations are result data and do not establish loss.

## HTTP resource routes

These existing resource routes share the operation’s domain behavior. Their parameter placement, status and response envelope can differ from generic invocation. See [HTTP route details](/reference/http/routes).

| Method and route                       | Success | Details                                                                                                                                       |
| -------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /v1/library/opportunities/export` | 200     | Remaining read arguments go in query parameters. The answer is the same JSON envelope as the command; the exported text is its content field. |

## Continue

[list\_opportunities](/reference/commands/list_opportunities)

Follow the [related workflow](/guides/import-and-verify), inspect [capability status](/capability-status), or return to the [command index](/reference/index).
