[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MHZNJ1GRC56H5P4VTMKD76":3,"skill-same:01M6MHZNJ1GRC56H5P4VTMKD76":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6MHZNJ1GRC56H5P4VTMKD76","kreuzberg-cloud",null,"Managed Kreuzberg document intelligence at api.kreuzberg.dev. Use when the user wants cloud extraction with webhook delivery, presigned uploads for large files, document versioning and diffing, sandbox keys, or per-project usage tracking — instead of running the local kreuzberg CLI. Covers authentication, the 12 REST endpoints, request\u002Fresponse shapes, error model, and SDK options.","hashgraph-online\u002Fawesome-codex-plugins","hashgraph-online","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160371962?v=4","01M6CNB6NRJVNNGN14TR01Q6D3","HOL (Hashgraph Online)","01M6JT1HSKKG9V68KQAQGBA7XP",1571,"MIT","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fkreuzberg-dev\u002Fplugins\u002Fplugins\u002Fkreuzberg-cloud\u002Fskills\u002Fkreuzberg-cloud\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"cloud","kreuzberg","kreuzberg cloud","project","when","managed","request","for","at","usage","error","webhook","cli","local","delivery","options","intelligence","files","versioning","model","api","authentication","2026-11-10 10:12:30",false,"---\nname: kreuzberg-cloud\ndescription: >-\n  Managed Kreuzberg document intelligence at api.kreuzberg.dev. Use when the\n  user wants cloud extraction with webhook delivery, presigned uploads for\n  large files, document versioning and diffing, sandbox keys, or per-project\n  usage tracking — instead of running the local kreuzberg CLI. Covers\n  authentication, the 12 REST endpoints, request\u002Fresponse shapes, error\n  model, and SDK options.\nlicense: MIT\nmetadata:\n  author: kreuzberg-dev\n  version: \"0.1.0\"\n  repository: https:\u002F\u002Fgithub.com\u002Fkreuzberg-dev\u002Fkreuzberg-cloud\n---\n\n# Kreuzberg Cloud\n\nKreuzberg Cloud is the managed extraction API hosted at\n`https:\u002F\u002Fapi.kreuzberg.dev`. It exposes the same Rust extraction engine as\nthe local `kreuzberg` CLI, with two extras: jobs are asynchronous (webhook\nor polling delivery) and large files go through presigned uploads instead\nof in-band base64.\n\nUse this skill when writing code that:\n\n- Hits `api.kreuzberg.dev` directly via HTTP.\n- Uses the `@kreuzberg\u002Fcloud` (npm) or `kreuzberg-cloud-sdk` (PyPI) SDKs.\n- Configures webhooks, sandbox keys, or usage queries.\n\n## v0.1.0 limitation\n\nThe `kreuzberg-cloud` plugin v0.1.0 ships **skills only — no MCP server**.\nThe `kreuzberg-cloud` CLI binary that hosts the MCP server lands in plugin\nv0.2.0. Until then, prefer one of:\n\n1. The TypeScript SDK (`@kreuzberg\u002Fcloud`) — ESM, tree-shakable, generated\n   from the OpenAPI 3.1 spec.\n2. The Python SDK (`kreuzberg-cloud-sdk`) — sync + async, `from_sandbox()`\n   helper for evaluation.\n3. Raw `curl` — every example below shows the curl form first.\n\n## When cloud vs local\n\n| Situation | Use |\n|---|---|\n| You already have the `kreuzberg` CLI installed and the file is on disk | Local (`kreuzberg` plugin) |\n| File is on a remote URL or in S3 \u002F GCS | Cloud |\n| Need OCR for languages the local Tesseract install doesn't have | Cloud |\n| File is larger than ~50 MB | Cloud (presigned uploads) |\n| Want webhook delivery rather than blocking the caller | Cloud |\n| Batch of mixed documents with shared options | Either; cloud parallelizes server-side |\n| No network access, air-gapped environment | Local |\n| Evaluating before committing to install | Cloud sandbox key |\n\n## Getting an API key\n\nThree options, in order of preference for production:\n\n1. **Production key** — sign up at \u003Chttps:\u002F\u002Fkreuzberg.dev\u002Fcloud>, mint a key\n   from the dashboard. Format: `sk_live_*`.\n2. **Sandbox key** — no signup, 24-hour TTL, 50-page quota, rate-limited to\n   10 keys per IP per 24 hours. Format: `sk_sandbox_*`. See the\n   `sandbox-keys` skill.\n3. **Local `~\u002F.kreuzberg\u002Fcloud.toml`** — for shell sessions, put the key in:\n\n   ```toml\n   # ~\u002F.kreuzberg\u002Fcloud.toml\n   api_key = \"sk_live_...\"\n   ```\n\nThe plugin's `SessionStart` hook checks `KREUZBERG_API_KEY` env var first,\nthen `~\u002F.kreuzberg\u002Fcloud.toml`, and emits a setup reminder if neither is\npresent.\n\n## Authentication\n\nEvery request — except `POST \u002Fv1\u002Fsandbox\u002Fkey` — uses a Bearer token:\n\n```bash\ncurl https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fusage \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\"\n```\n\nBoth `sk_live_*` and `sk_sandbox_*` go in the same header. The server\nresolves project context from the key.\n\n## Base URL and versioning\n\n- Base: `https:\u002F\u002Fapi.kreuzberg.dev`\n- Path prefix: `\u002Fv1\u002F` for all extraction, jobs, sandbox, uploads, usage\n  endpoints. Health endpoints (`\u002Fhealthz`, `\u002Freadyz`) are unversioned.\n- The OpenAPI 3.1 spec is published at\n  \u003Chttps:\u002F\u002Fapi.kreuzberg.dev\u002Fopenapi.json>; full reference at\n  \u003Chttps:\u002F\u002Fdocs.kreuzberg.cloud>.\n\n## The 12 endpoints\n\nTwelve operations across seven tag groups:\n\n### health (2)\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `\u002Fhealthz` | Liveness — returns 200 if the process is up. |\n| GET | `\u002Freadyz` | Readiness — returns 200 only when downstream deps are healthy. |\n\nNeither requires auth. Use `\u002Freadyz` for uptime monitors and `\u002Fhealthz`\nfor load-balancer health checks.\n\n### extract (1)\n\n| Method | Path | Purpose |\n|---|---|---|\n| POST | `\u002Fv1\u002Fextract` | Submit one or more documents (or URLs) for extraction. |\n\nAccepts `application\u002Fjson` (base64 documents) or `multipart\u002Fform-data`\n(binary file parts). Returns `202 Accepted` with `job_ids` (extraction\njobs) and `crawl_job_ids` (URL-crawl jobs). Pair with `GET \u002Fv1\u002Fjobs\u002F{id}`\nto retrieve results — or supply a `webhook` block to receive them\nasynchronously. See the `offloading-extraction` skill.\n\n### jobs (1)\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `\u002Fv1\u002Fjobs\u002F{id}` | Get the current status and (if terminal) result of a job. |\n\nAccepts both extraction job IDs and crawl job IDs. Response shape varies:\nextraction jobs return `JobResponse`, crawl jobs return `CrawlJobResponse`.\nSee the `tracking-cloud-jobs` skill.\n\n### documents (4)\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `\u002Fv1\u002Fdocuments\u002F{document_id}` | Latest version of a document with its extraction result. |\n| GET | `\u002Fv1\u002Fdocuments\u002F{document_id}\u002Fdiff?from={v}&to={v}` | Compute a diff between two versions (sync, async fallback on budget). |\n| GET | `\u002Fv1\u002Fdocuments\u002F{document_id}\u002Fdiff\u002F{diff_job_id}` | Poll the status of an async diff job. |\n| GET | `\u002Fv1\u002Fdocuments\u002F{document_id}\u002Fversions` | List all versions of a document (paginated). |\n\nFor applications that re-process the same document over time. Each\nextraction returns a `document_id` that's stable across versions.\n\n### uploads (2)\n\n| Method | Path | Purpose |\n|---|---|---|\n| POST | `\u002Fv1\u002Fuploads\u002Fpresign` | Generate per-file presigned PUT URLs. |\n| POST | `\u002Fv1\u002Fuploads\u002Fconfirm` | Confirm the uploads and start processing. |\n\nThree-step flow for files larger than ~50 MB: presign → PUT to storage →\nconfirm. See the `presigned-uploads` skill.\n\n### sandbox (1)\n\n| Method | Path | Purpose |\n|---|---|---|\n| POST | `\u002Fv1\u002Fsandbox\u002Fkey` | Mint an ephemeral sandbox API key. |\n\n24-hour TTL, 50-page quota, 10 keys per IP per 24 hours. No auth required.\nSee the `sandbox-keys` skill.\n\n### usage (1)\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `\u002Fv1\u002Fusage` | Per-project usage statistics and remaining quota. |\n\nAccepts optional `start` and `end` ISO-8601 query params. Defaults to the\ncurrent calendar month. See the `managing-cloud-usage` skill.\n\n## Key request \u002F response shapes\n\n### `ExtractJsonRequest`\n\n```json\n{\n  \"documents\": [\n    {\n      \"filename\": \"invoice.pdf\",\n      \"mime_type\": \"application\u002Fpdf\",\n      \"data\": \"\u003Cbase64>\"\n    }\n  ],\n  \"urls\": [\n    { \"url\": \"https:\u002F\u002Fexample.com\u002Fdocs\" }\n  ],\n  \"options\": {\n    \"extraction_config\": {\n      \"output_format\": \"markdown\",\n      \"ocr\": { \"backend\": \"tesseract\", \"language\": \"eng\" }\n    }\n  },\n  \"crawl_config\": {\n    \"max_depth\": 2,\n    \"max_pages\": 50,\n    \"stay_on_domain\": true\n  },\n  \"webhook\": {\n    \"url\": \"https:\u002F\u002Fexample.com\u002Fwebhook\",\n    \"secret\": \"shared-hmac-secret\",\n    \"metadata\": { \"request_id\": \"abc123\" }\n  }\n}\n```\n\nEither `documents` or `urls` is required (or both). `webhook`, `options`,\nand `crawl_config` are optional.\n\n### `ExtractResponse` (202)\n\n```json\n{\n  \"job_ids\": [\"550e8400-e29b-41d4-a716-446655440000\"],\n  \"crawl_job_ids\": [\"660e9400-f39c-51e5-b827-557766551111\"],\n  \"status\": \"pending\"\n}\n```\n\n### `JobResponse` (200)\n\n```json\n{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"filename\": \"invoice.pdf\",\n  \"status\": \"completed\",\n  \"created_at\": \"2025-12-21T10:00:00Z\",\n  \"processing_time_ms\": 1234,\n  \"result\": {\n    \"content\": \"Invoice total: $1,234.56\",\n    \"mime_type\": \"text\u002Fmarkdown\",\n    \"tables\": [],\n    \"images\": [],\n    \"metadata\": { \"title\": \"Invoice #12345\" }\n  }\n}\n```\n\n### `JobStatus` enum\n\n```text\nawaiting_upload | pending | processing | chunking | aggregating\n                | completed | partial_success | failed | cancelled\n```\n\nTerminal states: `completed`, `partial_success`, `failed`, `cancelled`.\nStop polling when any of those appears.\n\n### `UsageResponse` (200)\n\n```json\n{\n  \"period_start\": \"2026-05-01\",\n  \"period_end\": \"2026-06-01\",\n  \"total_pages\": 5432,\n  \"total_documents\": 87,\n  \"total_failed\": 2,\n  \"quota_limit\": 100000,\n  \"quota_remaining\": 94568,\n  \"by_mime_type\": {\n    \"application\u002Fpdf\": { \"documents\": 65, \"pages\": 3200, \"failed\": 1 }\n  }\n}\n```\n\n## Error model\n\nAll errors are JSON with at least an `error` string field. Status codes\nfollow REST conventions:\n\n| Status | Meaning | Typical cause |\n|---|---|---|\n| `400` | Bad request | Missing required field, malformed body, invalid UUID. |\n| `401` | Unauthorized | Missing or invalid `Authorization` header. |\n| `404` | Not found | Job \u002F document ID doesn't exist in this project. |\n| `429` | Rate limited | Sandbox-key IP throttle or per-key quota. |\n| `500` | Server error | Database failure, worker crash — retry with backoff. |\n| `503` | Service unavailable | Downstream dep unhealthy — retry. |\n\nThe SDKs surface these as typed exceptions: `AuthError`, `ValidationError`,\n`NotFoundError`, `RateLimitError` (carries `retry_after`), `ServerError`,\n`TimeoutError`, all extending `KreuzbergCloudError` (Python) \u002F\n`KreuzbergError` (TypeScript).\n\n## Concrete examples\n\n### Sandbox onboarding (no signup)\n\n```bash\n# Mint an ephemeral key.\ncurl -X POST https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fsandbox\u002Fkey\n# → { \"api_key\": \"sk_sandbox_...\", \"expires_at\": \"...\", \"pages_remaining\": 50 }\n```\n\n```ts\nimport { KreuzbergCloud } from \"@kreuzberg\u002Fcloud\";\nconst client = await KreuzbergCloud.fromSandbox();\nconst result = await client.extractAndWait({\n  file: new Blob([\"Hello world\"], { type: \"text\u002Fplain\" }),\n});\nconsole.log(result.result?.content);\n```\n\n```python\nfrom kreuzberg_cloud import AsyncKreuzbergCloud\nasync with await AsyncKreuzbergCloud.from_sandbox() as client:\n    job = await client.extract_and_wait(file=b\"hello world\")\n    print(job.status, job.result and job.result.content)\n```\n\n### Single-file extract → poll\n\n```bash\n# 1. Submit.\nJOB_ID=$(curl -sX POST https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fextract \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"documents\": [\n      {\"filename\": \"invoice.pdf\", \"mime_type\": \"application\u002Fpdf\",\n       \"data\": \"'\"$(base64 -w0 invoice.pdf)\"'\"}\n    ],\n    \"options\": {\"extraction_config\": {\"output_format\": \"markdown\"}}\n  }' | jq -r '.job_ids[0]')\n\n# 2. Poll until terminal.\ncurl -s https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fjobs\u002F$JOB_ID \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\"\n```\n\n## Other skills\n\n- `offloading-extraction` — full `POST \u002Fv1\u002Fextract` workflow with options.\n- `tracking-cloud-jobs` — polling cadence, webhook signatures.\n- `presigned-uploads` — three-step flow for files >50 MB.\n- `versioning-documents` — retrieve a document, list its versions, diff two versions.\n- `managing-cloud-usage` — quota and per-MIME breakdown.\n- `sandbox-keys` — when to recommend sandbox over production keys.\n\n## References\n\n- API docs: \u003Chttps:\u002F\u002Fdocs.kreuzberg.cloud>\n- OpenAPI spec: \u003Chttps:\u002F\u002Fapi.kreuzberg.dev\u002Fopenapi.json>\n- TypeScript SDK: \u003Chttps:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@kreuzberg\u002Fcloud>\n- Python SDK: \u003Chttps:\u002F\u002Fpypi.org\u002Fproject\u002Fkreuzberg-cloud-sdk\u002F>\n- Pricing and signup: \u003Chttps:\u002F\u002Fkreuzberg.dev\u002Fcloud>\n","# Kreuzberg Cloud\n\nKreuzberg Cloud is the managed extraction API hosted at\n`https:\u002F\u002Fapi.kreuzberg.dev`. It exposes the same Rust extraction engine as\nthe local `kreuzberg` CLI, with two extras: jobs are asynchronous (webhook\nor polling delivery) and large files go through presigned uploads instead\nof in-band base64.\n\nUse this skill when writing code that:\n\n- Hits `api.kreuzberg.dev` directly via HTTP.\n- Uses the `@kreuzberg\u002Fcloud` (npm) or `kreuzberg-cloud-sdk` (PyPI) SDKs.\n- Configures webhooks, sandbox keys, or usage queries.\n\n## v0.1.0 limitation\n\nThe `kreuzberg-cloud` plugin v0.1.0 ships **skills only — no MCP server**.\nThe `kreuzberg-cloud` CLI binary that hosts the MCP server lands in plugin\nv0.2.0. Until then, prefer one of:\n\n1. The TypeScript SDK (`@kreuzberg\u002Fcloud`) — ESM, tree-shakable, generated\n   from the OpenAPI 3.1 spec.\n2. The Python SDK (`kreuzberg-cloud-sdk`) — sync + async, `from_sandbox()`\n   helper for evaluation.\n3. Raw `curl` — every example below shows the curl form first.\n\n## When cloud vs local\n\n| Situation | Use |\n|---|---|\n| You already have the `kreuzberg` CLI installed and the file is on disk | Local (`kreuzberg` plugin) |\n| File is on a remote URL or in S3 \u002F GCS | Cloud |\n| Need OCR for languages the local Tesseract install doesn't have | Cloud |\n| File is larger than ~50 MB | Cloud (presigned uploads) |\n| Want webhook delivery rather than blocking the caller | Cloud |\n| Batch of mixed documents with shared options | Either; cloud parallelizes server-side |\n| No network access, air-gapped environment | Local |\n| Evaluating before committing to install | Cloud sandbox key |\n\n## Getting an API key\n\nThree options, in order of preference for production:\n\n1. **Production key** — sign up at \u003Chttps:\u002F\u002Fkreuzberg.dev\u002Fcloud>, mint a key\n   from the dashboard. Format: `sk_live_*`.\n2. **Sandbox key** — no signup, 24-hour TTL, 50-page quota, rate-limited to\n   10 keys per IP per 24 hours. Format: `sk_sandbox_*`. See the\n   `sandbox-keys` skill.\n3. **Local `~\u002F.kreuzberg\u002Fcloud.toml`** — for shell sessions, put the key in:\n\n   ```toml\n   # ~\u002F.kreuzberg\u002Fcloud.toml\n   api_key = \"sk_live_...\"\n   ```\n\nThe plugin's `SessionStart` hook checks `KREUZBERG_API_KEY` env var first,\nthen `~\u002F.kreuzberg\u002Fcloud.toml`, and emits a setup reminder if neither is\npresent.\n\n## Authentication\n\nEvery request — except `POST \u002Fv1\u002Fsandbox\u002Fkey` — uses a Bearer token:\n\n```bash\ncurl https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fusage \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\"\n```\n\nBoth `sk_live_*` and `sk_sandbox_*` go in the same header. The server\nresolves project context from the key.\n\n## Base URL and versioning\n\n- Base: `https:\u002F\u002Fapi.kreuzberg.dev`\n- Path prefix: `\u002Fv1\u002F` for all extraction, jobs, sandbox, uploads, usage\n  endpoints. Health endpoints (`\u002Fhealthz`, `\u002Freadyz`) are unversioned.\n- The OpenAPI 3.1 spec is published at\n  \u003Chttps:\u002F\u002Fapi.kreuzberg.dev\u002Fopenapi.json>; full reference at\n  \u003Chttps:\u002F\u002Fdocs.kreuzberg.cloud>.\n\n## The 12 endpoints\n\nTwelve operations across seven tag groups:\n\n### health (2)\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `\u002Fhealthz` | Liveness — returns 200 if the process is up. |\n| GET | `\u002Freadyz` | Readiness — returns 200 only when downstream deps are healthy. |\n\nNeither requires auth. Use `\u002Freadyz` for uptime monitors and `\u002Fhealthz`\nfor load-balancer health checks.\n\n### extract (1)\n\n| Method | Path | Purpose |\n|---|---|---|\n| POST | `\u002Fv1\u002Fextract` | Submit one or more documents (or URLs) for extraction. |\n\nAccepts `application\u002Fjson` (base64 documents) or `multipart\u002Fform-data`\n(binary file parts). Returns `202 Accepted` with `job_ids` (extraction\njobs) and `crawl_job_ids` (URL-crawl jobs). Pair with `GET \u002Fv1\u002Fjobs\u002F{id}`\nto retrieve results — or supply a `webhook` block to receive them\nasynchronously. See the `offloading-extraction` skill.\n\n### jobs (1)\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `\u002Fv1\u002Fjobs\u002F{id}` | Get the current status and (if terminal) result of a job. |\n\nAccepts both extraction job IDs and crawl job IDs. Response shape varies:\nextraction jobs return `JobResponse`, crawl jobs return `CrawlJobResponse`.\nSee the `tracking-cloud-jobs` skill.\n\n### documents (4)\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `\u002Fv1\u002Fdocuments\u002F{document_id}` | Latest version of a document with its extraction result. |\n| GET | `\u002Fv1\u002Fdocuments\u002F{document_id}\u002Fdiff?from={v}&to={v}` | Compute a diff between two versions (sync, async fallback on budget). |\n| GET | `\u002Fv1\u002Fdocuments\u002F{document_id}\u002Fdiff\u002F{diff_job_id}` | Poll the status of an async diff job. |\n| GET | `\u002Fv1\u002Fdocuments\u002F{document_id}\u002Fversions` | List all versions of a document (paginated). |\n\nFor applications that re-process the same document over time. Each\nextraction returns a `document_id` that's stable across versions.\n\n### uploads (2)\n\n| Method | Path | Purpose |\n|---|---|---|\n| POST | `\u002Fv1\u002Fuploads\u002Fpresign` | Generate per-file presigned PUT URLs. |\n| POST | `\u002Fv1\u002Fuploads\u002Fconfirm` | Confirm the uploads and start processing. |\n\nThree-step flow for files larger than ~50 MB: presign → PUT to storage →\nconfirm. See the `presigned-uploads` skill.\n\n### sandbox (1)\n\n| Method | Path | Purpose |\n|---|---|---|\n| POST | `\u002Fv1\u002Fsandbox\u002Fkey` | Mint an ephemeral sandbox API key. |\n\n24-hour TTL, 50-page quota, 10 keys per IP per 24 hours. No auth required.\nSee the `sandbox-keys` skill.\n\n### usage (1)\n\n| Method | Path | Purpose |\n|---|---|---|\n| GET | `\u002Fv1\u002Fusage` | Per-project usage statistics and remaining quota. |\n\nAccepts optional `start` and `end` ISO-8601 query params. Defaults to the\ncurrent calendar month. See the `managing-cloud-usage` skill.\n\n## Key request \u002F response shapes\n\n### `ExtractJsonRequest`\n\n```json\n{\n  \"documents\": [\n    {\n      \"filename\": \"invoice.pdf\",\n      \"mime_type\": \"application\u002Fpdf\",\n      \"data\": \"\u003Cbase64>\"\n    }\n  ],\n  \"urls\": [\n    { \"url\": \"https:\u002F\u002Fexample.com\u002Fdocs\" }\n  ],\n  \"options\": {\n    \"extraction_config\": {\n      \"output_format\": \"markdown\",\n      \"ocr\": { \"backend\": \"tesseract\", \"language\": \"eng\" }\n    }\n  },\n  \"crawl_config\": {\n    \"max_depth\": 2,\n    \"max_pages\": 50,\n    \"stay_on_domain\": true\n  },\n  \"webhook\": {\n    \"url\": \"https:\u002F\u002Fexample.com\u002Fwebhook\",\n    \"secret\": \"shared-hmac-secret\",\n    \"metadata\": { \"request_id\": \"abc123\" }\n  }\n}\n```\n\nEither `documents` or `urls` is required (or both). `webhook`, `options`,\nand `crawl_config` are optional.\n\n### `ExtractResponse` (202)\n\n```json\n{\n  \"job_ids\": [\"550e8400-e29b-41d4-a716-446655440000\"],\n  \"crawl_job_ids\": [\"660e9400-f39c-51e5-b827-557766551111\"],\n  \"status\": \"pending\"\n}\n```\n\n### `JobResponse` (200)\n\n```json\n{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"filename\": \"invoice.pdf\",\n  \"status\": \"completed\",\n  \"created_at\": \"2025-12-21T10:00:00Z\",\n  \"processing_time_ms\": 1234,\n  \"result\": {\n    \"content\": \"Invoice total: $1,234.56\",\n    \"mime_type\": \"text\u002Fmarkdown\",\n    \"tables\": [],\n    \"images\": [],\n    \"metadata\": { \"title\": \"Invoice #12345\" }\n  }\n}\n```\n\n### `JobStatus` enum\n\n```text\nawaiting_upload | pending | processing | chunking | aggregating\n                | completed | partial_success | failed | cancelled\n```\n\nTerminal states: `completed`, `partial_success`, `failed`, `cancelled`.\nStop polling when any of those appears.\n\n### `UsageResponse` (200)\n\n```json\n{\n  \"period_start\": \"2026-05-01\",\n  \"period_end\": \"2026-06-01\",\n  \"total_pages\": 5432,\n  \"total_documents\": 87,\n  \"total_failed\": 2,\n  \"quota_limit\": 100000,\n  \"quota_remaining\": 94568,\n  \"by_mime_type\": {\n    \"application\u002Fpdf\": { \"documents\": 65, \"pages\": 3200, \"failed\": 1 }\n  }\n}\n```\n\n## Error model\n\nAll errors are JSON with at least an `error` string field. Status codes\nfollow REST conventions:\n\n| Status | Meaning | Typical cause |\n|---|---|---|\n| `400` | Bad request | Missing required field, malformed body, invalid UUID. |\n| `401` | Unauthorized | Missing or invalid `Authorization` header. |\n| `404` | Not found | Job \u002F document ID doesn't exist in this project. |\n| `429` | Rate limited | Sandbox-key IP throttle or per-key quota. |\n| `500` | Server error | Database failure, worker crash — retry with backoff. |\n| `503` | Service unavailable | Downstream dep unhealthy — retry. |\n\nThe SDKs surface these as typed exceptions: `AuthError`, `ValidationError`,\n`NotFoundError`, `RateLimitError` (carries `retry_after`), `ServerError`,\n`TimeoutError`, all extending `KreuzbergCloudError` (Python) \u002F\n`KreuzbergError` (TypeScript).\n\n## Concrete examples\n\n### Sandbox onboarding (no signup)\n\n```bash\n# Mint an ephemeral key.\ncurl -X POST https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fsandbox\u002Fkey\n# → { \"api_key\": \"sk_sandbox_...\", \"expires_at\": \"...\", \"pages_remaining\": 50 }\n```\n\n```ts\nimport { KreuzbergCloud } from \"@kreuzberg\u002Fcloud\";\nconst client = await KreuzbergCloud.fromSandbox();\nconst result = await client.extractAndWait({\n  file: new Blob([\"Hello world\"], { type: \"text\u002Fplain\" }),\n});\nconsole.log(result.result?.content);\n```\n\n```python\nfrom kreuzberg_cloud import AsyncKreuzbergCloud\nasync with await AsyncKreuzbergCloud.from_sandbox() as client:\n    job = await client.extract_and_wait(file=b\"hello world\")\n    print(job.status, job.result and job.result.content)\n```\n\n### Single-file extract → poll\n\n```bash\n# 1. Submit.\nJOB_ID=$(curl -sX POST https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fextract \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"documents\": [\n      {\"filename\": \"invoice.pdf\", \"mime_type\": \"application\u002Fpdf\",\n       \"data\": \"'\"$(base64 -w0 invoice.pdf)\"'\"}\n    ],\n    \"options\": {\"extraction_config\": {\"output_format\": \"markdown\"}}\n  }' | jq -r '.job_ids[0]')\n\n# 2. Poll until terminal.\ncurl -s https:\u002F\u002Fapi.kreuzberg.dev\u002Fv1\u002Fjobs\u002F$JOB_ID \\\n  -H \"Authorization: Bearer $KREUZBERG_API_KEY\"\n```\n\n## Other skills\n\n- `offloading-extraction` — full `POST \u002Fv1\u002Fextract` workflow with options.\n- `tracking-cloud-jobs` — polling cadence, webhook signatures.\n- `presigned-uploads` — three-step flow for files >50 MB.\n- `versioning-documents` — retrieve a document, list its versions, diff two versions.\n- `managing-cloud-usage` — quota and per-MIME breakdown.\n- `sandbox-keys` — when to recommend sandbox over production keys.\n\n## References\n\n- API docs: \u003Chttps:\u002F\u002Fdocs.kreuzberg.cloud>\n- OpenAPI spec: \u003Chttps:\u002F\u002Fapi.kreuzberg.dev\u002Fopenapi.json>\n- TypeScript SDK: \u003Chttps:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@kreuzberg\u002Fcloud>\n- Python SDK: \u003Chttps:\u002F\u002Fpypi.org\u002Fproject\u002Fkreuzberg-cloud-sdk\u002F>\n- Pricing and signup: \u003Chttps:\u002F\u002Fkreuzberg.dev\u002Fcloud>\n",{"name":5,"license":15,"metadata":46,"description":7},{"author":47,"version":48,"repository":49},"kreuzberg-dev","0.1.0","https:\u002F\u002Fgithub.com\u002Fkreuzberg-dev\u002Fkreuzberg-cloud","main","2b63f856ce19c2a797929cacabd9e0fc936812fa","plugins\u002Fkreuzberg-dev\u002Fplugins\u002Fplugins\u002Fkreuzberg-cloud\u002Fskills\u002Fkreuzberg-cloud",490,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins","https:\u002F\u002Fhol.org\u002Fplugins\u002Fbest-codex-plugins","https:\u002F\u002Fgithub.com\u002Fhashgraph-online","https:\u002F\u002Fhol.org","Open-source standards and developer tools for interoperable AI agents: discovery, identity, communication, payments, privacy and security.","2026-11-14 02:12:02",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add hashgraph-online\u002Fawesome-codex-plugins --skill kreuzberg-cloud",{"tool":66,"command":67},"bunx","bunx skills add hashgraph-online\u002Fawesome-codex-plugins --skill kreuzberg-cloud",{"tool":69,"command":70},"pnpm","pnpm dlx skills add hashgraph-online\u002Fawesome-codex-plugins --skill kreuzberg-cloud","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fkreuzberg-dev\u002Fplugins\u002Fplugins\u002Fkreuzberg-cloud\u002Fskills\u002Fkreuzberg-cloud\u002FSKILL.md",true,[],[75,84,91,98,122,146],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":83},"01M746ZWACVKMZ1BJXJZHYJSSX","migrate-to-e2e","Moves an existing Playwright, Cypress, Selenium, Appium, Detox, Maestro, or TesterArmy suite to e2e one slice at a time, with the old suite running beside the new one until each ported test is proven. Keeps a MIGRATION.md progress file so any later session resumes where the last stopped. Optionally plants a defect to show both suites catch it. Use for \u002Fmigrate-to-e2e, \"migrate our tests to e2e\", \"port these Maestro flows\", \"move our TesterArmy tests\", or when a project has an e2e config and an older suite still running.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fmigrate-to-e2e\u002FSKILL.md",[],[],"2026-11-11 15:11:14",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":83},"01M746ZPTAX1Q0FBKAB1CYND7E","e2e","Writes, runs, and debugs end-to-end tests for web and mobile apps with e2e, the agentic test runner, which mixes agent.act goals with exact locator assertions on a Playwright browser or an iOS or Android device. Also drives a project's running app live over the e2e MCP server to look at a screen, check a UI change, take a screenshot or record a video, and try a locator; and runs bug bashes, parallel e2e explore runs with each bug proven by a repro test. Use when a project depends on e2e or has an e2e.config.ts, when asked for end-to-end, browser, mobile, or agentic UI tests, to check a change in the running app, to QA or bug bash an app or branch, or when an e2e run fails.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fe2e\u002FSKILL.md",[],[],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":83},"01M746ZJN784HVHMDP9MQGCSGG","create-verification-skill","Generate a project-local verify-\u003Capp> skill on top of e2e, so any coding agent can launch the app, check it is worth driving, exercise a feature the way a user does, keep evidence, and bug bash it. Writes the skill, a feature map with one explore charter per feature, and proves it once. Use for \u002Fcreate-verification-skill, \"make a verification skill for this repo\", or when a project has no scripted way to prove UI behavior.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fcreate-verification-skill\u002FSKILL.md",[],[],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":41},"01M716A6ETNB9B1SQ3GXZC75VR","deja-search","deja-vu memory — search the user's past AI coding sessions with the deja CLI. Holds what they already settled and never wrote into the repo (naming rules, banned or already-tried tools, required checks before merge, preferred values, who owns what). Use before your first edit in a task, before you call a change done or ready to merge, before you recommend a tool, library, design or reviewer, before re-debugging an error that may already be solved, when they say 'didn't we fix this before', 'what did we decide about X' or 'I already have that', and before telling them something on this machine does not exist.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-search\u002FSKILL.md",[],[105,106,107,29,108,109,110,111,112,113,114,23,115,116,117,118,119,31,120,121],"search","deja search","never","ready","memory","re","decide","fix","design","debugging","you","done","reviewer","io","change","merge","past",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":41},"01M716A3J2W5SENSE9VGMXB375","deja-reflect","End-of-session reflection and memory curation with deja-vu. Review what was decided, what commands broke and what repaired them, and record durable project rules or decisions with deja remember so the next session starts with them.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-reflect\u002FSKILL.md",[],[129,130,131,118,132,133,134,135,136,137,138,139,140,141,109,142,22,143,144,145],"deja reflect","reflect","review","with","record","github","next","https","node","Rules","decisions","brew","remember","project rules","session","end","reflection",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":79,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":163,"publishedAt":41},"01M715T3RR4BAYSR57HPPTJ0PF","revid","Make, edit, export and post AI videos with Revid (revid.ai) through the Revid MCP server. Use whenever the user wants a short-form or long-form video made (from an idea, a script, a URL, an article, a PDF, a tweet, a product page, their own clips, or a song), wants to find what is going viral on TikTok, YouTube, Instagram or X before making something, wants to edit or re-export an existing Revid project, generate a standalone AI image or clip, make a series episode, or publish and schedule a finished video to connected social accounts. Covers setup (hosted MCP with OAuth, or an API key), the 36 tools, credits, polling and the rules for publishing. Routes to the more specific revid-* skills when one fits.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftmakersas\u002Frevid-skills\u002Fskills\u002Frevid\u002FSKILL.md",[152,157,160],{"categoryNo":153,"categoryName":154,"taxonomyType":155,"taxonomyTypeDesc":156},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":158,"categoryName":159,"taxonomyType":155,"taxonomyTypeDesc":156},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":161,"categoryName":162,"taxonomyType":155,"taxonomyTypeDesc":156},"01JBSEEDCAT000000000000010","后端与接口",[148,164,165,166,167,168,169,22,170,110,171,172,173,174,23,175,176,177,39,178],"URL","Video","short-form","standalone","PDF","viral","tiktok","short","social","MCP","song","image","mcp server","schedule","publish"]