Webhooks
A webhook sends events to your URL, for example as soon as a summary is ready. These endpoints register and manage webhooks.
Every endpoint below shows its parameters and response fields in the middle and a request sample with an example response on the right.
Lists the registered webhooks
/v1.0/directories/{directoryId}/webhooksAdmins/owners see all webhooks of the directory (both personal and directory-wide); a regular user only sees their own (personal) webhooks.
Field overview from the specification
Each item has:
webhookId(string): id of the webhook.name(string): display name of the webhook.event(string enum): when the webhook fires.summary.readyafter every summary,manualnever on its own (it is started from the meeting or recording). Webhooks created before the current trigger model may still reportrecording.summarizedormeeting.summarized; those two cannot be set any more.url(string): target URL that Sally POSTs the event to.isActive(boolean): whether the webhook is actively firing.directoryWide(boolean): whether the webhook fires directory-wide (for recordings of ALL users, admin/owner only) or personally (only for the creator's own recordings).createdOn(string): creation timestamp (ISO-8601).
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
createdOn,directoryWide,event,isActive,name,url,webhookId.Example:createdOn,directoryWide
Response
webhookIdstringrequiredId of the webhook.
namestringrequiredDisplay name of the webhook.
eventstringrequiredEvent on which the webhook fires.
Allowed values:summary.readymanualrecording.summarizedmeeting.summarizedurlstringrequiredTarget URL that Sally POSTs the event to.
isActivebooleanrequiredWhether the webhook is actively firing.
directoryWidebooleanrequiredWhether the webhook fires directory-wide (for recordings of ALL users, admin/owner only) or personally (only for the creator's own recordings).
createdOnstringrequiredCreation timestamp (ISO-8601).
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Registers a webhook (fires after the summary)
/v1.0/directories/{directoryId}/webhooksSally POSTs to the given URL when the event fires (payload: summary + custom insights + section items).
Field overview from the specification
Body fields:
url(string, required): the endpoint Sally sends the POST request to.event(string, optional, defaultsummary.ready):summary.readyfires after every summary,manualnever fires on its own and is started from the meeting or recording. The event that triggers the webhook.name(string, optional): a label to recognize the webhook in the list.directoryWide(boolean, optional, defaultfalse):false= personal webhook, fires only for the creator's own recordings;true= fires for the recordings of ALL users (reserved for admins/owners).
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
createdOn,directoryWide,event,isActive,name,url,webhookId.Example:createdOn,directoryWide
Request body application/json
urlstringrequiredExample:https://example.com/sally-webhookeventstringoptionalAllowed values:summary.readymanualExample:summary.readynamestringoptionalExample:Mein CRM-SyncdirectoryWidebooleanoptionalExample:false
Response
webhookIdstringrequiredId of the webhook.
namestringrequiredDisplay name of the webhook.
eventstringrequiredEvent on which the webhook fires.
Allowed values:summary.readymanualrecording.summarizedmeeting.summarizedurlstringrequiredTarget URL that Sally POSTs the event to.
isActivebooleanrequiredWhether the webhook is actively firing.
directoryWidebooleanrequiredWhether the webhook fires directory-wide (for recordings of ALL users, admin/owner only) or personally (only for the creator's own recordings).
createdOnstringrequiredCreation timestamp (ISO-8601).
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Updates a webhook (url, event, name)
/v1.0/directories/{directoryId}/webhooks/{webhookId}Partial update — only the fields present in the body change; the others stay as they are. Activating/deactivating is NOT done here but via the separate activate/deactivate endpoints. Same permissions as delete: a regular user can only change their own (personal) webhooks; admins/owners can change any webhook of the directory.
Field overview from the specification
Body fields:
url(string, optional): new HTTPS endpoint Sally POSTs to.event(string, optional): new event that triggers the webhook.name(string, optional): new label to recognize the webhook in the list.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.webhookIdstringrequiredId of the webhook.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
createdOn,directoryWide,event,isActive,name,url,webhookId.Example:createdOn,directoryWide
Request body application/json
urlstringoptionalExample:https://example.com/sally-webhookeventstringoptionalAllowed values:summary.readymanualExample:summary.readynamestringoptionalExample:Mein CRM-Sync
Response
webhookIdstringrequiredId of the webhook.
namestringrequiredDisplay name of the webhook.
eventstringrequiredEvent on which the webhook fires.
Allowed values:summary.readymanualrecording.summarizedmeeting.summarizedurlstringrequiredTarget URL that Sally POSTs the event to.
isActivebooleanrequiredWhether the webhook is actively firing.
directoryWidebooleanrequiredWhether the webhook fires directory-wide (for recordings of ALL users, admin/owner only) or personally (only for the creator's own recordings).
createdOnstringrequiredCreation timestamp (ISO-8601).
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Deletes (deactivates) a webhook
/v1.0/directories/{directoryId}/webhooks/{webhookId}Soft delete (active=false) per Sally convention. A regular user can only delete their own (personal) webhooks; admins/owners can delete any webhook of the directory.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.webhookIdstringrequiredId of the webhook.
Status codes
- 204Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Activates a webhook
/v1.0/directories/{directoryId}/webhooks/{webhookId}/activateResumes a paused webhook so it fires again. No request body. Same permissions as delete: a regular user can only change their own (personal) webhooks; admins/owners can change any webhook of the directory. Returns the updated webhook.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.webhookIdstringrequiredId of the webhook.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
createdOn,directoryWide,event,isActive,name,url,webhookId.Example:createdOn,directoryWide
Response
webhookIdstringrequiredId of the webhook.
namestringrequiredDisplay name of the webhook.
eventstringrequiredEvent on which the webhook fires.
Allowed values:summary.readymanualrecording.summarizedmeeting.summarizedurlstringrequiredTarget URL that Sally POSTs the event to.
isActivebooleanrequiredWhether the webhook is actively firing.
directoryWidebooleanrequiredWhether the webhook fires directory-wide (for recordings of ALL users, admin/owner only) or personally (only for the creator's own recordings).
createdOnstringrequiredCreation timestamp (ISO-8601).
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.
Deactivates a webhook
/v1.0/directories/{directoryId}/webhooks/{webhookId}/deactivatePauses a webhook without deleting it — it stays in the list but does not fire until it is reactivated. No request body. Same permissions as delete: a regular user can only change their own (personal) webhooks; admins/owners can change any webhook of the directory. Returns the updated webhook.
Path parameters
directoryIdstringrequiredId of the directory (the Sally company account) the resource belongs to. The directories a token can address are listed by
GET /v1.0/me/directories/memberships.webhookIdstringrequiredId of the webhook.
Query parameters
fieldsstringoptionalComma-separated list of the fields to return. Leave it out and you get every field — including fields added in the future, which is your call to make: name your fields if you want to be shielded from that.
Only first-level fields can be named. A nested list such as
attendees,tagsorsectionItemsis returned whole or not at all;attendees.nameis not supported.On a paged response the selection applies to the entries in
items;page,pageSize,totalandhasMoreare always returned. An unknown name is rejected with 400 rather than ignored.Selectable here:
createdOn,directoryWide,event,isActive,name,url,webhookId.Example:createdOn,directoryWide
Response
webhookIdstringrequiredId of the webhook.
namestringrequiredDisplay name of the webhook.
eventstringrequiredEvent on which the webhook fires.
Allowed values:summary.readymanualrecording.summarizedmeeting.summarizedurlstringrequiredTarget URL that Sally POSTs the event to.
isActivebooleanrequiredWhether the webhook is actively firing.
directoryWidebooleanrequiredWhether the webhook fires directory-wide (for recordings of ALL users, admin/owner only) or personally (only for the creator's own recordings).
createdOnstringrequiredCreation timestamp (ISO-8601).
Status codes
- 200Success
- 400
Invalid request (validation error).
- 401
Missing or invalid bearer token.
- 403
Forbidden (insufficient permissions).
- 404
Resource not found or not accessible.
- 429
Rate limit exceeded (per token/IP). Transcription uploads may also return
codeFUP_LIMIT_EXCEEDEDorTOO_MANY_CONCURRENT_TRANSCRIPTIONS. - 500
Internal server error.