---
title: "Report a call's outcome, rating, and structured feedback"
method: POST
path: "/api/call-events/{id}/feedback"
tags: ["Call events"]
---

# Report a call's outcome, rating, and structured feedback

`POST /api/call-events/{id}/feedback`

## Request

- Base URL: `https://api.setluca.com`
- URL: `https://api.setluca.com/api/call-events/{id}/feedback`
- Auth: one of:
  - API key in cookie `luca.session_token`
  - API key in header `x-api-key`
  - HTTP bearer

The coach's report on how the call went. A `completed` or `no_show` outcome also records booking attendance, and a completed call queues its summary. A `no_show` can start recovery messages to the lead, so an API key needs the `queue_ops` grant to record one. Resubmitting the identical form is deduped. A correction, like a fixed rating or an added note, runs the learning loop again.

**API key scopes:** `call_events:write`. You also need an `Idempotency-Key` header.

## Path parameters

- `id` string, uuid, required

## Headers

- `Luca-API-Version` '1'

## Request body

- CallEventFeedbackCreate
  - `expectedOutcomeUpdatedAt` string, date-time, nullable
  - `outcome` 'completed' | 'no_show' | 'rescheduled' | 'cancelled', required
  - `rating` integer, nullable
  - `notes` string, nullable
  - `fields` object
    - `wasQualified` 'yes' | 'kinda' | 'no'
    - `surprise` string
    - `objectionHandlingAccurate` boolean
    - `followUpNeeded` boolean
    - `followUpNote` string
  - `rescheduledTo` string, date-time, nullable

## Response `200`

ok

- CallEventResponse
  - `callEvent` object, required
    - `id` string, required
    - `leadId` string, required
    - `leadName` string, nullable, required
    - `leadChannel` string, nullable, required
    - `bookingId` string, nullable, required
    - `bookedAt` string, required
    - `scheduledAt` string, nullable, required
    - `completedAt` string, nullable, required
    - `outcome` 'completed' | 'no_show' | 'rescheduled' | 'cancelled' | 'null', nullable, required
    - `outcomeUpdatedAt` string, nullable, required
    - `coachRating` number, nullable, required
    - `coachNotes` string, nullable, required
    - `summary` string, nullable, required
    - `summarySource` 'auto' | 'coach_triggered' | 'coach_edited' | 'provider' | 'null', nullable, required
    - `summaryStatus` 'idle' | 'generating' | 'ready' | 'failed', required
    - `summaryStructured` object, nullable, required
      - `leadGoals` string[]
      - `keyObjections` string[]
      - `bookingTriggers` string[]
      - `riskFactors` string[]
      - `coachingRecommendation` string
      - `crmNote` string
    - `crmSynced` boolean, required
    - `crmSyncStatus` 'pending' | 'syncing' | 'local_only' | 'synced' | 'failed' | 'permanently_failed' | 'null', nullable, required
    - `crmSyncError` string, nullable, required
    - `crmPermanentlyFailed` boolean, required
    - `feedbackFields` object, nullable, required
      - `wasQualified` 'yes' | 'kinda' | 'no'
      - `surprise` string
      - `objectionHandlingAccurate` boolean
      - `followUpNeeded` boolean
      - `followUpNote` string
    - `callSequenceNumber` number, required
    - `createdAt` string, required

## Other responses

- `400`: validation failed
- `401`: unauthorized
- `404`: not found
- `409`: conflict
- `429`: rate limited
- `503`: service unavailable

---

[API](https://skmtc.dev/setluca/apis/luca-api.md) · [All operations](https://skmtc.dev/setluca/apis/luca-api/llms.txt) · [OpenAPI document](https://skmtc.dev/setluca/apis/luca-api/revisions/90a200e4100b?raw)
