# web.pkgforge.dev

> Open web access for agents: one host per service, each one HTTP API with its own documents. Every service is free to every caller: no key, no account, no quota, no rate limit.

This document is built on each request from the services' own deployed documents and the health clock's latest reading, and keeps no copy of either. It is Markdown; a browser gets the same text as HTML. Start with a service's `SKILL.md`: when to use it, how, its provenance headers and its failure states.

## Exact addresses

| what | address |
| --- | --- |
| this document | https://web.pkgforge.dev/ (also https://web.pkgforge.dev/index.md) |
| agent index | https://web.pkgforge.dev/llms.txt |
| every service's full documents in one file | https://web.pkgforge.dev/llms-full.txt |
| live status, Markdown (HTML for a browser) | https://web.pkgforge.dev/status |
| live status, JSON | https://web.pkgforge.dev/status.json |

## Services

| service | what it gives | documents |
| --- | --- | --- |
| https://fetch.web.pkgforge.dev | A transparent HTTP proxy: GET https://fetch.web.pkgforge.dev/<url> answers with the origin's status, headers and body, streamed, through Cloudflare's own transports first. | [llms.txt](https://fetch.web.pkgforge.dev/llms.txt) · [llms-full.txt](https://fetch.web.pkgforge.dev/llms-full.txt) · [SKILL.md](https://fetch.web.pkgforge.dev/SKILL.md) · [openapi.json](https://fetch.web.pkgforge.dev/openapi.json) |
| https://search.web.pkgforge.dev | A search gateway: one query goes to one upstream provider chosen by tier, mode and health, and the answer is one normalised results[] with provenance. | [llms.txt](https://search.web.pkgforge.dev/llms.txt) · [llms-full.txt](https://search.web.pkgforge.dev/llms-full.txt) · [SKILL.md](https://search.web.pkgforge.dev/SKILL.md) · [openapi.json](https://search.web.pkgforge.dev/openapi.json) |
| https://read.web.pkgforge.dev | A page's main content as Markdown: GET https://read.web.pkgforge.dev/<url> answers with the origin's own Markdown, else this service's extraction of its HTML, else a provider's rewrite, each named in provenance. | [llms.txt](https://read.web.pkgforge.dev/llms.txt) · [llms-full.txt](https://read.web.pkgforge.dev/llms-full.txt) · [SKILL.md](https://read.web.pkgforge.dev/SKILL.md) · [openapi.json](https://read.web.pkgforge.dev/openapi.json) |
| https://research.web.pkgforge.dev | A scholarly works broker: a paper search and a lookup of one work by DOI, arXiv id, PMID, PMCID or OpenAlex id, each answered as one normalised works[] with provenance. | [llms.txt](https://research.web.pkgforge.dev/llms.txt) · [llms-full.txt](https://research.web.pkgforge.dev/llms-full.txt) · [SKILL.md](https://research.web.pkgforge.dev/SKILL.md) · [openapi.json](https://research.web.pkgforge.dev/openapi.json) |
| https://crawl.web.pkgforge.dev | Multi-page crawls as jobs: POST https://crawl.web.pkgforge.dev/crawl submits one to a provider, GET /crawl/<job_id> polls it and answers its pages as Markdown. | [llms.txt](https://crawl.web.pkgforge.dev/llms.txt) · [llms-full.txt](https://crawl.web.pkgforge.dev/llms-full.txt) · [SKILL.md](https://crawl.web.pkgforge.dev/SKILL.md) · [openapi.json](https://crawl.web.pkgforge.dev/openapi.json) |
| https://archive.web.pkgforge.dev | A web archive broker: the captures of a URL across the Wayback Machine, Arquivo.pt and Common Crawl, the capture closest to an instant, one capture's archived body, and a save through Save Page Now. | [llms.txt](https://archive.web.pkgforge.dev/llms.txt) · [llms-full.txt](https://archive.web.pkgforge.dev/llms-full.txt) · [SKILL.md](https://archive.web.pkgforge.dev/SKILL.md) · [openapi.json](https://archive.web.pkgforge.dev/openapi.json) |

## Status

Overall: **ok**, as the health clock last read it (2026-10-20T11:30:26.836Z). Providers, quota and requests: https://web.pkgforge.dev/status.

