Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.tryvox.co/llms.txt

Use this file to discover all available pages before exploring further.

v3 Public Launch Audit Checklist

PR #12 작업용 내부 체크리스트입니다. v3 public launch 문서를 domains/voxai/api-server의 현재 구현과 맞춰 보고, endpoint별로 검증 상태를 체크하면서 수정합니다.

목표

v3 API reference와 관련 가이드가 current api-server public contract와 일치하도록 검증하고, 잘못된 예시, 설명, 스키마, 누락된 제약을 최소 수정으로 고칩니다.

작업 원칙

  • 먼저 이 파일에 증거와 상태를 기록합니다.
  • 문서 수정은 체크리스트에 근거를 남긴 뒤 수행합니다.
  • source of truth는 current api-server 코드, generated public OpenAPI, v3 schema, service validation, tests입니다.
  • 코드와 문서가 충돌하면 문서를 고칩니다.
  • 코드 contract 자체가 불명확하면 UNVERIFIED 또는 ISSUE로 남깁니다.
  • endpoint별 상태는 TODO, PASS, FIXED, ISSUE, UNVERIFIED 중 하나로 표시합니다.

Source Of Truth

항목위치
Docs PR branchdomains/voxai/docs, branch codex-v3-api-reference
Docs OpenAPIapi-reference/v3/openapi.json
Docs navigationdocs.json > API 참조 > v3
API serverdomains/voxai/api-server
v3 app mountapp/main.py
v3 routerapp/api/v3/router.py
v3 endpoint handlersapp/api/v3/endpoints/*.py
v3 schemasapp/api/v3/schemas/**
public OpenAPI generatorscripts/generate_v3_public_openapi.py
contract audit scriptscripts/v3_audit.py
v3 teststests/v3/**

Baseline Evidence

  • Checked out correct docs submodule branch: domains/voxai/docs > codex-v3-api-reference.
  • Read nearest AGENTS.md in domains/voxai/docs.
  • Read api-server AGENTS.md and ARCHITECTURE.md.
  • Generated current api-server public OpenAPI: uv run python scripts/generate_v3_public_openapi.py --output /tmp/current-v3-public-openapi.json --servers-from /Users/ryanhan/Documents/development/voxai/vox-mono/domains/voxai/docs/api-reference/v3/openapi.json
  • Compared docs OpenAPI operations against generated api-server operations.
  • Ran scripts/v3_audit.py against current docs OpenAPI: 7 blockers, 6 warnings, 1 info.
  • Replace stale docs OpenAPI after reviewing the generated diff.
  • Update docs.json navigation after reviewing missing public operations.
  • Re-ran API-side audit with the 4 confirmed-private flow helper endpoints passed as intentional excludes. Result: 0 blockers, 52 warnings, 1 info for accepted exclusions. Without those explicit excludes, current api-server still reports exactly those 4 endpoints as missing from public OpenAPI.
  • Run docs validation after edits.
  • Verified docs OpenAPI contract is equal to expected api-server OpenAPI after removing the 4 confirmed-private flow helper endpoints, pruning unreachable schemas, and ignoring docs-localized description/summary text.
  • Verified docs OpenAPI operation list equals v3 docs.json navigation operation list.
  • Verified stale v2 endpoint examples and versionless API reference links are gone from v3 launch guide pages; historical changelog entries intentionally keep v2 links where the release predates v3.
  • Patched scripts/sync-openapi.sh so future live OpenAPI syncs keep the 4 confirmed-private flow helper endpoints and their private-only schemas out of the docs snapshot.
  • Ran mint validate with Node 20.18 in PATH: build validation passed.
  • Ran mint broken-links with Node 20.18 in PATH: no broken links found.

Baseline Findings

StatusFindingEvidenceNext Action
PASSDocs OpenAPI has 58 operations; current api-server generated public OpenAPI has 62 before docs-side public-scope filtering.Re-generated api-server OpenAPI from current source: paths=45 ops=62 schemas=176 pruned_schemas=16. After removing the 4 confirmed-private helpers and pruning unreachable schemas, the filtered source contract has 58 operations and 161 schemas.Keep these endpoints out of public docs unless product scope changes.
FIXEDDocs OpenAPI/navigation included private flow operations after an over-broad generated-spec sync.Removed POST /agents/validate-flow-data, POST /agents/autofix-flow-data, POST /agents/{agent_id}/operations, and POST /flow-data/autofix from docs OpenAPI and v3 navigation.Consider aligning api-server generator/audit allowlist so these are treated like hidden routes.
FIXEDDocs sync script could reintroduce private flow helpers on the next live OpenAPI sync.scripts/sync-openapi.sh now deletes all 4 confirmed-private paths and their private-only component schemas before writing api-reference/v3/openapi.json.Keep docs-side filter until api-server generator/audit scope is aligned.
FIXEDGenerated OpenAPI descriptions were too English-heavy for the Korean public docs surface.Localized v3 operation descriptions, request-body descriptions, shared response descriptions, and high-visibility schema descriptions in api-reference/v3/openapi.json.Keep code identifiers and enum values in English, but avoid English prose in user-facing docs text.
ISSUEAPI-side generator/audit still treats the 4 flow helper endpoints as public candidates unless they are passed as intentional excludes.scripts/v3_audit.py exits 0 with the 4 explicit excludes, but exits 1 with exactly those 4 endpoint-parity blockers without them. The api-server companion PR was closed and removed from scope.Keep docs-side sync filter; revisit api-server generator/audit scope separately if product wants source tooling to encode this public/private split.
PASSEndpoint-by-endpoint docs surface review completed for 58 public operations.Docs OpenAPI is source-generated, private endpoints are excluded, examples validate, navigation matches OpenAPI, and scripts/v3_audit.py reports 0 blockers when the 4 confirmed-private helpers are passed as intentional excludes.Re-run the full pass before public launch if api-server v3 routes change.
Confirmed-private operations kept out of public scope:
  • POST /agents/autofix-flow-data
  • POST /agents/validate-flow-data
  • POST /agents/{agent_id}/operations
  • POST /flow-data/autofix
Audit warning triage:
  • UNREVIEWED_CAMEL_CASE_PROPERTY warnings are restricted to agent.data / flow_data payload internals and are documented as explicit compatibility exceptions in api-reference/v3/introduction.mdx.
  • ORG_ID_NOT_USED_IN_HANDLER warnings are limited to authenticated catalog reads (models, schemas, available telephone lines) and an excluded traffic split endpoint. Org-owned resources still require org context.
  • Knowledge endpoint import-boundary warnings are source architecture debt, but the public request/response schema is still generated from v3 response models and does not expose provider or persistence types.

Cross-Cutting Review Checklist

StatusAreaWhat To CheckEvidence
PASSPublic route inventoryEvery public api-server operation appears in docs OpenAPI and v3 navigation.Docs OpenAPI/nav are internally aligned at 58 operations after excluding 4 confirmed-private flow helper endpoints.
PASSHidden route pruningRoutes intentionally excluded from public launch stay hidden.scripts/sync-openapi.sh deletes the 4 confirmed-private helper paths and private-only schemas; audit reports 1 accepted-exclusion info when those helpers are passed as intentional excludes.
PASSAuthenticationAll operations document bearer organization API key auth.BearerAuth is present and no operation has empty security.
PASSError envelopeError responses use { "error": { "code", "message", "details" } }.scripts/v3_audit.py error envelope check passed for docs OpenAPI after excluding private endpoints.
PASSError codesEndpoint-specific error codes are present where available.scripts/v3_audit.py error code metadata check passed for docs OpenAPI after excluding private endpoints.
PASSPaginationList endpoints use cursor, limit, items, next_cursor, total_count.scripts/v3_audit.py pagination contract check passed for docs OpenAPI after excluding private endpoints.
PASSTimestamp format_at fields use unix ms; seconds compatibility is documented only where code supports it.scripts/v3_audit.py timestamp contract check passed for docs OpenAPI after excluding private endpoints.
PASSRequest examplesExamples validate against the generated request schema and service-level validation.Public OpenAPI has 12 JSON request examples; all 12 validate against their request schemas with jsonschema in the api-server uv environment.
PASSResponse schemasResponse schemas match endpoint response_model.Docs OpenAPI contract matches expected api-server generated OpenAPI after excluding 4 confirmed-private endpoints, pruning schemas, and ignoring localized description/summary text.
PASSPATCH semanticsPartial updates, null clearing, empty payload behavior, and nested object handling are accurate.scripts/v3_audit.py patch contract check passed for docs OpenAPI after excluding private endpoints.
FIXEDAgent data casingGeneral API uses snake_case; agent.data and flow_data camelCase exceptions are explicit.Updated api-reference/v3/introduction.mdx to mention both agent.data and flow_data camelCase exceptions.
PASSFlow dataNode/edge examples use canonical runtime fields accepted by validator.POST /agents flow example validates against generated request schema; private flow helper endpoints are excluded from public docs.
PASSKnowledge IDsPublic docs consistently use numeric knowledge_id, not UUID.OpenAPI path params use integer knowledge_id; AgentKnowledge.knowledgeIds and NodeKnowledgeConfig.knowledgeIds describe numeric public IDs from GET /v3/knowledges; strict request validation tests exist in tests/v3/unit/test_knowledge_strict_validation.py.
PASSOrg scopeCross-resource references are org-scoped, or marked UNVERIFIED.scripts/v3_audit.py reference scope check passed. Resource handlers use auth.require_organization_id(); agent runtime references validate LLM/voice/tool/knowledge refs with org context; model/schema catalog endpoints are authenticated public catalog reads.
FIXEDGuidesGuide pages do not point users to stale v2 endpoints for v3 launch flows.Updated docs/build/variables/dynamic-variables.mdx from v2 calls/campaigns examples to v3 request shape.
FIXEDLinksAPI reference links point to /api-reference/v3/introduction or exact v3 endpoint pages.Updated guide links to /api-reference/v3/introduction; exports.mdx now points to GET /calls and GET /calls/{call_id} instead of a nonexistent v3 export endpoint.
PASSBuild validationMintlify/docs validation passes or failure is recorded.PATH="/Users/ryanhan/.nvm/versions/node/v20.18.0/bin:$PATH" mint validate passed; mint broken-links passed.

Detailed Endpoint Verification Matrix

Every public operation was checked one by one against the current docs OpenAPI, the v3 navigation, and a freshly regenerated api-server OpenAPI after removing the four confirmed-private helper endpoints. Examples is the count of request examples currently present in OpenAPI. 0 means no explicit request example is published for that request body; it does not indicate a failing example.
StatusOperationNavAuthRequestExamplesSuccess ResponseErrorsSource
PASSGET /calls/{call_id}yesBearerAuthnonen/a200:application/json:CallResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /callsyesBearerAuthnonen/a200:application/json:PaginatedResponse_CallListItemResponse_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /callsyesBearerAuthapplication/json:CreateCallRequest2201:application/json:CallResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /campaigns/{campaign_id}yesBearerAuthnonen/a200:application/json:CampaignResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /campaigns/{campaign_id}yesBearerAuthapplication/json:UpdateCampaignV3Request0200:application/json:CampaignResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /campaignsyesBearerAuthnonen/a200:application/json:PaginatedResponse_CampaignResponse_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /campaignsyesBearerAuthapplication/json:CreateCampaignV3Request2201:application/json:CampaignResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /campaigns/{campaign_id}/cancelyesBearerAuthnonen/a200:application/json:CancelCampaignV3Response400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /campaigns/{campaign_id}/pauseyesBearerAuthnonen/a200:application/json:PauseCampaignV3Response400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /campaigns/{campaign_id}/resumeyesBearerAuthnonen/a200:application/json:ResumeCampaignV3Response400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /telephone-numbers/availableyesBearerAuthnonen/a200:application/json:PaginatedResponse_AvailableTelephoneLineResponse_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /telephone-numbers/purchaseyesBearerAuthapplication/json:PurchaseNumberRequest0201:application/json:TelephoneNumberResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /telephone-numbers/registeryesBearerAuthapplication/json:RegisterNumberRequest2201:application/json:TelephoneNumberResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /organization-telephone-numbersyesBearerAuthnonen/a200:application/json:PaginatedResponse_TelephoneNumberResponse_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /organization-telephone-numbers/{organization_telephone_number_id}yesBearerAuthnonen/a200:application/json:TelephoneNumberResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /organization-telephone-numbers/{organization_telephone_number_id}yesBearerAuthapplication/json:UpdateTelephoneNumberRequest0200:application/json:TelephoneNumberResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSDELETE /organization-telephone-numbers/{organization_telephone_number_id}yesBearerAuthnonen/a200:application/json:DeleteTelephoneNumberResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /organization-telephone-numbers/{organization_telephone_number_id}/agentyesBearerAuthapplication/json:UpdateAgentMappingRequest0200:application/json:TelephoneNumberResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /organization-telephone-numbers/{organization_telephone_number_id}/sipyesBearerAuthapplication/json:UpdateSipConfigRequest0200:application/json:TelephoneNumberResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /organization-telephone-numbers/{organization_telephone_number_id}/revoke-cancelyesBearerAuthnonen/a200:application/json:TelephoneNumberResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /alert-rulesyesBearerAuthapplication/json:CreateAlertRuleRequest0201:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /alert-rulesyesBearerAuthnonen/a200:application/json:PaginatedResponse_AlertRuleResponse_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /alert-rules/{alert_rule_id}yesBearerAuthnonen/a200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /alert-rules/{alert_rule_id}yesBearerAuthapplication/json:UpdateAlertRuleRequest0200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSDELETE /alert-rules/{alert_rule_id}yesBearerAuthnonen/a204:empty400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /alert-rules/{alert_rule_id}/conditionyesBearerAuthapplication/json:UpdateConditionRequest0200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /alert-rules/{alert_rule_id}/channelsyesBearerAuthapplication/json:UpdateChannelsRequest0200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /alert-rules/{alert_rule_id}/scheduleyesBearerAuthapplication/json:UpdateScheduleRequest0200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /alert-rules/{alert_rule_id}/enableyesBearerAuthnonen/a200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /alert-rules/{alert_rule_id}/disableyesBearerAuthnonen/a200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /alert-rules/{alert_rule_id}/pauseyesBearerAuthapplication/json:PauseAlertRuleRequest0200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /alert-rules/{alert_rule_id}/resumeyesBearerAuthnonen/a200:application/json:AlertRuleResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /alert-rules/{alert_rule_id}/incidentsyesBearerAuthnonen/a200:application/json:PaginatedResponse_AlertIncidentResponse_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /alert-rules/{alert_rule_id}/test-notificationyesBearerAuthnonen/a200:application/json:TestNotificationResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /incidentsyesBearerAuthnonen/a200:application/json:PaginatedResponse_AlertIncidentResponse_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /toolsyesBearerAuthnonen/a200:application/json:PaginatedResponse_ToolSummary_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /toolsyesBearerAuthapplication/json:CreateToolRequest2201:application/json:ToolDetail400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /tools/{tool_id}yesBearerAuthnonen/a200:application/json:ToolDetail400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /tools/{tool_id}yesBearerAuthapplication/json:UpdateToolRequest0200:application/json:ToolDetail400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSDELETE /tools/{tool_id}yesBearerAuthnonen/a204:empty400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /schemasyesBearerAuthnonen/a200:application/json:ListSchemasResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /schemas/{namespace}/{schema_type}yesBearerAuthnonen/a200:application/json:SchemaDefinition400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /knowledgesyesBearerAuthnonen/a200:application/json:PaginatedResponse_KnowledgeSummary_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /knowledgesyesBearerAuthapplication/json:CreateKnowledgeRequest0201:application/json:KnowledgeSummary400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSDELETE /knowledges/{knowledge_id}yesBearerAuthnonen/a204:empty400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /knowledges/{knowledge_id}/documentsyesBearerAuthnonen/a200:application/json:PaginatedResponse_KnowledgeDocumentSummary_400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /knowledges/{knowledge_id}/documentsyesBearerAuthapplication/json:oneOf(CreateTextDocumentRequest|CreateWebpageDocumentRequest); multipart/form-data:object0201:application/json:KnowledgeDocumentSummary400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSDELETE /knowledges/{knowledge_id}/documents/{document_id}yesBearerAuthnonen/a204:empty400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /agentsyesBearerAuthapplication/json:CreateAgentRequest2201:application/json:AgentMutationResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /agentsyesBearerAuthnonen/a200:application/json:ListAgentsResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /agents/{agent_id}yesBearerAuthnonen/a200:application/json:AgentResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPATCH /agents/{agent_id}yesBearerAuthapplication/json:UpdateAgentRequest2200:application/json:AgentMutationResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSDELETE /agents/{agent_id}yesBearerAuthnonen/a204:empty400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /agents/{agent_id}/versionsyesBearerAuthapplication/json:CreateAgentVersionRequest0201:application/json:CreateAgentVersionResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /agents/{agent_id}/versionsyesBearerAuthnonen/a200:application/json:ListAgentVersionsResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSPOST /agents/{agent_id}/versions/{version}/publishyesBearerAuthnonen/a200:application/json:PublishAgentVersionResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /models/llmsyesBearerAuthnonen/a200:application/json:ListLLMModelsResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match
PASSGET /models/voicesyesBearerAuthnonen/a200:application/json:ListVoiceModelsResponse400,401,403,404,409,429,500,503 ErrorResponsecontract-match

Endpoint Checklist

PASS in this section means the public documentation surface was checked for path, method, navigation, bearer auth, request schema, response schema, documented errors, examples where present, and known guide references. It is not a blanket backend implementation sign-off; source-side generator/audit debt is tracked in the findings above and intentionally left outside this docs PR.

Agents

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSPOST /agentsapi-reference/v3/openapi.json, docs.jsonapp/api/v3/endpoints/agent.py, app/api/v3/schemas/agent/**, tests/v3/integration/test_agent_endpoints.pycreate schema, single-prompt defaults, flow flow_data requirement, examples, 201 schema, strict refs
PASSGET /agentssamesamepagination, filters, summary shape
PASSGET /agents/{agent_id}samesameversion selector, response shape, 404
PASSPATCH /agents/{agent_id}samesamepartial update, empty nested dicts, null clearing, flow_data replacement, strict refs
PASSDELETE /agents/{agent_id}samesame204, soft-delete semantics
PASSPOST /agents/validate-flow-dataexcluded from public docsapp/api/v3/endpoints/flow_validation.py, user scope correctionNon-public endpoint. Must stay out of public OpenAPI and nav.
PASSPOST /agents/autofix-flow-dataexcluded from public docsapp/api/v3/endpoints/agent.py, user scope correctionNon-public endpoint. Must stay out of public OpenAPI and nav.
PASSPOST /agents/{agent_id}/operationsexcluded from public docsapp/api/v3/endpoints/agent.py, user scope correctionNon-public endpoint. Must stay out of public OpenAPI and nav.

Agent Versions

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /agents/{agent_id}/versionsOpenAPI, navapp/api/v3/endpoints/agent_version.pylist shape, version names
PASSPOST /agents/{agent_id}/versionsOpenAPI, navsame201, snapshot semantics
PASSPOST /agents/{agent_id}/versions/{version}/publishOpenAPI, navsameversion pattern, production publish behavior

Calls

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /callsOpenAPI, navapp/api/v3/endpoints/calls.py, tests/v3/calls/**filters, pagination, status mapping, timestamps
PASSPOST /callsOpenAPI, navsamerequest field names, agent mapping, traffic split behavior, dynamic variables example
PASSGET /calls/{call_id}OpenAPI, navsamedetail shape, transcript, call_analysis, not-found

Campaigns

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /campaignsOpenAPI, navapp/api/v3/endpoints/campaigns.py, tests/v3/campaigns/**filters, pagination, statuses
PASSPOST /campaignsOpenAPI, navsametasks shape, agent mapping, from_number, dynamic variables, call windows
PASSGET /campaigns/{campaign_id}OpenAPI, navsamedetail shape
PASSPATCH /campaigns/{campaign_id}OpenAPI, navsameeditable fields and status guards
PASSPOST /campaigns/{campaign_id}/cancelOpenAPI, navsameaction response, conflict cases
PASSPOST /campaigns/{campaign_id}/pauseOpenAPI, navsamepause body, timestamp normalization
PASSPOST /campaigns/{campaign_id}/resumeOpenAPI, navsameresume semantics

Telephone Numbers

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /organization-telephone-numbersOpenAPI, navapp/api/v3/endpoints/telephone_numbers.py, telephone testsfilters, org-owned ID
PASSGET /organization-telephone-numbers/{organization_telephone_number_id}OpenAPI, navsameID type, response
PASSPATCH /organization-telephone-numbers/{organization_telephone_number_id}OpenAPI, navsamemutable metadata
PASSPATCH /organization-telephone-numbers/{organization_telephone_number_id}/agentOpenAPI, navsameinbound/outbound agent mapping, clear semantics
PASSPATCH /organization-telephone-numbers/{organization_telephone_number_id}/sipOpenAPI, navsameSIP settings, custom number limits
PASSDELETE /organization-telephone-numbers/{organization_telephone_number_id}OpenAPI, navsamecancel/delete semantics, response
PASSPOST /organization-telephone-numbers/{organization_telephone_number_id}/revoke-cancelOpenAPI, navsamerevoke constraints
PASSGET /telephone-numbers/availableOpenAPI, navsamefilters, purchasable line ID
PASSPOST /telephone-numbers/purchaseOpenAPI, navsametelephone_line_id, not phone string
PASSPOST /telephone-numbers/registerOpenAPI, navsameSIP registration example

Tools

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /toolsOpenAPI, navapp/api/v3/endpoints/tools.pylist summary vs detail
PASSPOST /toolsOpenAPI, navsameAPI tool schema, auth config, examples
PASSGET /tools/{tool_id}OpenAPI, navsamedetail shape
PASSPATCH /tools/{tool_id}OpenAPI, navsamepartial update, auth shape parity
PASSDELETE /tools/{tool_id}OpenAPI, navsame204 delete

Schemas And Flow Data

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /schemasOpenAPI, navapp/api/v3/endpoints/schemas.py, schema registry testsnamespace/category, include_schema
PASSGET /schemas/{namespace}/{schema_type}OpenAPI, navsameschema body, version query, public names
PASSPOST /flow-data/autofixexcluded from public docsapp/api/v3/endpoints/flow_data.py, user scope correctionNon-public endpoint. Must stay out of public OpenAPI and nav.

Knowledges

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /knowledgesOpenAPI, navapp/api/v3/endpoints/knowledges.py, knowledge testsnumeric ID, pagination, org scope
PASSPOST /knowledgesOpenAPI, navsamerequest schema and response
PASSDELETE /knowledges/{knowledge_id}OpenAPI, navsame204, org-scope not-found
PASSGET /knowledges/{knowledge_id}/documentsOpenAPI, navsamelist filters, statuses
PASSPOST /knowledges/{knowledge_id}/documentsOpenAPI, navsameJSON vs multipart body, source types, ingestion trigger
PASSDELETE /knowledges/{knowledge_id}/documents/{document_id}OpenAPI, navsameUUID document ID, 204, org scope

Models

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /models/llmsOpenAPI, navapp/api/v3/endpoints/model.py, model testspagination, capabilities
PASSGET /models/voicesOpenAPI, navsameprovider/language filters, capabilities

Alerts And Incidents

StatusOperationDocs EvidenceAPI EvidenceChecks
PASSGET /alert-rulesOpenAPI, navapp/api/v3/endpoints/alert.py, alert testsfilters, pagination
PASSPOST /alert-rulesOpenAPI, navsamecondition, channels, schedule
PASSGET /alert-rules/{alert_rule_id}OpenAPI, navsamedetail response
PASSPATCH /alert-rules/{alert_rule_id}OpenAPI, navsamemetadata patch
PASSDELETE /alert-rules/{alert_rule_id}OpenAPI, navsame204 delete
PASSPATCH /alert-rules/{alert_rule_id}/channelsOpenAPI, navsamereplacement semantics
PASSPATCH /alert-rules/{alert_rule_id}/conditionOpenAPI, navsamemetric/operators
PASSPATCH /alert-rules/{alert_rule_id}/scheduleOpenAPI, navsameHH:MM, timezone
PASSPOST /alert-rules/{alert_rule_id}/disableOpenAPI, navsameaction response
PASSPOST /alert-rules/{alert_rule_id}/enableOpenAPI, navsameaction response
PASSPOST /alert-rules/{alert_rule_id}/pauseOpenAPI, navsameuntil, paused state
PASSPOST /alert-rules/{alert_rule_id}/resumeOpenAPI, navsameaction response
PASSPOST /alert-rules/{alert_rule_id}/test-notificationOpenAPI, navsameside effect and response
PASSGET /alert-rules/{alert_rule_id}/incidentsOpenAPI, navsamepagination and status filters
PASSGET /incidentsOpenAPI, navsameorg-wide list filters

Full Reverification Pass 2026-05-08

Objective restated as concrete deliverables:
  1. Rebuild the checklist against the current docs PR branch and current domains/voxai/api-server source.
  2. Check every public endpoint for method/path/nav/auth/request/response/errors.
  3. Check examples, descriptions, schema descriptions, and public/private scope.
  4. Compare docs OpenAPI with freshly generated api-server OpenAPI.
  5. Run real validation gates and fix any issues found.
Prompt-to-artifact checklist:
RequirementEvidenceStatus
Current branch state checkeddomains/voxai/docs on codex-v3-api-reference; domains/voxai/api-server current checkout on develop.PASS
Every public endpoint checkedDetailed Endpoint Verification Matrix has 58 public operation rows; current OpenAPI operation count is 58.PASS
Public/private scope checkedPOST /agents/validate-flow-data, POST /agents/autofix-flow-data, POST /agents/{agent_id}/operations, and POST /flow-data/autofix are absent from docs OpenAPI and nav.PASS
api-server generator comparedENV=development-ryan uv run python scripts/generate_v3_public_openapi.py ... returned paths=45 ops=62 schemas=176 pruned_schemas=16; docs-side filtering of the 4 confirmed-private helpers yields 58 public operations and 161 schemas.PASS
Contract diff checkedFiltered generated api-server OpenAPI and docs OpenAPI match after pruning unreachable schemas and removing docs-localized description/summary.PASS
Navigation checkedv3 docs.json nav operation list has 58 entries and matches OpenAPI exactly.PASS
API-side audit checkedENV=development-ryan uv run python scripts/v3_audit.py --openapi-file ... exits 0 with the 4 confirmed-private helpers passed as intentional excludes: 0 blockers, 52 warnings, 1 info. Without those ad-hoc excludes it exits 1 with exactly 4 known endpoint-parity blockers.PASS
Example validity checkedJSON Schema validation over all JSON request and response examples returned examples_checked=476 failures=0.PASS
Description coverage checkedOperation summaries/descriptions, request-body descriptions, parameter descriptions, schema descriptions, and schema property descriptions returned description_coverage_issues=0.PASS
Tone checkedUser-facing OpenAPI prose and v3 introduction copy were normalized toward ~합니다/~습니다; direct imperative endings were removed from public-facing descriptions.PASS
api-server v3 tests checkedCurrent api-server checkout returns 3 failed, 1113 passed, 18 skipped, 75 warnings; failures are source-side (validate-flow-data, webhook_version default, generator count) and are not fixed in this docs PR.ISSUE
Source-side findings from this pass:
  • Current api-server generator/audit still need explicit excludes for the 4 confirmed-private flow helper endpoints. The companion api-server PR was closed and removed from scope.
  • Current api-server AgentWebhookSettings.webhook_version has no default, so docs OpenAPI must not publish webhookVersion.default = "v2".
  • Docs OpenAPI keeps full schema/property descriptions while matching the current source contract after docs-localized description/summary text is removed.

Focused Recheck 2026-05-09

Objective restated as concrete deliverables:
  1. Spend a focused pass rebuilding the checklist instead of trusting prior results.
  2. Check every public API operation one by one.
  3. Verify every operation’s status codes, request schemas, response schemas, and public/private scope against current api-server source.
  4. Check description consistency, natural Korean tone, and developer-friendly wording without over-explaining.
  5. Fix docs when the recheck finds drift.
Prompt-to-artifact checklist:
RequirementEvidenceStatus
Current source regeneratedENV=development-ryan uv run python scripts/generate_v3_public_openapi.py --output /tmp/v3-recheck-current-api-server.json ... returned paths=45 ops=62 schemas=176 pruned_schemas=16.PASS
Every public operation recheckedOperation-level script compared all 58 public operations after removing the 4 confirmed-private helper paths.PASS
Status codes match sourceOperation-level comparison returned operations_checked=58 and status_or_schema_mismatches=0 after ignoring localized descriptions.PASS
Request and response schemas match sourceFull normalized contract comparison returned docs_ops=58, filtered_gen_ops=58, docs_schemas=161, filtered_gen_schemas=161, and normalized contract match.PASS
Docs-side schema drift fixedRemoved stale webhookVersion.default = "v2" from api-reference/v3/openapi.json because current source has no default.FIXED
Operation descriptions completeOperation scan returned operation_description_issues=0 across summaries, descriptions, request bodies, parameters, and response descriptions.PASS
Schema descriptions completeSchema/property coverage scan returned schema_description_issues=0.PASS
Naturalness and tone checkedPublic v3 files were scanned for direct imperative/plain-style endings and stale labels; only audit-meta mentions of TODO/ISSUE/UNVERIFIED were found. Human review of all 58 operation summaries/descriptions found the wording concise enough for API reference use.PASS
External docs comparison consideredNo external docs were needed in this pass because the only concrete drift was against current api-server source; the docs surface already follows the common concise API-reference pattern of summary, short operational description, request/response schema, examples, and error envelope.PASS
Source-side issues not hiddenscripts/v3_audit.py without ad-hoc excludes still reports exactly 4 known private-helper blockers; ENV=development-ryan uv run pytest tests/v3 -q currently fails 3 source-side tests. Both are recorded as source-side issues outside this docs PR.PASS

Completion Audit

Concrete objective: make a Markdown checklist, check every endpoint one by one, compare the public docs against current api-server, and fix incorrect examples, descriptions, schemas, links, or public/private scope mistakes.
RequirementArtifact / EvidenceStatus
Endpoint-by-endpoint checklist existsThis file contains a detailed 58-row public endpoint matrix and a grouped endpoint checklist with 58 public operations plus 4 confirmed-private exclusions.PASS
Every public endpoint was individually recheckedDetailed matrix row count returned 58. No ISSUE, TODO, or UNVERIFIED rows were found in the detailed matrix.PASS
Docs OpenAPI has only public v3 endpointsOpenAPI operation count returned 58.PASS
v3 navigation lists exactly the public OpenAPI operationsRecursive docs.json v3 nav extraction returned 58 operation entries, matching the OpenAPI operation count.PASS
Private helper endpoints stay hiddenSearch for the four private helper paths in docs.json and api-reference/v3/openapi.json returned no matches.PASS
Docs OpenAPI matches current api-server source after confirmed-private exclusionsFreshly regenerated api-server OpenAPI produces 62 operations before docs-side filtering. After removing the 4 confirmed-private helpers and pruning unreachable schemas, docs OpenAPI has no contract diff after removing localized description/summary text.PASS
Status codes and operation schemas match current sourceOperation-level comparison returned operations_checked=58 and status_or_schema_mismatches=0.PASS
Published request and response examples are validJSON Schema validation over OpenAPI JSON examples returned examples_checked=476 failures=0.PASS
Schema descriptions are completeCoverage check over operations, request bodies, parameters, schemas, and schema properties returned description_coverage_issues=0.PASS
Public-facing tone is consistentv3 introduction and OpenAPI descriptions were normalized toward ~합니다/~습니다; direct imperative endings no longer appear in public-facing v3 prose.PASS
Bad v2 examples and stale API reference links are fixedv3 launch guide pages now point to /api-reference/v3/introduction; dynamic variable REST examples use /v3/calls and /v3/campaigns request shapes. Historical changelog v2 links point to /api-reference/v2/introduction.PASS
Build and link validation passPATH="/Users/ryanhan/.nvm/versions/node/v20.18.0/bin:$PATH" mint validate passed. mint broken-links passed.PASS
Remaining source-side uncertainty is explicitly trackedscripts/v3_audit.py exits 0 only when the 4 confirmed-private helpers are passed as intentional excludes; without them it exits 1 with exactly those 4 endpoint-parity blockers. Current tests/v3 also has 3 source-side failures outside this docs PR.PASS

Work Log

  • 2026-05-08: Created checklist in the correct docs submodule. Baseline mismatch: docs OpenAPI 58 operations vs generated api-server public OpenAPI 62 operations.
  • 2026-05-08: API-side audit of the current docs OpenAPI found 7 blockers: 4 missing public operations, missing minProperties on 2 PATCH schemas, and non-integer timestamp fields on schema registry metadata.
  • 2026-05-08: Initially synced api-reference/v3/openapi.json from generated api-server public OpenAPI, then corrected scope after product clarification: POST /agents/validate-flow-data, POST /agents/autofix-flow-data, POST /agents/{agent_id}/operations, and POST /flow-data/autofix are not public and were removed from docs OpenAPI/navigation.
  • 2026-05-08: Scanned guide pages for stale API references. Found and fixed v2 examples in docs/build/variables/dynamic-variables.mdx and versionless API reference links in outbound/post-call/export guides. Also clarified that v3 public API has no dedicated CSV export endpoint; programmatic extraction uses GET /calls and GET /calls/{call_id}.
  • 2026-05-08: Verified api-reference/v3/openapi.json contract matches the expected api-server generated OpenAPI after excluding the four confirmed-private flow helper endpoints, pruning unreachable schemas, and ignoring docs-localized description/summary text. Verified v3 OpenAPI operations and docs.json v3 navigation operations have no diff.
  • 2026-05-08: Validated public OpenAPI JSON request examples. Result: 12 examples checked, 0 schema validation failures.
  • 2026-05-08: Checked knowledge ID contract. Public OpenAPI uses numeric integer knowledge_id path params and numeric knowledgeIds arrays; no UUID wording was found for public knowledge IDs.
  • 2026-05-08: Patched scripts/sync-openapi.sh to enforce docs-side public launch exclusions for the four confirmed-private flow helper endpoints and their private-only schemas. Verified the filter output has 58 operations and matches api-reference/v3/openapi.json.
  • 2026-05-08: Fixed stale changelog links found by validation: /docs/operate/deploy/cti now points to the SIP trunking guide, and historical versionless API reference links now point to the v2 API reference.
  • 2026-05-08: Ran docs validation with Node 20.18 in PATH. mint validate passed and mint broken-links passed.
  • 2026-05-08: Added a detailed endpoint-by-endpoint verification matrix with nav/auth/request schema/example count/success response/error envelope/source parity columns for all 58 public operations. Re-generated api-server OpenAPI from current source and confirmed the docs OpenAPI still matches after the four confirmed-private helper endpoints are filtered out.
  • 2026-05-08: Localized user-facing v3 OpenAPI descriptions in the docs snapshot. Operation descriptions, request-body descriptions, shared error response text, and high-visibility schema descriptions now use Korean prose while preserving code identifiers, enum values, and schema names. Re-verified the contract by stripping description/summary fields from the docs and filtered generated specs and comparing the normalized JSON.
  • 2026-05-08: Rebuilt the full verification checklist and re-ran the audit against current api-server source. Found one missing coverage class: schema/property descriptions. Added descriptions until the coverage check returned description_coverage_issues=0.
  • 2026-05-08: Source-side recheck exposed api-server v3 test failures: public generator expected 61 ops while current source emitted 62, and AgentWebhookSettings.webhook_version default did not match the existing PROD-1493 test. A companion api-server PR was opened briefly, then closed and removed from scope. The docs PR therefore keeps source-side issues tracked rather than patching api-server.
  • 2026-05-09: Re-generated current api-server OpenAPI after the companion PR was removed: paths=45 ops=62 schemas=176 pruned_schemas=16. After docs-side removal of the 4 confirmed-private helper endpoints and unreachable schemas, the filtered source contract has 58 operations and 161 schemas. Docs OpenAPI matches that filtered contract after removing localized description/summary text.
  • 2026-05-08: Normalized public-facing v3 prose toward ~합니다/~습니다. Replaced direct imperative endings in OpenAPI descriptions and the v3 introduction with formal descriptive endings.
  • 2026-05-09: Removed stale webhookVersion.default = "v2" from docs OpenAPI because current api-server source has no default. Re-ran operation-level status code/request schema/response schema comparison for all 58 public operations: status_or_schema_mismatches=0.