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).
