Changelog

Newest first. Dates are when the change reached production. Entries marked Upcoming are staged and not yet live.

Upcoming Upcoming#

Public API gets its own host and this documentation#

  • New host: https://api.lojiq.ai/v1 is the public API's address. The previous path form (/public/v1) keeps working on the new host as an alias. The private app API is not served on api.lojiq.ai.
  • docs.lojiq.ai: this site — guides, the full reference for all 45 endpoints, downloadable OpenAPI 1.2.0, Postman collection and SDK stubs.
  • Default rate limit set to 60 requests per minute per key.
  • API requests are free (previously each request was metered as one token). Calls and texts started through the API bill as in the app.
  • Keys can be created only by organization Owners and Admins; every creation, rotation and revocation is audited. Rotate issues a replacement key in one step.
  • Sandbox organizations with lojiq_test_ keys; GET /account gains sandbox and key_mode.
  • One error envelope on every non-2xx answer: { error, message?, request_id }, with X-Request-Id on every response including 401 and 429. Storage error text no longer appears as error; Lojiq-side failures are 500 internal_error. Ids from another organization answer 404 on updates as well as reads. Unknown paths answer 404 not_found with a docs link.
  • Idempotency-Key on POST /leads, POST /calls and POST /agents/{id}/calls: a retried request never creates a second lead or places a second call.
  • Leads: phone_number is canonicalised to E.164 on create and in the phone_number filter; writes take an allow-list (400 unknown_field:<name>) and gain credit_score, annual_income, notes; phone_number is immutable on PATCH; campaign_id must be yours (404 campaign_not_found); GET /leads gains a status filter and returns full_name, consent_source, consented_at, updated_at; POST /leads/bulk caps the CSV at 5,000,000 bytes (413).
  • Campaigns: GET /campaigns works again (it selected a column that did not exist), is paged and filters by status; start/stop go through the same service as the app's Resume/Pause buttons, only move paused ↔ active (409 campaign_not_resumable / campaign_not_active otherwise), answer 402 insufficient_balance when the wallet is empty and report changed.
  • Calls: GET /calls and GET /agents/{id}/calls return created_at (not started_at), call_outcome, disposition and duration_seconds; GET /calls/{id}/transcript works again and falls back to the call's transcript text and summary.
  • Appointments: list filters by status and lead_id and returns campaign_id, duration_minutes, timezone, source; cancel stores reason (500 characters).
  • Voices: preview_url is an absolute https://api.lojiq.ai/v1/… URL.
  • Not yet available: GET/POST /contacts, GET /deals and PATCH /deals/{id} answer 501 feature_unavailable until their storage exists; they stay in the reference with the badge.
  • POST /leads/bulk and all webhook endpoints are backed by the storage this release provisions.

On the roadmap#

  • call.completed and lead.disposition_changed for campaign and receptionist calls (today they fire only for API-initiated actions); call.ended.
  • Read the per-row errors of a bulk import (GET /leads/bulk/{job_id}); asynchronous bulk import for large files.
  • Webhook delivery log and test ping (GET /webhooks/{id}/deliveries, POST /webhooks/{id}/test); signed, expiring recording links.
  • Managed Agents API; native Zapier app; usage reporting endpoints.

2026-07-03 — Voice agents, wave 2#

  • max_duration_seconds on templates and calls (60–7200 s; browser calls default to 30 minutes).
  • Organization concurrency cap enforced on call creation (429 concurrency_limit_reached).
  • Inbound numbers: POST/DELETE /agents/{id}/phone-number with inbound_webhook_configured.
  • Browser voice SDK at /sdk/voice.js.
  • Hardening from an adversarial review: transcript endpoint checks the call belongs to your organization before reading; voice previews use fixed sample text; from numbers must be owned by your organization.

2026-07-02 — Voice agents#

  • New: GET/POST /agents, GET/PATCH/DELETE /agents/{id}, POST /agents/{id}/calls, GET /agents/{id}/calls, POST /calls, POST /calls/{id}/hangup, GET /calls/{id}/recording, GET /voices, GET /voices/{id}/preview, GET /account.
  • New scopes: agents:read, agents:write, voices:read, account:read.
  • Provider-neutral call template (system_prompt, voice, temperature, first_speaker, recording_enabled, greeting) with {{variable}} substitution from template_context.
  • Phone calls go through the same carrier stack, answering-machine detection and DNC check as campaign calls.

2026-06-25 — Token metering#

  • Calls started through the API bill tokens on completion like app calls; 402 insufficient_balance on creation when the balance is exhausted.

2026-05-15 — Public API v1#

  • First release: API keys with scopes and per-key rate limits; X-Request-Id on every response.
  • Leads (GET/POST /leads, GET/PATCH /leads/{id}, POST /leads/bulk, POST /leads/inspect-csv, GET /leads.csv), contacts, campaigns (start/stop), calls and transcripts, deals, appointments.
  • Outbound webhooks: subscriptions, GET /event-catalog, HMAC-SHA256 signatures (X-Lojiq-Signature-256), 8-attempt retry schedule, auto-disable after 25 consecutive failures, SSRF-safe target validation.
  • Reference files: /openapi.yaml, /getting-started.md, /docs.