Changelog
Dated changes to the Autonomous Relay Agents API and model catalogue. New endpoints, routing changes and catalogue updates that affect how you integrate.
- Added — The Notion connector: Connect a Notion workspace under Connections, from the Discover tab: you choose which pages it may see on Notion’s own consent screen. It is read-only, with two tools, search_pages and read_page, which a request offers the model with {"type": "autonomousrelay:plugin", "plugin": "notion"}; the model sees them as plugin__notion__search_pages and plugin__notion__read_page.
- Added — The Pro and Business plans: Two plans beside Team. Pro, $29 a month, is for one developer: guardrails, usage alerts, exports, presets and classifiers. Business, $399 a month, is everything in Team plus single sign-on and SCIM, which until now needed an Enterprise contract. Choose or change a plan under Settings → Plan; existing Team subscriptions are unchanged.
- Changed — Zero data retention and no-training are no longer routing requirements: No endpoint declares its retention or training terms, so requiring either refused every model. Whether a provider keeps or trains on your prompts is set by your own agreement with it. A request with provider.zdr = true or provider.data_collection = "deny", a guardrail with enforce_zdr set to true, and a PUT /v1/privacy with zdr, zdr_groups or deny_training set are now a 400 that says so; the values that switch them off are still accepted. Settings already saved were cleared, so keys they blocked are served again. GET /v1/privacy no longer returns zdr, zdr_groups, deny_training or groups, and model endpoints no longer return dataPolicy.
- Changed — Spend ceilings count spend on your own provider keys: Key ceilings, guardrail budgets and workspace budgets now count each request at the provider’s list price by default, so a $50 monthly ceiling stops a key at $50 of what your provider bills. Limits that already existed count it too: a hard ceiling already past its cap refuses that key’s next request. POST /v1/keys accepts include_byok_in_limit; set it, include_byok_in_budgets or include_byok to false to count only platform spend.
- Changed — Unknown routes answer the standard error envelope: A request to a route that does not exist now answers 404 with the same envelope as every other error, {"error": {"code": 404, "message": "Not found", "metadata": {"error_type": "not_found"}}}, instead of {"message", "error", "statusCode"}. Read error.metadata.error_type as you do for any other error.
- Added — GET /v1/free-tier: Whether this deployment serves the free models without a provider key of your own: available, the daily limit per organisation, and the models it applies to. Public, cached for a minute.
- Added — Who built a plugin, and testing your own: Every marketplace listing now says who built it: Official for Autonomous Relay’s own plugins, the publisher’s name for everyone else, and listings and installs carry official and built_by. If you publish a plugin, its Publish tab has Connect to test and Install to test, so you can try it in your own organisation before it is listed. Renaming the publisher of a listed plugin sends it back to review.
- Added — Per-key rate limits: Set rpm_limit (requests per minute) and tpm_limit (tokens per minute) on an inference key with POST /v1/keys or PATCH /v1/keys/{hash}, or on the API keys page. They apply to chat completions and to the other inference routes. Past a limit the answer is a 429 rate_limited, with x-ratelimit-* headers and retry-after.
- Added — Prometheus metrics: GET /v1/metrics returns your organisation’s own usage in the Prometheus text format: requests, tokens and billed spend by model and provider for the month to date, a request-duration histogram and the number of active keys. Scrape it with a management key that has usage:read; a seat limited to some workspaces sees only those.
- Added — Audit log: Owners and Admins can see who changed what, and when: keys, BYOK credentials, guardrails, members and invitations, SSO and SCIM, broadcast destinations, plugin installs, workspaces and organisation settings. Find it under Audit log in the dashboard, or page through GET /v1/audit-log, filtered by action, category or actor. Entries are kept for a year.
- Changed — PII redaction on every plan: The built-in detectors (email addresses, phone numbers, social security numbers, card numbers, IP addresses and secrets) now redact on every plan, Solo included, across the whole organisation: turn them on from the Guardrails page or with PUT /v1/guardrails/redaction. Custom patterns, block mode and per-workspace, per-key or per-member policies stay on Team.
- Added — Cohere, AI21 Labs and SambaNova: Three more providers on your own key, with ten models: Cohere’s Command R, Command R7B and Embed models; AI21’s Jamba Large and Jamba Mini; and, on SambaNova, MiniMax, DeepSeek, gpt-oss-120b and Meta’s Llama 70B Instruct.
- Added — Score a generation: POST /v1/generation/feedback with a request’s id, a value from -1 to 1 (thumbs down is -1, thumbs up is 1) and an optional label records how your users rated an answer. GET /v1/feedback/summary averages the scores by model, and Activity shows them in a Feedback by model table. A score carries no free text.
- Added — Broadcast to Langfuse, Datadog and S3: Broadcast can now send each request’s metadata to Langfuse as a trace, to Datadog as a log, or to S3-compatible storage such as AWS S3, Cloudflare R2, Backblaze B2 or MinIO, as JSON Lines files in hourly folders. Set them up on the Observability page. A delivery that fails on the network, a 429 or a 5xx is now tried up to three times.
- Added — Price history for every model: Each model page now has a Price history section: the input and output price in force from each date a price changed. The same series, per provider, is public at GET /v1/models/{author}/{slug}/price-history.
- Added — Follow the catalogue, and this page, by feed: This changelog now has an RSS feed at /changelog.xml, and a live In the catalogue, the last 30 days section listing the models added and every price that rose or fell, with the before and after. GET /v1/catalog/changes returns the same, over 1 to 90 days.
- Added — Self-hosted deployment for Enterprise: Enterprise customers can run Autonomous Relay inside their own network, with a Docker Compose file or a Helm chart that run the same gateway image we do. The operator guide at /docs/self-host lists every setting and covers upgrades and backups. BYOK credentials in production still use Google Cloud KMS.
- Added — The plugin marketplace: Install tools other developers build, under Plugins in the dashboard, then add {"type": "autonomousrelay:plugin", "plugin": "<slug>"} to tools: the model sees the plugin's tools and the gateway calls them inside the request. A plugin signs in with a key its developer gives you or with OAuth, so it can reach your account elsewhere, such as Google, on your behalf. Developers host their plugin as an MCP server and list it through review; the guide is at /docs/plugins.
- Added — OpenAI Flex and Fast processing: service_tier is now forwarded to OpenAI: flex runs at Batch rates when OpenAI has room, and priority (or fast) buys faster processing at a per-token premium. Only OpenAI models with a published price for the tier take it; elsewhere the request runs at standard. You are billed at the tier OpenAI reports serving at.
- Added — Your own MCP servers as tools: Register your MCP server with POST /v1/mcp-servers (a public https URL and an optional credential, sealed at rest), then add {"type": "autonomousrelay:mcp", "server": "<name>"} to tools: the model sees its tools and the gateway calls them inside the request, on your credential. GET /v1/mcp-servers/{id}/tools checks a registration live.
- Added — Web search on GPT and Grok: The web plugin now also runs OpenAI’s and xAI’s own search, on GPT-5 and later and Grok 4 models, at $10 and $5 per 1,000 searches on your own key. allowed_domains and excluded_domains work there too (at most 5 on Grok).
- Added — Web search plugin: Add {"id": "web"} to plugins and the model searches the web with its provider’s own search: Anthropic’s web search tool on Claude models, Google Search grounding on Gemini 3 models. Each search is billed at the provider’s price ($10 or $14 per 1,000) on your own key, and counted in your usage and budgets. max_uses and allowed_domains or excluded_domains apply on Claude.
- Added — Moderation plugin: Add {"id": "moderation"} to plugins and the input is checked by OpenAI’s omni-moderation-latest, on your organisation’s own OpenAI key, before any provider sees it; "output": true checks the answer too (not on streams). A flag is a 403 with error_type moderation_flagged and the categories as reasons. If the check cannot run, the request is not sent.
- Added — Auto router: autonomousrelay/auto: Send "model": "autonomousrelay/auto" and the router picks a paid model you can route to, from what the request needs and a cost tier (low by default, up to max), with two fallbacks from the same tier. Narrow it with the auto-router plugin’s allowed_models and excluded_models. It reads nothing in your prompt and keeps nothing about it.
- Added — Batches on Grok: POST /v1/batches now runs through xAI’s Batch API too, at its batch price (20% off on the models xAI discounts, such as x-ai/grok-4.3), on your own xAI key.
- Added — Batches on Gemini, Mistral and Qwen: POST /v1/batches now also runs through Google’s Gemini batch mode, Mistral’s batch jobs and Alibaba Model Studio’s Batch API, at their batch prices, on your own provider key. Name the model as before, e.g. mistralai/mistral-medium-3-5. A Gemini batch takes at most 19 MB of requests.
- Added — PDFs on any model: A PDF sent to a model that cannot open PDFs is now given to it as the PDF’s text, read on our side; models that read PDFs still get the file. Choose with the file-parser plugin (engine pdf-text or native). The answer carries the text back as an annotation, so a later turn can send it instead of the file. Scanned PDFs have no text to read: send those to a model that reads PDFs.
- Added — Evals: Run a dataset against up to eight models and compare their answers, cost and latency, from the new Evals page or POST /v1/evals. Every cell is a real request on your keys and routing, billed and logged like any other, scored by exact match, containment or valid JSON, and streamed as it completes. Nothing is stored.
- Added — Model collections: Browse the catalogue by what models do at /collections: free models, a million tokens of context, vision, documents, audio input, image and video generation, speech, embeddings and rerankers. Each opens the model list with its filter, and GET /v1/models accepts free=true.
- Added — Compare models: Put up to four models side by side at /compare: prices on their cheapest endpoint, context and output limits, modalities, tool calling, structured output and reasoning support, who serves them, and measured uptime. The models are in the link, so a comparison can be shared, and every model page links to it.
- Added — The apps directory: The rankings page now has an Apps view, and GET /v1/rankings/apps lists apps by tokens processed this week or month. An app is the domain its requests send in HTTP-Referer, shown by domain only, once it has 100 completed requests in the period. To stay off it, send X-App-Visibility: hidden on your app’s first request.
- Added — Model rankings: A public page, and GET /v1/rankings/models, ranking models by the tokens processed through the router today, this week, this month, and by their increase. It measures use, not quality, and says so. Only aggregates are shown, and a model appears once at least three organisations have used it in the period.
- Added — Batches at the providers’ batch prices: POST /v1/batches runs up to 10,000 chat requests through OpenAI’s Batch API or Anthropic’s Message Batches, on your own provider key, at their batch prices, about half the live price, within 24 hours. Poll the batch, then stream its results. The requests pass the same budgets, guardrails and content filters as live ones; the batch is billed once, when it ends; nothing of the requests or results is stored with us. Live requests to a :batch model now get a 400 that points here.
- Added — Workload identity federation: GitHub Actions runs, cloud workloads and Kubernetes service accounts can now call the API without a stored API key. They exchange the identity token their platform gives them for a token that lasts at most 15 minutes and acts as one of your keys, with its limits and workspace. Owners and admins set this up under Settings → Workload identity federation, on every plan; the guide is at /docs/federation.
- Added — Single sign-on with SAML: Single sign-on now works over SAML too, for identity providers or security teams that require it: Okta, Microsoft Entra ID, Google Workspace, ADFS and others. Choose SAML under Settings → Single sign-on, give your identity provider our entity ID and ACS URL, and upload its metadata file. The guide at /docs/sso has the steps for each provider.
- Added — Directory sync (SCIM): Enterprise organisations can connect Okta or Microsoft Entra ID to add and remove people automatically. People your IT assigns get a seat; people it deactivates lose it at once, while the API keys they created keep working and are marked on the Keys page. Directory groups map to the clients people see. Set it up under Settings → Directory sync; the guide is at /docs/scim.
- Added — Choose who sees each client: On the Clients page, People lists who has a role in each workspace. Add someone as a Member or a Workspace admin, change their role, or remove them, without the API. This is how you give people who sign in with SSO, or whose access is limited to workspaces, the clients they work on.
- Added — Single sign-on: Enterprise organisations can now sign in with their company identity provider: Okta, Microsoft Entra ID, Google Workspace or any OpenID Connect provider. Connect it under Settings → Single sign-on, verify your email domain with a DNS record, run a test sign-in and activate. You can then require it for everyone at your domain; owners keep their usual sign-in as a fallback. Members can now also set whether a Developer sees the whole organisation or only their workspaces. The step-by-step guide is at /docs/sso.
- Added — The Enterprise plan: Organisations on an annual Enterprise contract, invoiced through Stripe, now show as Enterprise under Settings → Plan. Enterprise includes everything in the Team plan; single sign-on and SCIM will be Enterprise features when they arrive.
- Added — The Team plan: Every organisation starts with a 14-day trial, and organisations that already exist get a fresh 14 days from today. After the trial the Team plan is $99 a month per organisation, for any number of members, and markup on inference stays 0%. Without it, inference on your own provider keys, your API keys, Activity, Logs and Members keep working. Creating or changing a Team feature (a second workspace, guardrails, presets, classifiers, alerts, client reports, exports, invitations) needs the plan. Anything you already set up keeps running. Subscribe or manage billing under Settings → Plan.
- Added — Workspace members: An owner can now limit a Developer or Read-only seat to the workspaces it is a member of: PATCH /v1/members/{userId} with scope: "workspaces", then PUT /v1/workspaces/{id}/members/{userId} with role admin or member. That person sees only those workspaces and their keys, activity, logs, exports and reports; a workspace admin can also rename it, set its budgets and manage its members. Seats you already have keep seeing the whole organisation. Workspaces also take an optional description. API only for now.
- Added — Price-drop alerts: An alert channel can now receive price_drop events: when a model your organisation used in the last 30 days gets cheaper for input or output tokens, you are told once, within 15 minutes, with the old and new price per million tokens. Opt in with events: ["usage", "price_drop"] when creating a channel, or PATCH /v1/alerts/channels/{id} for an existing one; its signing secret is kept. Channels you already have receive usage alerts only, as before.
- Changed — Sorts apply to your own keys: provider.sort (price, throughput, latency, exacto) and the :floor and :nitro suffixes now order the endpoints served on your own provider keys too. They used to apply only to platform capacity, so with your own keys they changed nothing. Your key tiers still come first: a prioritized key is tried before platform capacity, and a fallback key after it, whatever the sort. With no sort, your keys keep the order you gave them.
- Added — IP allowlist: PUT /v1/ip-allowlist limits every key in your organisation to the address ranges you list, IPv4 or IPv6, up to 100. A request from anywhere else is refused with a 403 that names its address. A list that would shut out the address saving it is refused, and an empty list turns the allowlist off. GET /v1/ip-allowlist shows the list and the address the gateway sees for you.
- Added — Keys can expire: POST /v1/keys takes expires_at, and PATCH /v1/keys/{hash} sets, moves or removes it (null). After it, the key is refused with a 401. The time must carry a zone, be in the future and be within ten years. A key cannot be given an expiry from a request made with that same key.
- Added — Quality-first routing for tool calls: provider.sort now takes exacto, also written as the :exacto suffix: the endpoints whose tool calls most often come back valid are tried first, then the fastest, then the cheapest. A request with tools and no sort is ordered this way once any of its endpoints has a measured tool-call rate; sort: price or :floor keeps the cheapest first. sort: latency now orders by measured latency; it was accepted and ignored before.
- Added — Text to speech and speech to text: POST /v1/audio/speech returns the audio for a text, billed per character; POST /v1/audio/transcriptions returns the text of an audio file, billed per second of audio. Both use OpenAI’s request and response and the same routing, budgets and guardrails as everything else. Thirteen voice models, Kokoro, Qwen3-TTS, Inworld and Chatterbox among them, and six transcription models, Whisper and Qwen3-ASR among them, served by DeepInfra.
- Added — POST /v1/images/generations: Generate images with OpenAI’s request and response, routed through the same budgets, content filters and guardrails as everything else, returned as b64_json. Thirteen of DeepInfra’s text-to-image models, FLUX, Bria, Seedream, Qwen-Image and Wan among them, are billed at their published price per image or per megapixel; the endpoint listing shows each price and its unit. Models whose price cannot be computed from the request are not served yet.
- Added — POST /v1/rerank, and three Qwen3 rerankers: Score documents against a query, most relevant first, in the request and response shape Cohere and Jina share: top_n, return_documents, and an optional instruction. Routed and billed like embeddings, on the provider’s input-token count. Qwen/Qwen3-Reranker-0.6B, -4B and -8B are in the catalogue, served by DeepInfra.
- Added — POST /v1/completions: legacy text completions: For clients that still call the legacy completions API: the prompt is sent to any catalogue model as one user message, through the same routing, budgets and guardrails as chat completions, and the answer comes back as choices[0].text, streamed or not. One prompt per request; suffix, echo, best_of, n above 1 and logprobs are refused with a 400 rather than dropped.
- Added — POST /v1/responses: the OpenAI Responses API: The Responses API, streaming included, on any model, through the same routing, budgets, guardrails, presets and server tools as chat completions. It is stateless: send the whole conversation as input. store: true, previous_response_id, conversation and background are refused with a 400 that says so, rather than ignored.
- Added — POST /v1/messages: the Anthropic Messages API: Point an Anthropic SDK at this host and it works: the key in x-api-key, the request and response in Anthropic’s shape, and streaming as Anthropic’s events. Requests run through the same routing, budgets, guardrails, presets and server tools as chat completions, and any model can answer, not only Claude. Claude names such as claude-opus-4-8 resolve to catalogue ids; fallbacks takes up to three models.
- Added — POST /v1/embeddings: OpenAI-compatible embeddings, routed like a chat completion — model, a models fallback list and provider preferences — through the same budgets, content filters, guardrails and privacy policy, and billed on the provider’s prompt-token count. Only embedding models are candidates; naming a chat model is a 400 that says so. Input is a string or a list of strings; float or base64 output; dimensions where the model supports it.
- Added — Classifiers (beta): tag requests, and route them through a preset: Rules that tag each request from what it is — the model it names, its key, client, agent and app, whether it carries tools or images, streaming, and its size — never from what the prompt says. Tags are returned in x-agentsrouter-tags, stored on the request and filterable with GET /v1/activity?tag=. A rule can also send matching requests through a preset; a request naming its own @preset keeps it. /v1/classifiers, with an evaluate action to try a sample request.
- Added — Server tools: datetime and model search, run by the gateway: Declare {"type": "agentrouter:datetime"} or {"type": "agentrouter:experimental__search_models"} in tools[]: when the model calls one, the gateway runs it and feeds back the result, and your application receives only the final answer. Both are free; usage is reported in usage.server_tool_use and capped by max_tool_calls. Non-streaming requests only for now. GET and PUT /v1/tools list the catalogue and turn tools off per organisation; a tool that is off is refused with a 403.
- Added — Presets: versioned request settings, used as @preset/name: A preset is a named, versioned set of request settings — model or fallback models, temperature, top_p, top_k, max_tokens, seed, provider preferences, reasoning — that a request uses by sending "model": "@preset/<name>" (or @preset/<name>@<version> to pin one). The request’s own fields win. Every change is a new version and any version can be made current again. Settings only: messages and system prompts are not stored. /v1/presets and a Presets page in the dashboard.
- Added — Broadcast: each request’s record to your webhook or OpenTelemetry endpoint: POST /v1/broadcast adds a destination that receives a record of every request — model, provider, outcome, tokens, cost, timing, key name, client, agent, session and run, never the prompt or completion. A webhook gets signed JSON; an OpenTelemetry (OTLP/HTTP) endpoint such as Honeycomb or Langfuse gets one span per request with gen_ai attributes, and its API-key header is stored encrypted. Sent after the response, with sampling and a test action; the dashboard has an Observability page.
- Added — Routing defaults for the account: a default model, fallbacks and the provider sort: PUT /v1/routing sets, for every key in the organisation, a default model used when a request names none (instead of a 400), fallback models tried after the ones a request names, and the provider sort when a request sets none — lockable so a request cannot change it. Every model still passes guardrails, the privacy policy and BYOK. Owners and Admins only; the dashboard has a Routing page.
- Changed — A guardrail’s enforce_zdr is now enforced: A guardrail’s per-group enforce_zdr was stored and returned but not applied when routing. It is now: a key under such a guardrail is served only by endpoints that declare zero data retention for that model group, and is refused with a 404 naming the requirement otherwise. If you set enforce_zdr, check the models those keys use.
- Added — An account privacy policy, with an eligibility preview: PUT /v1/privacy sets requirements for every key in the organisation: zero data retention for every model or per model group, only endpoints that declare they do not train on prompts, and data regions. Each can only narrow routing, on top of guardrails, and a request cannot relax it. POST /v1/privacy/preview counts the models a policy leaves before you save it. Owners and Admins only; the dashboard has a Privacy page.
- Added — GET and PATCH /v1/org: the organisation, and renaming it: GET /v1/org returns the organisation’s id, name, slug, plan, creation date and number of seats; any role may read it. PATCH /v1/org {"name"} renames it, for Owners and Admins only. The dashboard has a Settings page for both.
- Changed — Runs can be read and stopped with a management key: GET /v1/runs, GET /v1/runs/{id}, and the close and resume actions now also accept a management key or a dashboard session, held to the person’s role: usage:read to look, config:write to close or resume. Opening a run still takes an inference key. GET /v1/runs takes ?status=, and a paused run can now be closed as well as resumed. The dashboard has a Runs page.
- Added — GET /v1/activity/{id}: one request in full: With a management key: the request’s routing and timing, the key that made it (by name and prefix), its client, agent, session and run, the usage lines it was billed on, and every provider attempt in order. The dashboard’s new Logs page opens it from any row.
- Changed — The API moved to autonomousrelay.com: The base URL is now https://autonomousrelay.com/v1, or https://api.autonomousrelay.com/v1. Requests to the old isync.ai addresses are redirected, but HTTP clients drop the Authorization header on a redirect to another host, so update your base URL. Keys, models and everything else are unchanged.
- Changed — Cached tokens are valued at the provider’s cache rate: Anthropic and OpenAI models now carry their published cache-read prices, and Anthropic models their 5-minute and 1-hour cache-write prices. A cached prompt token is counted at that rate in spend ceilings, budgets and activity, instead of the full input price. Each endpoint’s prices are listed by GET /v1/models/{author}/{slug}/endpoints.
- Added — Agent budgets per client workspace: PUT /v1/agents/{agent}/budgets/{interval} accepts workspace_id. The budget then binds only requests from that workspace’s keys, measured as that workspace’s spend for the agent, and an organisation-wide budget on the same agent still applies beside it. DELETE takes the same workspace_id as a query parameter.
- Added — A runaway-spend flag can pause the key: Set runaway_action to pause with PUT /v1/alerts/settings, and a key flagged for runaway spend is paused: it answers 403 key_paused until it is resumed with PATCH /v1/keys/{hash} and {"paused": false}, or from the Alerts or Keys page. A key can also be paused by hand the same way. Off by default, and an agent flag never pauses anything.
- Changed — Anthropic models take reasoning as extended thinking: On Anthropic models, reasoning with effort or max_tokens now turns on extended thinking with that budget, and a non-streaming reply returns the thinking as message.reasoning, as streaming already did with delta.reasoning. temperature, top_p and top_k are dropped while thinking is on, because Anthropic refuses them together.
- Added — Spend and budgets per agent: Name the agent on each request with the X-AgentsRouter-Agent header, and its spend is tracked across every key it uses. GET /v1/agents lists agents with their spend this month, and PUT /v1/agents/{agent}/budgets/{interval} sets a hard budget, which refuses with 403 budget_exceeded, or a soft one, which serves and adds a warning header.
- Added — Usage alerts and runaway-spend flags: Add a webhook, Slack or email channel with POST /v1/alerts/channels and be told when a key or an agent crosses 50, 80 or 100 percent of its spend limit. A key or agent whose last 15 minutes are far above its own previous 24 hours is flagged as spend.runaway on the same channels, and GET /v1/alerts/runaways lists the flags.
- Added — Client workspaces, exports and reports: Group keys into one workspace per client, each with its own budget, through /v1/workspaces. GET /v1/activity/export.csv exports a month of activity for one client, and GET /v1/workspaces/{id}/report returns a monthly client report that carries your own name, logo and footer.
- Added — Team seats and roles: Invite people with POST /v1/invitations and give each one a role: Owner, Admin, Developer, Finance or Read-only. Every management route checks the role of the person behind the dashboard session, so Finance can read billing without changing configuration.
- Changed — Failed requests say who failed: The activity log now records a router.* code in error_code when this gateway is what failed — a credential it could not open, a request it could not express — and leaves error_code to the provider’s own code when the provider answered. An attempt that broke mid-answer carries its reason on the upstream row. The errors count in the activity summary counts requests that ended with a code; before this it counted none, because no code was recorded.
- Changed — A model’s deprecation date is a calendar day: deprecation_date is sent as 2026-09-30 rather than as a timestamp at midnight UTC. A date is a day, and read as an instant it named the day before for anyone west of Greenwich.
- Added — Provider policy links in the catalogue: The provider directory now publishes each upstream’s privacy policy, terms of service and status page, where we could confirm them. Where we could not, the field stays empty rather than carrying a guess.
- Changed — The API description lists both production origins: openapi.json names https://isync.ai and https://api.isync.ai as its servers, so a client generated from the document targets the host it was fetched from.
- Changed — api.isync.ai serves the API only: The API hostname no longer returns the marketing site. Paths outside the API redirect to the documentation, so a mistyped path is visible as a mistake instead of answering with a page.
- Added — Preview a route before sending it: POST /v1/route/preview shows which endpoint would serve a request, and why each other candidate was set aside, without sending it or spending anything.