> For the complete documentation index, see [llms.txt](https://run.emailchaser.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://run.emailchaser.com/api-reference/meetings.md).

# Meetings

## Mark a meeting as booked on a lead

> Records that a meeting was booked with this lead. A meeting is an explicit mark set by you or your agent when a call actually gets scheduled - Emailchaser never infers one from reply text or calendars, so this call (or PUT /leads/{id}/category with meeting\_booked, which behaves identically) is the only way a meeting is recorded. Sets meetingBookedAt to now, sets the lead's category to meeting\_booked, and fires the LeadCategoryUpdate webhook on the category change. Idempotent: repeating the call keeps the original meetingBookedAt and fires no second webhook. Marked meetings are counted in GET /campaigns/{id}/stats totals.meetings and GET /reports/outcomes.

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"servers":[{"url":"https://api.emailchaser.com/r"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","name":"Authorization","in":"header"}},"schemas":{"models.LeadMeetingResponse":{"type":"object","properties":{"lead":{"$ref":"#/components/schemas/models.LeadCategoryState"},"message":{"type":"string"}}},"models.LeadCategoryState":{"type":"object","properties":{"id":{"type":"integer"},"meetingBookedAt":{"description":"MeetingBookedAt is when the meeting was marked as booked and null while\nno meeting is marked.","type":"string"},"tag":{"description":"Tag is the lead's engagement category and null while the lead has never\nbeen categorized.","type":"string"}}},"models.ErrorInvalidLeadID":{"type":"object","properties":{"error":{"type":"string"}}},"models.ErrorUnauthorized":{"type":"object","properties":{"error":{"type":"string"}}},"models.ErrorNotFound":{"type":"object","properties":{"error":{"type":"string"}}},"models.ErrorResponse":{"type":"object","properties":{"error":{"type":"string"}}}}},"paths":{"/leads/{id}/meeting":{"post":{"description":"Records that a meeting was booked with this lead. A meeting is an explicit mark set by you or your agent when a call actually gets scheduled - Emailchaser never infers one from reply text or calendars, so this call (or PUT /leads/{id}/category with meeting_booked, which behaves identically) is the only way a meeting is recorded. Sets meetingBookedAt to now, sets the lead's category to meeting_booked, and fires the LeadCategoryUpdate webhook on the category change. Idempotent: repeating the call keeps the original meetingBookedAt and fires no second webhook. Marked meetings are counted in GET /campaigns/{id}/stats totals.meetings and GET /reports/outcomes.","tags":["Meetings"],"summary":"Mark a meeting as booked on a lead","parameters":[{"schema":{"type":"string"},"description":"Bearer <API_KEY>","name":"Authorization","in":"header","required":true},{"schema":{"type":"integer"},"description":"Lead ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"Meeting marked as booked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.LeadMeetingResponse"}}}},"400":{"description":"Invalid lead ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorInvalidLeadID"}}}},"401":{"description":"Unauthorized - invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorUnauthorized"}}}},"404":{"description":"Lead not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorNotFound"}}}},"500":{"description":"Failed to mark meeting","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}}}}}}}}
```

## Unmark a booked meeting on a lead

> Removes the explicit booked-meeting mark: clears meetingBookedAt and, when the lead's category is still meeting\_booked, reverts it to interested (firing the LeadCategoryUpdate webhook on the change). A category that was changed to something else since booking is left alone. Idempotent: unmarking a lead with no meeting is a no-op.

```json
{"openapi":"3.1.1","info":{"title":"Emailchaser API","version":"1.0"},"servers":[{"url":"https://api.emailchaser.com/r"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","name":"Authorization","in":"header"}},"schemas":{"models.LeadMeetingResponse":{"type":"object","properties":{"lead":{"$ref":"#/components/schemas/models.LeadCategoryState"},"message":{"type":"string"}}},"models.LeadCategoryState":{"type":"object","properties":{"id":{"type":"integer"},"meetingBookedAt":{"description":"MeetingBookedAt is when the meeting was marked as booked and null while\nno meeting is marked.","type":"string"},"tag":{"description":"Tag is the lead's engagement category and null while the lead has never\nbeen categorized.","type":"string"}}},"models.ErrorInvalidLeadID":{"type":"object","properties":{"error":{"type":"string"}}},"models.ErrorUnauthorized":{"type":"object","properties":{"error":{"type":"string"}}},"models.ErrorNotFound":{"type":"object","properties":{"error":{"type":"string"}}},"models.ErrorResponse":{"type":"object","properties":{"error":{"type":"string"}}}}},"paths":{"/leads/{id}/meeting":{"delete":{"description":"Removes the explicit booked-meeting mark: clears meetingBookedAt and, when the lead's category is still meeting_booked, reverts it to interested (firing the LeadCategoryUpdate webhook on the change). A category that was changed to something else since booking is left alone. Idempotent: unmarking a lead with no meeting is a no-op.","tags":["Meetings"],"summary":"Unmark a booked meeting on a lead","parameters":[{"schema":{"type":"string"},"description":"Bearer <API_KEY>","name":"Authorization","in":"header","required":true},{"schema":{"type":"integer"},"description":"Lead ID","name":"id","in":"path","required":true}],"responses":{"200":{"description":"Meeting unmarked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.LeadMeetingResponse"}}}},"400":{"description":"Invalid lead ID","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorInvalidLeadID"}}}},"401":{"description":"Unauthorized - invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorUnauthorized"}}}},"404":{"description":"Lead not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorNotFound"}}}},"500":{"description":"Failed to unmark meeting","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models.ErrorResponse"}}}}}}}}}
```
