API: cross-resource field-naming sweep

Several same-concept-different-name fields are renamed to one consistent spelling and type across the voice-agents wire. Every change is served in its pre-2026-06-28 shape to a caller that pins an earlier Speechify-Version; the official SDKs pin their build date automatically.

Voice gender notSpecifiednot_specified

GET /v1/agents/voices uses not_specified for the unspecified gender (the male/female values are unchanged).

Batch recipient dynamic_varsdynamic_variables

The per-recipient dynamic_vars field on POST /v1/agents/batch-calls and GET /v1/agents/batch-calls/{batch_call_id} is renamed dynamic_variables, matching the outbound-call and web-session surfaces. Request values may now be any JSON type (not strings only). CSV uploads still carry string values.

  • Migrate: send/read dynamic_variables instead of dynamic_vars.

LLMModelInfo.class integer → string enum

GET /v1/agents/llm-models returns class as a snake_case string enum (managed/standard/premium) instead of an integer.

  • Before (pin 2026-06-27 or earlier): class is an integer (0/1/2).
  • After (2026-06-28+): class is "managed" / "standard" / "premium".
  • Migrate: read class as a string; map 0→managed, 1→standard, 2→premium.

KB search top_klimit

The POST /v1/agents/knowledge-bases/search request field top_k is renamed limit (top_k is reserved for LLM sampling).

  • Migrate: send limit instead of top_k.

Caller.identitycaller_identity

The identity field on the Caller resource (GET /v1/agents/callers, GET /v1/agents/callers/{caller_id}, PATCH /v1/agents/callers/{caller_id}) is renamed caller_identity, matching every other surface that carries the caller key.

  • Migrate: read caller_identity instead of identity on the Caller.