# Call Estrutura de dados do contrato OpenAPI. ## Campos | Campo | Tipo | Presença | Descrição | |---|---|---|---| | `callId` | `string` | obrigatório | — | | `direction` | `string` | obrigatório | Valores: `"inbound"`, `"outbound"` | | `number` | `string` | obrigatório | Identidade telefônica canônica, quando conhecida. | | `jid` | `string` | opcional | — | | `status` | `string` | obrigatório | Valores: `"ringing"`, `"connecting"`, `"active"`, `"ended"` | | `startedAt` | `string` | obrigatório | Formato: `date-time` | | `answeredAt` | `string` | opcional | Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio. Formato: `date-time` | | `endedAt` | `string` | opcional | Formato: `date-time` | | `endReason` | `string` | opcional | hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados. | | `endedBy` | `string` | opcional | Valores: `"local"`, `"remote"` | | `answered` | `boolean` | opcional | Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar. | | `mediaStartedAt` | `string` | opcional | Momento em que o motor confirmou mídia recebida. Formato: `date-time` | | `durationSeconds` | `number` | opcional | Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso. Mínimo: `0` | | `recording` | `object` | opcional | Modelo: [CallRecording](https://wpp.atendro.cloud/docs/modelos/call-recording.md). | | `video` | `boolean` | obrigatório | Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico. | | `videoState` | `object` | opcional | Estado vivo do vídeo; presente apenas enquanto a chamada não terminou. Os campos sending/receiving refletem o fluxo negociado, não quadros efetivamente trafegando. Modelo: [CallVideoState](https://wpp.atendro.cloud/docs/modelos/call-video-state.md). | | `videoRecording` | `object` | opcional | Gravação de vídeo independente do WAV. Campo opcional, presente somente após começar a captura de vídeo. processing indica composição do MP4 em fila após a chamada; não muda o estado ou a ocupação de ligações. O primeiro resultado terminal é preservado. Modelo: [CallVideoRecording](https://wpp.atendro.cloud/docs/modelos/call-video-recording.md). | | `incomingCallMode` | `string` | opcional | Comportamento para novas chamadas recebidas: allow permite atendimento humano; reject recusa no servidor; reject_reply recusa e solicita ao consumidor resposta por uma conexão de mensagens vinculada. Não atende automaticamente. O envio do texto é independente da recusa. Modelo: [IncomingCallMode](https://wpp.atendro.cloud/docs/modelos/incoming-call-mode.md). Valores: `"allow"`, `"reject"`, `"reject_reply"` | | `callsConfigVersion` | `integer` | opcional | Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão. Mínimo: `0`. Formato: `int64` | | `rejectionSource` | `string` | opcional | Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo. Valores: `"policy"`, `"busy"`, `"manual"` | | `autoReplyRequested` | `boolean` | opcional | Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta. | ## Definição OpenAPI ```json { "type": "object", "properties": { "callId": { "type": "string" }, "direction": { "type": "string", "enum": [ "inbound", "outbound" ] }, "number": { "type": "string", "description": "Identidade telefônica canônica, quando conhecida." }, "jid": { "type": "string" }, "status": { "type": "string", "enum": [ "ringing", "connecting", "active", "ended" ] }, "startedAt": { "type": "string", "format": "date-time" }, "answeredAt": { "type": "string", "format": "date-time", "description": "Momento do aceite remoto ou do atendimento local; não depende do primeiro áudio." }, "endedAt": { "type": "string", "format": "date-time" }, "endReason": { "type": "string", "description": "hangup, rejected, ring_timeout, closed, unknown ou motivo do motor. Um terminate remoto sem motivo explícito (ausente, vazio ou só espaços) é hangup/remote: solicitação remota de encerramento, sem comprovar ação humana. Motivos explícitos são preservados; callbacks genéricos sem motivo continuam unknown. O primeiro motivo fica no histórico; registros antigos não são reclassificados." }, "endedBy": { "type": "string", "enum": [ "local", "remote" ] }, "answered": { "type": "boolean", "description": "Verdadeiro a partir do aceite, mesmo antes de o áudio iniciar." }, "mediaStartedAt": { "type": "string", "format": "date-time", "description": "Momento em que o motor confirmou mídia recebida." }, "durationSeconds": { "type": "number", "minimum": 0, "description": "Tempo entre atendimento e encerramento; zero para chamadas sem atendimento ou ainda em curso." }, "recording": { "$ref": "#/components/schemas/CallRecording" }, "video": { "type": "boolean", "description": "Verdadeiro quando a chamada é ou foi de vídeo (negociado em qualquer direção em algum momento). Permanece no histórico." }, "videoState": { "$ref": "#/components/schemas/CallVideoState" }, "videoRecording": { "$ref": "#/components/schemas/CallVideoRecording" }, "incomingCallMode": { "$ref": "#/components/schemas/IncomingCallMode" }, "callsConfigVersion": { "type": "integer", "format": "int64", "minimum": 0, "description": "Versão da política congelada na chegada da chamada recebida. Não é seq do evento; mudanças de configuração posteriores não alteram esta decisão." }, "rejectionSource": { "type": "string", "enum": [ "policy", "busy", "manual" ], "description": "Origem de uma recusa confirmada: política automática, ocupação ou operador. Não confundir com timeout, desligamento remoto ou atendimento em outro dispositivo." }, "autoReplyRequested": { "type": "boolean", "description": "Verdadeiro somente após recusa confirmada por política reject_reply. O consumidor enfileira o texto uma única vez por instância/chamada; este campo não comprova envio da resposta." } }, "required": [ "callId", "direction", "number", "status", "startedAt", "video" ] } ```