| service | state | checked (UTC) | /healthz | 24 h | 7 d |
| --- | --- | --- | --- | --- | --- |
| https://fetch.web.pkgforge.dev | ok | 2026-10-20 11:30:26Z | 200 · 352 ms | 23 of 23 · 100.00 % · since 2026-10-20 07:50Z | 23 of 23 · since 2026-10-20 07:50Z |
| https://search.web.pkgforge.dev | ok | 2026-10-20 11:30:26Z | 200 · 352 ms | 23 of 23 · 100.00 % · since 2026-10-20 07:50Z | 23 of 23 · since 2026-10-20 07:50Z |
| https://read.web.pkgforge.dev | ok | 2026-10-20 11:30:26Z | 200 · 352 ms | 23 of 23 · 100.00 % · since 2026-10-20 07:50Z | 23 of 23 · since 2026-10-20 07:50Z |
| https://research.web.pkgforge.dev | ok | 2026-10-20 11:30:26Z | 200 · 352 ms | 23 of 23 · 100.00 % · since 2026-10-20 07:50Z | 23 of 23 · since 2026-10-20 07:50Z |
| https://crawl.web.pkgforge.dev | ok | 2026-10-20 11:30:26Z | 200 · 352 ms | 23 of 23 · 100.00 % · since 2026-10-20 07:50Z | 23 of 23 · since 2026-10-20 07:50Z |
| https://archive.web.pkgforge.dev | ok | 2026-10-20 11:30:26Z | 200 · 352 ms | 23 of 23 · 100.00 % · since 2026-10-20 07:50Z | 23 of 23 · since 2026-10-20 07:50Z |

## fetch.web.pkgforge.dev

> A transparent HTTP proxy: GET https://fetch.web.pkgforge.dev/<url> answers with the origin's status, headers and body, streamed, through Cloudflare's own transports first.

Host: `fetch.web.pkgforge.dev`. Worker: `web-fetch`. State: built.

Cost: free to every caller; no key, no account, no quota, no rate limit (never gated).

CORS: the root documents and `/` carry `access-control-allow-origin: *`; a proxied answer carries the origin's own CORS headers, unchanged.

Every service and its live status: https://web.pkgforge.dev/

### Routes

