Skip to content
Back to skills

Omni Inference

ASecurity

The core OpenAI-compatible inference endpoints: chat completions, embeddings, images, audio (TTS/STT), moderations, rerank, and the Responses API. The primary integration surface for AI agents.

  • 72,229 stars
  • 0 votes
  • 0 copies
  • 6 views
  • Added August 31, 2026
ai-agentsgobashnodedockerterraformgitapi

Works with

  • vscode
  • api

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add diegosouzapw/OmniRoute --skill omni-inference --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Omni Inference?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Omni Inference
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/diegosouzapw-omni-inference/badge)](https://www.skillsdirectory.com/skills/diegosouzapw-omni-inference)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: omni-inference
description: "The core OpenAI-compatible inference endpoints: chat completions, embeddings, images, audio (TTS/STT), moderations, rerank, and the Responses API. The primary integration surface for AI agents."
---
<!-- generated by src/lib/agentSkills/generator.ts; manual edits will be overwritten -->

## Overview

The core OpenAI-compatible inference endpoints: chat completions, embeddings, images, audio (TTS/STT), moderations, rerank, and the Responses API. The primary integration surface for AI agents.

## Authentication

All requests require a valid Bearer token or session cookie. Obtain a token via `POST /api/auth/login` or configure `REQUIRE_API_KEY=false` for local development.

## Endpoints

- [`POST /api/v1/session-leases`](references/endpoints.md#post-apiv1session-leases)
- [`GET /api/v1/search`](references/endpoints.md#get-apiv1search)
- [`POST /api/v1/search`](references/endpoints.md#post-apiv1search)
- [`POST /api/v1/chat/completions`](references/endpoints.md#post-apiv1chatcompletions)
- [`GET /api/v1/ws`](references/endpoints.md#get-apiv1ws)
- [`POST /api/v1/providers/{provider}/chat/completions`](references/endpoints.md#post-apiv1providersproviderchatcompletions)
- [`POST /api/v1/api/chat`](references/endpoints.md#post-apiv1apichat)
- [`POST /api/v1/messages`](references/endpoints.md#post-apiv1messages)
- [`POST /api/v1/messages/count_tokens`](references/endpoints.md#post-apiv1messagescounttokens)
- [`POST /api/v1/responses`](references/endpoints.md#post-apiv1responses)
- [`POST /api/v1/embeddings`](references/endpoints.md#post-apiv1embeddings)
- [`GET /api/v1/multimodal-embeddings`](references/endpoints.md#get-apiv1multimodal-embeddings)
- [`POST /api/v1/multimodal-embeddings`](references/endpoints.md#post-apiv1multimodal-embeddings)
- [`POST /api/v1/providers/{provider}/embeddings`](references/endpoints.md#post-apiv1providersproviderembeddings)
- [`POST /api/v1/images/generations`](references/endpoints.md#post-apiv1imagesgenerations)
- [`POST /api/v1/providers/{provider}/images/generations`](references/endpoints.md#post-apiv1providersproviderimagesgenerations)
- [`POST /api/v1/audio/speech`](references/endpoints.md#post-apiv1audiospeech)
- [`POST /api/v1/audio/transcriptions`](references/endpoints.md#post-apiv1audiotranscriptions)
- [`POST /api/v1/moderations`](references/endpoints.md#post-apiv1moderations)
- [`POST /api/v1/rerank`](references/endpoints.md#post-apiv1rerank)
- [`GET /api/v1`](references/endpoints.md#get-apiv1)
- [`GET /api/v1/providers/{provider}/models`](references/endpoints.md#get-apiv1providersprovidermodels)
- [`GET /api/v1/management/proxy-subscriptions`](references/endpoints.md#get-apiv1managementproxy-subscriptions)
- [`POST /api/v1/management/proxy-subscriptions`](references/endpoints.md#post-apiv1managementproxy-subscriptions)
- [`GET /api/v1/management/proxy-subscriptions/{id}`](references/endpoints.md#get-apiv1managementproxy-subscriptionsid)
- [`PATCH /api/v1/management/proxy-subscriptions/{id}`](references/endpoints.md#patch-apiv1managementproxy-subscriptionsid)
- [`DELETE /api/v1/management/proxy-subscriptions/{id}`](references/endpoints.md#delete-apiv1managementproxy-subscriptionsid)
- [`GET /api/v1/management/proxy-subscriptions/{id}/nodes`](references/endpoints.md#get-apiv1managementproxy-subscriptionsidnodes)
- [`POST /api/v1/management/proxy-subscriptions/{id}/refresh`](references/endpoints.md#post-apiv1managementproxy-subscriptionsidrefresh)
- [`POST /api/v1/ocr`](references/endpoints.md#post-apiv1ocr)
- [`POST /api/v1/audio/translations`](references/endpoints.md#post-apiv1audiotranslations)
- [`GET /api/v1/voices`](references/endpoints.md#get-apiv1voices)
- [`POST /api/v1/speech-to-text`](references/endpoints.md#post-apiv1speech-to-text)
- [`POST /api/v1/text-to-speech/{voiceId}`](references/endpoints.md#post-apiv1text-to-speechvoiceid)
- [`GET /api/v1/explain/routing`](references/endpoints.md#get-apiv1explainrouting)
- [`GET /api/v1/providers/suggested-models`](references/endpoints.md#get-apiv1providerssuggested-models)
- [`GET /api/v1/provider-plugin-manifest`](references/endpoints.md#get-apiv1provider-plugin-manifest)
- [`GET /api/v1/{omnirouteCatchAll}`](references/endpoints.md#get-apiv1omniroutecatchall)
- [`POST /api/v1/{omnirouteCatchAll}`](references/endpoints.md#post-apiv1omniroutecatchall)
- [`PUT /api/v1/{omnirouteCatchAll}`](references/endpoints.md#put-apiv1omniroutecatchall)
- [`PATCH /api/v1/{omnirouteCatchAll}`](references/endpoints.md#patch-apiv1omniroutecatchall)
- [`DELETE /api/v1/{omnirouteCatchAll}`](references/endpoints.md#delete-apiv1omniroutecatchall)
- [`GET /api/v1/accounts/{id}/limits`](references/endpoints.md#get-apiv1accountsidlimits)
- [`PUT /api/v1/accounts/{id}/limits`](references/endpoints.md#put-apiv1accountsidlimits)
- [`GET /api/v1/agents/credentials`](references/endpoints.md#get-apiv1agentscredentials)
- [`POST /api/v1/agents/credentials`](references/endpoints.md#post-apiv1agentscredentials)
- [`GET /api/v1/agents/health`](references/endpoints.md#get-apiv1agentshealth)
- [`GET /api/v1/agents/tasks`](references/endpoints.md#get-apiv1agentstasks)
- [`POST /api/v1/agents/tasks`](references/endpoints.md#post-apiv1agentstasks)
- [`DELETE /api/v1/agents/tasks`](references/endpoints.md#delete-apiv1agentstasks)
- [`GET /api/v1/agents/tasks/{id}`](references/endpoints.md#get-apiv1agentstasksid)
- [`POST /api/v1/agents/tasks/{id}`](references/endpoints.md#post-apiv1agentstasksid)
- [`DELETE /api/v1/agents/tasks/{id}`](references/endpoints.md#delete-apiv1agentstasksid)
- [`POST /api/v1/antigravity`](references/endpoints.md#post-apiv1antigravity)
- [`GET /api/v1/auto-combo/{channel}/candidates`](references/endpoints.md#get-apiv1auto-combochannelcandidates)
- [`GET /api/v1/batches`](references/endpoints.md#get-apiv1batches)
- [`POST /api/v1/batches`](references/endpoints.md#post-apiv1batches)
- [`GET /api/v1/batches/{id}`](references/endpoints.md#get-apiv1batchesid)
- [`DELETE /api/v1/batches/{id}`](references/endpoints.md#delete-apiv1batchesid)
- [`POST /api/v1/batches/{id}/cancel`](references/endpoints.md#post-apiv1batchesidcancel)
- [`DELETE /api/v1/batches/delete-completed`](references/endpoints.md#delete-apiv1batchesdelete-completed)
- [`POST /api/v1/classify`](references/endpoints.md#post-apiv1classify)
- [`GET /api/v1/combos`](references/endpoints.md#get-apiv1combos)
- [`POST /api/v1/completions`](references/endpoints.md#post-apiv1completions)
- [`GET /api/v1/files`](references/endpoints.md#get-apiv1files)
- [`POST /api/v1/files`](references/endpoints.md#post-apiv1files)
- [`GET /api/v1/files/{id}`](references/endpoints.md#get-apiv1filesid)
- [`DELETE /api/v1/files/{id}`](references/endpoints.md#delete-apiv1filesid)
- [`GET /api/v1/files/{id}/content`](references/endpoints.md#get-apiv1filesidcontent)
- [`POST /api/v1/images/edits`](references/endpoints.md#post-apiv1imagesedits)
- [`GET /api/v1/images/upscale`](references/endpoints.md#get-apiv1imagesupscale)
- [`POST /api/v1/images/upscale`](references/endpoints.md#post-apiv1imagesupscale)
- [`POST /api/v1/issues/report`](references/endpoints.md#post-apiv1issuesreport)
- [`GET /api/v1/management/proxies`](references/endpoints.md#get-apiv1managementproxies)
- [`POST /api/v1/management/proxies`](references/endpoints.md#post-apiv1managementproxies)
- [`PATCH /api/v1/management/proxies`](references/endpoints.md#patch-apiv1managementproxies)
- [`DELETE /api/v1/management/proxies`](references/endpoints.md#delete-apiv1managementproxies)
- [`GET /api/v1/management/proxies/assignments`](references/endpoints.md#get-apiv1managementproxiesassignments)
- [`PUT /api/v1/management/proxies/assignments`](references/endpoints.md#put-apiv1managementproxiesassignments)
- [`PUT /api/v1/management/proxies/bulk-assign`](references/endpoints.md#put-apiv1managementproxiesbulk-assign)
- [`GET /api/v1/management/proxies/health`](references/endpoints.md#get-apiv1managementproxieshealth)
- [`GET /api/v1/me/status`](references/endpoints.md#get-apiv1mestatus)
- [`GET /api/v1/muse-code/models`](references/endpoints.md#get-apiv1muse-codemodels)
- [`GET /api/v1/music/generations`](references/endpoints.md#get-apiv1musicgenerations)
- [`POST /api/v1/music/generations`](references/endpoints.md#post-apiv1musicgenerations)
- [`GET /api/v1/providers/{provider}/limits`](references/endpoints.md#get-apiv1providersproviderlimits)
- [`PUT /api/v1/providers/{provider}/limits`](references/endpoints.md#put-apiv1providersproviderlimits)
- [`GET /api/v1/quotas/check`](references/endpoints.md#get-apiv1quotascheck)
- [`GET /api/v1/registered-keys`](references/endpoints.md#get-apiv1registered-keys)
- [`POST /api/v1/registered-keys`](references/endpoints.md#post-apiv1registered-keys)
- [`GET /api/v1/registered-keys/{id}`](references/endpoints.md#get-apiv1registered-keysid)
- [`DELETE /api/v1/registered-keys/{id}`](references/endpoints.md#delete-apiv1registered-keysid)
- [`POST /api/v1/registered-keys/{id}/revoke`](references/endpoints.md#post-apiv1registered-keysidrevoke)
- [`POST /api/v1/relay/chat/completions`](references/endpoints.md#post-apiv1relaychatcompletions)
- [`POST /api/v1/relay/chat/completions/bifrost`](references/endpoints.md#post-apiv1relaychatcompletionsbifrost)
- [`POST /api/v1/responses/{path}`](references/endpoints.md#post-apiv1responsespath)
- [`GET /api/v1/search/analytics`](references/endpoints.md#get-apiv1searchanalytics)
- [`POST /api/v1/segment`](references/endpoints.md#post-apiv1segment)
- [`GET /api/v1/video-bridge/drilldown`](references/endpoints.md#get-apiv1video-bridgedrilldown)
- [`DELETE /api/v1/video-bridge/drilldown`](references/endpoints.md#delete-apiv1video-bridgedrilldown)
- [`GET /api/v1/videos/generations`](references/endpoints.md#get-apiv1videosgenerations)
- [`POST /api/v1/videos/generations`](references/endpoints.md#post-apiv1videosgenerations)
- [`GET /api/v1/vscode/{token}`](references/endpoints.md#get-apiv1vscodetoken)
- [`POST /api/v1/vscode/{token}/api/chat`](references/endpoints.md#post-apiv1vscodetokenapichat)
- [`POST /api/v1/vscode/{token}/api/show`](references/endpoints.md#post-apiv1vscodetokenapishow)
- [`GET /api/v1/vscode/{token}/api/tags`](references/endpoints.md#get-apiv1vscodetokenapitags)
- [`GET /api/v1/vscode/{token}/api/version`](references/endpoints.md#get-apiv1vscodetokenapiversion)
- [`POST /api/v1/vscode/{token}/chat/completions`](references/endpoints.md#post-apiv1vscodetokenchatcompletions)
- [`GET /api/v1/vscode/{token}/combos`](references/endpoints.md#get-apiv1vscodetokencombos)
- [`GET /api/v1/vscode/{token}/models`](references/endpoints.md#get-apiv1vscodetokenmodels)
- [`POST /api/v1/vscode/{token}/responses`](references/endpoints.md#post-apiv1vscodetokenresponses)
- [`POST /api/v1/vscode/{token}/v1/chat/completions`](references/endpoints.md#post-apiv1vscodetokenv1chatcompletions)
- [`GET /api/v1/vscode/{token}/v1/models`](references/endpoints.md#get-apiv1vscodetokenv1models)
- [`GET /api/v1/vscode/combos/{token}/{{slug}}`](references/endpoints.md#get-apiv1vscodecombostokenslug)
- [`POST /api/v1/vscode/combos/{token}/{{slug}}`](references/endpoints.md#post-apiv1vscodecombostokenslug)
- [`GET /api/v1/vscode/raw/{token}`](references/endpoints.md#get-apiv1vscoderawtoken)
- [`POST /api/v1/vscode/raw/{token}/api/chat`](references/endpoints.md#post-apiv1vscoderawtokenapichat)
- [`POST /api/v1/vscode/raw/{token}/api/show`](references/endpoints.md#post-apiv1vscoderawtokenapishow)
- [`GET /api/v1/vscode/raw/{token}/api/tags`](references/endpoints.md#get-apiv1vscoderawtokenapitags)
- [`GET /api/v1/vscode/raw/{token}/api/version`](references/endpoints.md#get-apiv1vscoderawtokenapiversion)
- [`POST /api/v1/vscode/raw/{token}/chat/completions`](references/endpoints.md#post-apiv1vscoderawtokenchatcompletions)
- [`GET /api/v1/vscode/raw/{token}/combos`](references/endpoints.md#get-apiv1vscoderawtokencombos)
- [`GET /api/v1/vscode/raw/{token}/models`](references/endpoints.md#get-apiv1vscoderawtokenmodels)
- [`POST /api/v1/vscode/raw/{token}/responses`](references/endpoints.md#post-apiv1vscoderawtokenresponses)
- [`POST /api/v1/vscode/raw/{token}/v1/chat/completions`](references/endpoints.md#post-apiv1vscoderawtokenv1chatcompletions)
- [`GET /api/v1/vscode/raw/{token}/v1/models`](references/endpoints.md#get-apiv1vscoderawtokenv1models)
- [`POST /api/v1/web/fetch`](references/endpoints.md#post-apiv1webfetch)
## Payloads

See the full OpenAPI specification at `GET /api/openapi/spec` or `docs/openapi.yaml` for detailed request/response schemas.

<!-- skill:custom-start -->
<!-- Aggregated from: omniroute-chat, omniroute-image, omniroute-tts, omniroute-stt, omniroute-embeddings, omniroute-web-search, omniroute-web-fetch -->

## Chat completions

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md) for setup.

### Endpoints

- `POST $OMNIROUTE_URL/v1/chat/completions` — OpenAI format
- `POST $OMNIROUTE_URL/v1/messages` — Anthropic Messages format
- `POST $OMNIROUTE_URL/v1/responses` — OpenAI Responses API

### Discover

```bash
curl $OMNIROUTE_URL/v1/models | jq '.data[].id'
```

Combos (e.g. `auto`, `cost-optimized`, `subscription`) auto-fallback through multiple providers.

### OpenAI format example

```bash
curl -X POST $OMNIROUTE_URL/v1/chat/completions \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-opus-4-7",
    "messages": [{"role": "user", "content": "Refactor this function"}],
    "stream": true
  }'
```

### Anthropic format example

```bash
curl -X POST $OMNIROUTE_URL/v1/messages \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-opus-4-7",
    "max_tokens": 4096,
    "messages": [{"role": "user", "content": "Hi"}]
  }'
```

### Tool use

Supports OpenAI `tools` array and Anthropic `tools` block. Tool results
auto-compressed via RTK (47 filters: git-diff, grep, test-jest, terraform-plan,
docker-logs, etc.) — 20-40% token savings. Disable per-request with
`X-Omniroute-Rtk: off` header.

### Reasoning / thinking

Anthropic extended thinking and OpenAI Responses reasoning blocks are forwarded
verbatim. Cached automatically via reasoning cache.

### Errors

- `401` → invalid API key
- `400 invalid_model` → model not in registry; check `/v1/models`
- `503 circuit_open` → provider circuit breaker tripped; retry later or use combo
- `429 rate_limited` → honor `Retry-After`; consider using a combo for auto-fallback

## Image generation

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md) for setup.

### Endpoints

- `POST $OMNIROUTE_URL/v1/images/generations` — Text-to-image
- `POST $OMNIROUTE_URL/v1/images/edits` — Image edit (mask)
- `POST $OMNIROUTE_URL/v1/images/variations` — Variations

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/image | jq '.data[]'
```

Returns `{ id, owned_by, sizes:[...], capabilities:[...] }` per model.

### Generate example

```bash
curl -X POST $OMNIROUTE_URL/v1/images/generations \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "dall-e-3",
    "prompt": "a red bicycle on a wet street, photoreal",
    "n": 1,
    "size": "1024x1024",
    "response_format": "b64_json"
  }'
```

Response: `{ created, data: [{ url? or b64_json, revised_prompt }] }`

### Errors

- `400 invalid_size` → not supported by this model; check `/v1/models/image`
- `400 content_policy_violation` → blocked by provider safety
- `503` → provider unavailable; try another model in `/v1/models/image`

## Text-to-speech

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md) for setup.

### Endpoint

- `POST $OMNIROUTE_URL/v1/audio/speech` — returns binary audio (mp3/opus/wav/flac)

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/tts | jq '.data[]'
```

Each entry includes `voices:[...]` for the available voice names per provider.

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/audio/speech \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tts-1",
    "input": "Hello from OmniRoute.",
    "voice": "alloy",
    "response_format": "mp3"
  }' --output speech.mp3
```

### Voices

Voice names vary by provider. Check `/v1/models/tts` — each entry has `voices:[...]`.
Common OpenAI voices: `alloy`, `echo`, `fable`, `onyx`, `nova`, `shimmer`.

### Errors

- `400 invalid_voice` → voice not supported by this model
- `400 input_too_long` → input exceeds model character limit
- `503` → provider unavailable; try another model in `/v1/models/tts`

## Speech-to-text

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md) for setup.

### Endpoints

- `POST $OMNIROUTE_URL/v1/audio/transcriptions` — multipart upload, returns text
- `POST $OMNIROUTE_URL/v1/audio/translations` — transcribe + translate to English

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/stt | jq '.data[]'
```

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/audio/transcriptions \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -F "file=@audio.mp3" \
  -F "model=whisper-1" \
  -F "response_format=verbose_json"
```

Response: `{ text, language, duration, segments?:[{ start, end, text }] }`

### Supported formats

Audio: `mp3`, `mp4`, `mpeg`, `mpga`, `m4a`, `wav`, `webm`.
Response formats: `json`, `text`, `srt`, `verbose_json`, `vtt`.

### Errors

- `400 invalid_file_format` → unsupported audio format
- `400 file_too_large` → exceeds provider limit (usually 25MB)
- `503` → provider unavailable; try another model in `/v1/models/stt`

## Embeddings

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md) for setup.

### Endpoint

- `POST $OMNIROUTE_URL/v1/embeddings`

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/embedding | jq '.data[]'
```

Each entry: `{ id, owned_by, dimensions, max_input_tokens }`.

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/embeddings \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-embedding-3-large",
    "input": ["first text", "second text"],
    "encoding_format": "float"
  }'
```

Response: `{ data:[{ embedding:[...], index }], usage:{ prompt_tokens, total_tokens } }`

### Batch input

`input` accepts a string or array of strings (up to provider batch limit, typically 2048 items).

### Errors

- `400 input_too_long` → input exceeds `max_input_tokens` for this model
- `400 invalid_encoding_format` → use `float` or `base64`
- `503` → provider unavailable; try another model in `/v1/models/embedding`

## Web search

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md) for setup.

### Endpoint

- `POST $OMNIROUTE_URL/v1/web/search` — unified search format

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/web | jq '.data[] | select(.kind == "webSearch")'
```

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/web/search \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "tavily/search",
    "query": "OmniRoute github latest release",
    "max_results": 5,
    "include_answer": true
  }'
```

Response: `{ answer?, results:[{ url, title, content, score }] }`

### Parameters

| Field            | Type    | Description                          |
| ---------------- | ------- | ------------------------------------ |
| `model`          | string  | Provider model from `/v1/models/web` |
| `query`          | string  | Search query                         |
| `max_results`    | number  | Max results (default: 5)             |
| `include_answer` | boolean | Include AI-synthesized answer        |
| `search_depth`   | string  | `basic` or `advanced` (Tavily)       |

### Errors

- `400 query_too_long` → shorten the search query
- `503` → provider unavailable; try another model in `/v1/models/web`

## Web fetch

Requires `OMNIROUTE_URL` and `OMNIROUTE_KEY`. See [entry-point SKILL](https://raw.githubusercontent.com/diegosouzapw/OmniRoute/main/skills/omniroute/SKILL.md) for setup.

### Endpoint

- `POST $OMNIROUTE_URL/v1/web/fetch`

### Discover

```bash
curl $OMNIROUTE_URL/v1/models/web | jq '.data[] | select(.kind == "webFetch")'
```

### Example

```bash
curl -X POST $OMNIROUTE_URL/v1/web/fetch \
  -H "Authorization: Bearer $OMNIROUTE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "jina/reader",
    "url": "https://anthropic.com",
    "format": "markdown"
  }'
```

Response: `{ url, title, markdown, links?:[...], images?:[...] }`

### Parameters

| Field    | Type   | Description                                                             |
| -------- | ------ | ----------------------------------------------------------------------- |
| `model`  | string | Provider from `/v1/models/web` (e.g. `jina/reader`, `firecrawl/scrape`) |
| `url`    | string | URL to fetch                                                            |
| `format` | string | `markdown` (default), `html`, `text`                                    |

### Errors

- `400 invalid_url` → URL must be http/https
- `403 blocked` → provider blocked by target site; try a different model
- `503` → provider unavailable; try another model in `/v1/models/web`
<!-- skill:custom-end -->

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.