kagi extract
Extract the readable content of a web page as markdown using Kagi's Extract API.
Synopsis
kagi extract <URL> [--format markdown|json|compact]
kagi extract --filterDescription
The kagi extract command sends one HTTPS URL to Kagi's v1 Extract API and prints the extracted page markdown to stdout by default. It is useful when a search result, article, or documentation page needs full-page text instead of a search snippet.
The command uses JSON mode internally because that is the stable envelope returned by the API, then prints the first page's markdown field. Use --format json or --format compact to print the full response envelope, including retained link metadata when Kagi returns it. If Kagi returns no page markdown, the CLI reports the Extract API error details and trace id when available.
Use --filter for pipelines that already have one URL per line. Filter mode ignores the single-URL markdown default and prints one compact JSON record per input line in the same order. Successful records include the Extract API response under response. Failed records include an error envelope on stdout and the command exits nonzero after all inputs are processed.
Authentication
Required: KAGI_API_KEY
Extract is part of Kagi's current /api/v1 paid API surface, uses Bearer auth, and consumes API credit per request.
Arguments
<URL> (Required)
The HTTPS URL of the page to extract.
kagi extract "https://example.com/article"Only https:// URLs with a valid host are accepted.
Omit <URL> when using --filter.
--filter
Read one URL per stdin line and print JSONL records.
kagi search "rust release notes" --template '{{url}}' | kagi extract --filter--format <FORMAT>
Output format. Default: markdown.
Supported values:
markdown- print the first page's markdown content onlyjson- print the full Extract API response envelopecompact- print the full response envelope as compact JSON
Output
The command prints markdown directly:
# Article title
Extracted page content...With --format json, the command prints the full response envelope:
{
"meta": {
"trace": "trace-1",
"node": "test",
"ms": 12
},
"data": [
{
"url": "https://example.com/article",
"markdown": "# Article title\n\nExtracted page content...",
"links": [
{
"text": "Source",
"url": "https://example.com/"
}
]
}
]
}With --filter, stdout is JSONL:
{"url":"https://example.com/article","ok":true,"response":{"meta":{"trace":"trace-1","node":"test","ms":12},"data":[{"url":"https://example.com/article","markdown":"# Article title\n\nExtracted page content...","links":[]}]}}
{"url":"http://example.com/bad","ok":false,"error":{"code":"configuration_error","category":"configuration","retryable":false,"message":"configuration error: extract URL must use the https scheme","suggested_commands":[],"docs_url":"https://kagi.micr.dev/reference/error-reference"}}Examples
Save an Article
kagi extract "https://example.com/article" > article.mdPipe into Another Tool
kagi extract "https://example.com/article" | sed -n '1,80p'Inspect Retained Links
kagi extract "https://example.com/article" --format json | jq '.data[0].links'Extract Search Results
kagi search "rust async cancellation" --template '{{url}}' | kagi extract --filter > pages.jsonlExit Codes
| Code | Meaning |
|---|---|
| 0 | Success - markdown extracted, or every --filter input produced an ok: true record |
| 1 | Error - see stderr; --filter may still have written per-input records to stdout |
Common errors:
- Missing API key
- Non-HTTPS or invalid URL
- Insufficient API credit
- Kagi returns no extractable content
- Network error