QVeris Documentation


What is QVeris

QVeris is the capability routing network for agents. It lets your agent:

  • Discover capabilities (APIs, data sources, automations) using natural language — free
  • Inspect candidate capabilities to compare parameters, success rate, latency, and price
  • Call any capability with structured parameters and get structured results back

QVeris works well in agent loops (Discover → Inspect → Call → feed results back to the model) and supports multiple integration styles.

Cost: Discover is free. Call costs 1–100 credits per invocation, priced by data and task value. Free tier includes 1,000 credits. Details at qveris.ai/pricing.


Quick start

There are three ways to use QVeris.

Use QVeris MCP anywhere MCP is supported

If your client supports Model Context Protocol (MCP), you can add the official QVeris MCP server and immediately get:

  • search_tools (Discover)
  • get_tools_by_ids (Inspect)
  • execute_tool (Call)

For the full MCP reference, see MCP Server documentation.

Configure (Cursor / any MCP client)

{
  "mcpServers": {
    "qveris": {
      "command": "npx",
      "args": ["-y", "@qverisai/mcp"],
      "env": {
        "QVERIS_API_KEY": "your-api-key-here"
      }
    }
  }
}

Try it

“Discover a weather capability and get the current weather in Tokyo”

The assistant will:

  • call search_tools to discover matching capabilities (e.g. “weather”)
  • optionally call get_tools_by_ids to inspect the best candidate
  • call execute_tool with the capability id + parameters

Use the QVeris Python SDK

Get it from github and install:

pip install qveris

Set environment variables:

  • QVERIS_API_KEY (from QVeris)
  • OPENAI_API_KEY (or your OpenAI-compatible provider key)
  • OPENAI_BASE_URL (optional; for OpenAI-compatible providers)

Minimal streaming example:

import asyncio
from qveris import Agent, Message

async def main():
    agent = Agent()
    messages = [Message(role="user", content="Discover a weather capability and check New York weather.")]
    async for event in agent.run(messages):
        if event.type == "content" and event.content:
            print(event.content, end="", flush=True)

if __name__ == "__main__":
    asyncio.run(main())

Directly call the QVeris REST API

Base URL

https://qveris.ai/api/v1

Authentication

Send your API key in the Authorization header:

Authorization: Bearer YOUR_API_KEY

1) Discover capabilities

POST /search

cURL

curl -sS -X POST "https://qveris.ai/api/v1/search" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"query\":\"weather forecast API\",\"limit\":10}"

You’ll get a search_id and a list of capabilities (each with tool_id, params schema, examples, etc.).

Python

import os
import requests

API_KEY = os.environ["QVERIS_API_KEY"]

resp = requests.post(
    "https://qveris.ai/api/v1/search",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={"query": "weather forecast API", "limit": 10},
    timeout=30,
)
resp.raise_for_status()
data = resp.json()
print(data["search_id"])
print(data["results"][0]["tool_id"] if data.get("results") else None)

TypeScript

const apiKey = process.env.QVERIS_API_KEY!;

const resp = await fetch("https://qveris.ai/api/v1/search", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ query: "weather forecast API", limit: 10 }),
});

if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
const data = await resp.json();
console.log(data.search_id);
console.log(data.results?.[0]?.tool_id);

2) Inspect capabilities

POST /tools/by-ids

Before calling, you can inspect one or more capabilities to see full details (parameters, success rate, latency, etc.).

cURL

curl -sS -X POST "https://qveris.ai/api/v1/tools/by-ids" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"tool_ids\":[\"openweathermap.weather.execute.v1\"],\"search_id\":\"YOUR_SEARCH_ID\"}"

Python

resp = requests.post(
    "https://qveris.ai/api/v1/tools/by-ids",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "tool_ids": ["openweathermap.weather.execute.v1"],
        "search_id": "YOUR_SEARCH_ID",
    },
    timeout=30,
)
resp.raise_for_status()
print(resp.json())

TypeScript

const resp = await fetch("https://qveris.ai/api/v1/tools/by-ids", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    tool_ids: ["openweathermap.weather.execute.v1"],
    search_id: "YOUR_SEARCH_ID",
  }),
});

if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
const data = await resp.json();
console.log(data.results);

Returns the same schema as /search — full capability details including params, examples, and stats.

3) Call a capability

POST /tools/execute?tool_id={tool_id}

cURL (call the capability returned by Discover results)

curl -sS -X POST "https://qveris.ai/api/v1/tools/execute?tool_id=openweathermap.weather.execute.v1" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"search_id\":\"YOUR_SEARCH_ID\",\"parameters\":{\"city\":\"London\",\"units\":\"metric\"},\"max_response_size\":20480}"

If output exceeds max_response_size, the response includes truncated_content plus a temporary full_content_file_url.

Python

import os
import requests

API_KEY = os.environ["QVERIS_API_KEY"]

tool_id = "openweathermap.weather.execute.v1"  # from Discover results
search_id = "YOUR_SEARCH_ID"  # from /search response

resp = requests.post(
    f"https://qveris.ai/api/v1/tools/execute?tool_id={tool_id}",
    headers={
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    },
    json={
        "search_id": search_id,
        "parameters": {"city": "London", "units": "metric"},
        "max_response_size": 20480,
    },
    timeout=60,
)
resp.raise_for_status()
print(resp.json())

TypeScript

const apiKey = process.env.QVERIS_API_KEY!;

const toolId = "openweathermap.weather.execute.v1"; // from Discover results
const searchId = "YOUR_SEARCH_ID"; // from /search response

const resp = await fetch(
  `https://qveris.ai/api/v1/tools/execute?tool_id=${encodeURIComponent(toolId)}`,
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${apiKey}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      search_id: searchId,
      parameters: { city: "London", units: "metric" },
      max_response_size: 20480,
    }),
  }
);

if (!resp.ok) throw new Error(`HTTP ${resp.status}: ${await resp.text()}`);
const data = await resp.json();
console.log(data);

How to get an API key

  1. Go to QVeris
  2. Sign in / create an account (free, 1,000 credits on signup)
  3. Create an API key
  4. Use it as:
    • QVERIS_API_KEY env var (MCP / Python SDK), or
    • Authorization: Bearer ... header (REST API)

Use this (copy/paste) in your assistant’s system prompt when enabling QVeris tools:

You are a helpful assistant that can dynamically discover and call capabilities to help the user. First think about what kind of capabilities might be useful to accomplish the user's task. Then use the search_tools tool with a query describing the capability, not the specific parameters you will pass later. Then call suitable capabilities using the execute_tool tool, passing parameters through params_to_tool. If a capability has success_rate and avg_execution_time, consider them when selecting which to call. You can reference the examples given for each capability. You can make multiple tool calls in a single response.

Open Ecosystem

QVeris’s core engine is a managed service. All client-side tooling (MCP server, SDK, skills, plugins) is open source: