VendoVendo Docs
Build a toolvendo.yaml

Integrations

Declare the providers your tool calls so Vendo can bind tenant connections and inject the right env vars at boot.

integrations: lists every provider your tool talks to. It tells the platform "this tool calls these providers, please bind a tenant connection for each one and inject the resulting env vars before my container boots."

The field is optional. If your tool calls no third-party providers, omit it entirely (or set it to []).

Shape

Each entry is a plain integration slug string:

integrations:
  - openrouter
  - telegram
  - composio

That's the whole schema in vendo.yaml. The slug is the canonical ID used in the proxy subdomain ({slug}-proxy.vendo.run), the connections table, and the env var registry.

Richer per-integration metadata (profile, cardinality, optional, declared env-var names, OAuth callback paths, webhooks) lives in the template manifest (templates/<slug>/<version>.json in vendo-templates), not in vendo.yaml. The CLI schema for vendo.yaml accepts string slugs only — putting an object here fails validation. See Deploy & publish → Manifest for the rich form.

What gets injected at runtime

Each provider declares its own env-var set in packages/integrations/<slug>/integration.ts::connectionEnvVars. For example, declaring openrouter causes OPENROUTER_API_KEY (a vendo_sk_* proxy key, not a raw OpenRouter key) and OPENROUTER_BASE_URL (the Vendo proxy endpoint) to be injected. Declaring telegram injects the tenant's bot token.

Your tool reads these like ordinary env vars:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["OPENROUTER_API_KEY"],
    base_url=os.environ["OPENROUTER_BASE_URL"],
)

You don't list the env vars in vendo.yaml. The platform owns the provider→env-var mapping centrally so every tool gets the same names and a provider can add or rename a var without every tool rewriting its manifest.

The full env-var set each provider exposes is on that provider's page in Integrations.

Required vs optional

Whether an integration is required for a tenant to finish the deploy wizard is determined by the template manifest's wizard layout, not by vendo.yaml. In vendo.yaml you just declare that the tool talks to the provider.

When an integration is wired as optional in the template, the wizard offers it but lets the tenant skip. Your code must defend against the env var being missing:

const stripeKey = process.env.STRIPE_SECRET_KEY;
if (!stripeKey) {
  console.warn("Stripe not configured — checkout disabled");
}

A good rule of thumb: required = the tool literally cannot start without it (e.g. the LLM provider for an AI tool). Optional = a feature degrades gracefully if missing.

Webhooks and inbound calls

If your tool needs to receive inbound calls from a provider (e.g. Telegram updates, Composio events), declaring the integration is enough — Vendo's hooks worker routes https://hooks.vendo.run/{connection-id} to your deployment automatically. You don't list webhook paths in vendo.yaml. The mechanism and how to verify inbound requests is covered in the SDK's webhook docs.

Restart behavior

When a tenant rebinds a connection — say, swapping their Telegram bot token — the deploy worker updates deployment_env_vars. To also restart your container so a long-lived client picks up the new value, list the slug in restart_on:.

Adding a provider that isn't in the catalog

You can't. Providers are defined centrally in Vendo's integrations registry; arbitrary OAuth or API integrations aren't accepted on a per-tool basis. If you need a provider that doesn't exist yet, open an issue describing the auth model and what env vars the tool needs at runtime.

On this page