Fields & validation
Query filters, list/detail response fields, and conversation shape.
Query filters
| Field | Endpoints | Notes |
|---|---|---|
squad_id | list, search, index, stats | Local squads.id filter only — never returned on list/detail rows |
assistant_id | list, search, index, stats | Member assistant local PK |
status / direction | list, search, index | Literal all means no filter on every list endpoint |
start_date / end_date | list, search, index, stats | whereDate on start_time |
search | list, index (optional); search (required, min 3) | list/index: call_id + summary. search: + transcript |
per_page / page | list, search, index | Defaults 20 / 15 / 20; not clamped |
Status & direction values
status: initiated, ringing, in-progress, completed, failed, busy, no-answer, cancelled.
direction: inbound, outbound.
List / search row fields
| Field | Source | Notes |
|---|---|---|
id, call_id | columns | |
assistant_id | column | Nullable member assistant |
squad_id | column | Stripped from every list/detail response |
squad_name, squad_external_id | JOIN squads | Public squad identity |
assistant_name, assistant_phone | JOIN assistants | |
reseller_id, nested reseller | column + eager load | Selected so audio URL appends resolve the tenant domain |
created_at | timestamps | On list/index; omitted from search select |
has_recording, audio URL appends | model appends | |
cost / currency | columns | Content admins only |
Detail-only fields
transcript,user_id,workspace_id,updated_at.metadata,webhook_data, nestedassistant(withvapi_assistant_id), nestedsquad— content admins only.- Sibling
conversation— same parser as assistant Call History.
No FormRequest rules
These endpoints do not use Laravel validation rule strings except the hard-coded search length check that returns 400. Invalid filter values that match no rows yield an empty page rather than 422.