Skip to main content
Audact
See the offer

Base URL — one host, not seven

Audact exposes a single public base URL for all services. Learn how path routing works and how to configure the SDKs.

Audact exposes a single public base URL: https://api.audact.ai/v1. There is no need to configure a different hostname or port per service.

How it works

  • Twelve independent services (policy-engine, validator, evidence-layer, llm-proxy, tenant-management, audio-validator, aggregator, voice-gateway, agent-worker, webhook-worker, kb-worker, org-management) each listen on their own internal port, but none of those ports is exposed publicly.
  • A single reverse proxy sits in front of all of them and path-routes every request to the correct backend service based on the URL prefix — e.g. /v1/validate* → validator, /v1/calls* → evidence-layer, /v1/agents*//v1/voices*//v1/tools* → agent-worker, /v1/org/* → org-management, and so on.
  • Routing is longest-prefix-first: more specific prefixes are matched before their broader parents (e.g. /v1/validate-audio* is checked before /v1/validate*).
  • The API reference reflects this: every operation, across every underlying service, is served from https://api.audact.ai/v1.

What this means for integrators

  • One base URL configuration value is all a client needs — there is no per-service host/port map to maintain in an SDK or integration.
  • The path prefix alone determines which service handles a request; clients should never need to know or care which of the backend services actually serves a given endpoint.
  • The only exception is browser/WebRTC signaling (/rtc/*), which is a LiveKit-specific path used only by the in-browser test-call widget, not a general API surface.

Configuring the SDKs

Point the SDK at the single host; it appends /v1/... itself. A trailing / or /v1 on the value is stripped.

typescript

import { AudactClient } from "@audactcore/sdk";

const client = new AudactClient({
  apiKey: process.env.AUDACT_API_KEY!,
  baseUrl: "https://api.audact.ai",
});

python

from audact import AudactClient

client = AudactClient(api_key="...", base_url="https://api.audact.ai")

Per-service overrides (serviceUrls in TypeScript, <service>_url= in Python) are only needed for local stacks where each service listens on its own port, and they take precedence over the base URL.

Error envelope

Every error response from every service uses the same body shape:

json

{
  "error": {
    "code": "INVALID_COUNTRY",
    "message": "Country code 'XX' is not supported",
    "hint": "Use an ISO 3166-1 alpha-2 code such as NL or DE",
    "details": {"supported_countries": ["NL", "DE"]},
    "request_id": "req_abc123"
  }
}

code and message are always present. hint, details and request_id may be absent (they are omitted when empty). Quote request_id when contacting support. Rate-limited (429) responses also carry a Retry-After header. The SDKs surface these fields on their error types (for example err.code and err.requestId in TypeScript).

Source updated: October 19, 2026