- [GET /healthz](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1healthz/get): service state and the running Worker version
- [GET /__health](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1__health/get): uptime, corpus revision, transports with capabilities and readiness, broker adapters
- [GET /__config](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1__config/get): resolved config, control prefix, override headers, unready transports
- [GET /__corpus](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1__corpus/get): corpus revision, refreshedAt, profile ids
- [POST /__refresh](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1__refresh/post): run the corpus refresh now; RefreshResult {changed, revision, kvPuts, ...}; GET answers 405
- [GET /{target+}](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1%7Btarget%7D/get): GET an origin URL, path form
- [GET /](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1/get): GET an origin URL, ?url= form
- [POST /{target+}](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1%7Btarget%7D/post): POST an origin URL, path form
- [POST /](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1/post): POST an origin URL, ?url= form
- [PUT /{target+}](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1%7Btarget%7D/put): PUT an origin URL, path form
- [PUT /](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1/put): PUT an origin URL, ?url= form
- [PATCH /{target+}](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1%7Btarget%7D/patch): PATCH an origin URL, path form
- [PATCH /](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1/patch): PATCH an origin URL, ?url= form
- [DELETE /{target+}](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1%7Btarget%7D/delete): DELETE an origin URL, path form
- [DELETE /](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1/delete): DELETE an origin URL, ?url= form
- [OPTIONS /{target+}](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1%7Btarget%7D/options): OPTIONS an origin URL, path form
- [OPTIONS /](https://fetch.web.pkgforge.dev/openapi.json#/paths/~1/options): OPTIONS an origin URL, ?url= form
- [GET /llms.txt](https://fetch.web.pkgforge.dev/llms.txt): llmstxt.org index of this service
- [GET /llms-full.txt](https://fetch.web.pkgforge.dev/llms-full.txt): every route with parameters, answers and examples inline
- [GET /openapi.json](https://fetch.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [GET /SKILL.md](https://fetch.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

### Docs

- [llms-full.txt](https://fetch.web.pkgforge.dev/llms-full.txt): every route with its parameters, answers and examples inline
- [openapi.json](https://fetch.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [SKILL.md](https://fetch.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

## search.web.pkgforge.dev

> A search gateway: one query goes to one upstream provider chosen by tier, mode and health, and the answer is one normalised results[] with provenance.

Host: `search.web.pkgforge.dev`. Worker: `web-search`. State: built.

Cost: free to every caller; no key, no account, no quota, no rate limit (never gated).

CORS: every answer carries `access-control-allow-origin: *` and exposes the provenance headers; OPTIONS on a listed path is the preflight (204); no credentials.

Every service and its live status: https://web.pkgforge.dev/

### Routes

- [GET /healthz](https://search.web.pkgforge.dev/openapi.json#/paths/~1healthz/get): service state and the running Worker version
- [GET /](https://search.web.pkgforge.dev/openapi.json#/paths/~1/get): the index of this service
- [GET /search](https://search.web.pkgforge.dev/openapi.json#/paths/~1search/get): web search, brokered to one upstream provider
- [POST /search](https://search.web.pkgforge.dev/openapi.json#/paths/~1search/post): web search with a JSON body
- [GET /llms.txt](https://search.web.pkgforge.dev/llms.txt): llmstxt.org index of this service
- [GET /llms-full.txt](https://search.web.pkgforge.dev/llms-full.txt): every route with parameters, answers and examples inline
- [GET /openapi.json](https://search.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [GET /SKILL.md](https://search.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

### Docs

- [llms-full.txt](https://search.web.pkgforge.dev/llms-full.txt): every route with its parameters, answers and examples inline
- [openapi.json](https://search.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [SKILL.md](https://search.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

## read.web.pkgforge.dev

> A page's main content as Markdown: GET https://read.web.pkgforge.dev/<url> answers with the origin's own Markdown, else this service's extraction of its HTML, else a provider's rewrite, each named in provenance.

Host: `read.web.pkgforge.dev`. Worker: `web-read`. State: built.

Cost: free to every caller; no key, no account, no quota, no rate limit (never gated).

CORS: every answer carries `access-control-allow-origin: *` and exposes the provenance headers; OPTIONS on a listed path is the preflight (204); no credentials.

Every service and its live status: https://web.pkgforge.dev/

### Routes

- [GET /healthz](https://read.web.pkgforge.dev/openapi.json#/paths/~1healthz/get): service state and the running Worker version
- [GET /{target+}](https://read.web.pkgforge.dev/openapi.json#/paths/~1%7Btarget%7D/get): a page as Markdown, path form
- [GET /](https://read.web.pkgforge.dev/openapi.json#/paths/~1/get): a page as Markdown, ?url= form
- [GET /llms.txt](https://read.web.pkgforge.dev/llms.txt): llmstxt.org index of this service
- [GET /llms-full.txt](https://read.web.pkgforge.dev/llms-full.txt): every route with parameters, answers and examples inline
- [GET /openapi.json](https://read.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [GET /SKILL.md](https://read.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

### Docs

- [llms-full.txt](https://read.web.pkgforge.dev/llms-full.txt): every route with its parameters, answers and examples inline
- [openapi.json](https://read.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [SKILL.md](https://read.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

## research.web.pkgforge.dev

> A scholarly works broker: a paper search and a lookup of one work by DOI, arXiv id, PMID, PMCID or OpenAlex id, each answered as one normalised works[] with provenance.

Host: `research.web.pkgforge.dev`. Worker: `web-research`. State: built.

Cost: free to every caller; no key, no account, no quota, no rate limit (never gated).

CORS: every answer carries `access-control-allow-origin: *` and exposes the provenance headers; OPTIONS on a listed path is the preflight (204); no credentials.

Every service and its live status: https://web.pkgforge.dev/

### Routes

- [GET /healthz](https://research.web.pkgforge.dev/openapi.json#/paths/~1healthz/get): service state and the running Worker version
- [GET /](https://research.web.pkgforge.dev/openapi.json#/paths/~1/get): the index of this service
- [GET /works](https://research.web.pkgforge.dev/openapi.json#/paths/~1works/get): search scholarly works
- [GET /works/{id+}](https://research.web.pkgforge.dev/openapi.json#/paths/~1works~1%7Bid%7D/get): one work by DOI, arXiv id, PMID, PMCID or OpenAlex id
- [GET /llms.txt](https://research.web.pkgforge.dev/llms.txt): llmstxt.org index of this service
- [GET /llms-full.txt](https://research.web.pkgforge.dev/llms-full.txt): every route with parameters, answers and examples inline
- [GET /openapi.json](https://research.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [GET /SKILL.md](https://research.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

### Docs

- [llms-full.txt](https://research.web.pkgforge.dev/llms-full.txt): every route with its parameters, answers and examples inline
- [openapi.json](https://research.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [SKILL.md](https://research.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

## crawl.web.pkgforge.dev

> Multi-page crawls as jobs: POST https://crawl.web.pkgforge.dev/crawl submits one to a provider, GET /crawl/<job_id> polls it and answers its pages as Markdown.

Host: `crawl.web.pkgforge.dev`. Worker: `web-crawl`. State: built.

Cost: free to every caller; no key, no account, no quota, no rate limit (never gated).

CORS: every answer carries `access-control-allow-origin: *` and exposes the provenance headers; OPTIONS on a listed path is the preflight (204); no credentials.

Every service and its live status: https://web.pkgforge.dev/

### Routes

- [GET /healthz](https://crawl.web.pkgforge.dev/openapi.json#/paths/~1healthz/get): service state and the running Worker version
- [GET /](https://crawl.web.pkgforge.dev/openapi.json#/paths/~1/get): the index of this service
- [POST /crawl](https://crawl.web.pkgforge.dev/openapi.json#/paths/~1crawl/post): submit a crawl job
- [GET /crawl/{job_id}](https://crawl.web.pkgforge.dev/openapi.json#/paths/~1crawl~1%7Bjob_id%7D/get): poll a crawl job
- [GET /llms.txt](https://crawl.web.pkgforge.dev/llms.txt): llmstxt.org index of this service
- [GET /llms-full.txt](https://crawl.web.pkgforge.dev/llms-full.txt): every route with parameters, answers and examples inline
- [GET /openapi.json](https://crawl.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [GET /SKILL.md](https://crawl.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

### Docs

- [llms-full.txt](https://crawl.web.pkgforge.dev/llms-full.txt): every route with its parameters, answers and examples inline
- [openapi.json](https://crawl.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [SKILL.md](https://crawl.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

## archive.web.pkgforge.dev

> A web archive broker: the captures of a URL across the Wayback Machine, Arquivo.pt and Common Crawl, the capture closest to an instant, one capture's archived body, and a save through Save Page Now.

Host: `archive.web.pkgforge.dev`. Worker: `web-archive`. State: built.

Cost: free to every caller; no key, no account, no quota, no rate limit (never gated).

CORS: every answer carries `access-control-allow-origin: *` and exposes the provenance headers; OPTIONS on a listed path is the preflight (204); no credentials.

Every service and its live status: https://web.pkgforge.dev/

### Routes

- [GET /healthz](https://archive.web.pkgforge.dev/openapi.json#/paths/~1healthz/get): service state and the running Worker version
- [GET /](https://archive.web.pkgforge.dev/openapi.json#/paths/~1/get): the index of this service
- [GET /captures](https://archive.web.pkgforge.dev/openapi.json#/paths/~1captures/get): list a URL's archived captures
- [GET /closest](https://archive.web.pkgforge.dev/openapi.json#/paths/~1closest/get): the one capture nearest an instant
- [GET /capture/{rest+}](https://archive.web.pkgforge.dev/openapi.json#/paths/~1capture~1%7Brest%7D/get): one capture's archived body
- [POST /save](https://archive.web.pkgforge.dev/openapi.json#/paths/~1save/post): archive a URL now through Save Page Now
- [GET /save/{job}](https://archive.web.pkgforge.dev/openapi.json#/paths/~1save~1%7Bjob%7D/get): a save job's state
- [GET /llms.txt](https://archive.web.pkgforge.dev/llms.txt): llmstxt.org index of this service
- [GET /llms-full.txt](https://archive.web.pkgforge.dev/llms-full.txt): every route with parameters, answers and examples inline
- [GET /openapi.json](https://archive.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [GET /SKILL.md](https://archive.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service

### Docs

- [llms-full.txt](https://archive.web.pkgforge.dev/llms-full.txt): every route with its parameters, answers and examples inline
- [openapi.json](https://archive.web.pkgforge.dev/openapi.json): OpenAPI 3.1 for every route
- [SKILL.md](https://archive.web.pkgforge.dev/SKILL.md): one file an agent reads to use this service
