Audit logs provide a chronological record of user and administrator actions in Synthesia, helping organizations monitor usage, detect anomalies, and demonstrate compliance.
Note:Only Organization Admins can access Audit Logs (via Organization Settings or Synthesia API).
The Audit Logs API returns a record of actions taken across your organization and workspaces: who did what, when, and to what. Use it for compliance reporting, security monitoring, and activity tracking.
To browse and filter audit logs in the Synthesia app instead of calling the API, see Audit logs.
Endpoints
| Method | Endpoint | Purpose |
|---|---|---|
GET | /v2/auditLogs/events | Query audit log events with simple filters. |
POST | /v2/auditLogs/events/search | Advanced search with complex filter criteria. |
POST | /v2/auditLogs/export | Export audit logs as a CSV file. |
Query audit log events
GET https://api.synthesia.io/v2/auditLogs/events
Simple query endpoint for retrieving paginated audit events.
Key behavior:
- Exactly one of
workspaceIdororganizationIdmust be provided. - Multiple values for
actionsandactorIdsare comma-separated. - Dates are Unix timestamps (seconds since epoch).
Query parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
workspaceId | string (UUID) | Conditional | Filter by workspace. Mutually exclusive with organizationId. |
organizationId | string (UUID) | Conditional | Filter by organization. Mutually exclusive with workspaceId. |
actions | string | No | Comma-separated action names, for example workspace.user.invited,workspace.invitation.accepted. See Event types for the full list. |
actorIds | string | No | Comma-separated actor IDs. |
targetId | string | No | Filter by a specific target resource. |
startDate | integer | No | Unix timestamp (seconds). Filters events from this date onwards. Must be before endDate if both are provided. |
endDate | integer | No | Unix timestamp (seconds). Filters events before this date. Must be after startDate if both are provided. |
cursor | string | No | Pagination cursor from a previous response. |
limit | integer | No | Results per page, 1 to 200. Default: 50. |
Response:
{
"events": [
{
"id": "7d8307d2-63f3-4e86-85db-8feae494f7e2",
"action": "workspace.license.consumed",
"status": "success",
"actor": {
"type": "user",
"id": "9a0840a7-a4be-42f7-9d2c-a6d96ccc6ba6",
"name": "Jamie Rivera",
"email": "[email protected]"
},
"target": {
"type": "user",
"id": "91f0be7b-055a-4766-8457-79dbeb1c351d",
"name": "Alex Chen"
},
"context": {
"workspaceId": "99ba788e-eaeb-4b0c-ae4e-901575d6f28c",
"organizationId": "73a6bbf3-eed0-4d31-8dd9-16435fe2ee38",
"ipAddress": null
},
"details": {
"previousLicenseType": "free",
"newLicenseType": "full",
"targetUserEmail": "[email protected]",
"targetUserId": "91f0be7b-055a-4766-8457-79dbeb1c351d",
"source": "admin_action",
"workspaceName": "Sales Workspace",
"organizationName": "Example Org"
},
"metadata": {
"createdAt": "2026-01-11T16:47:57.658000Z",
"processedAt": "2026-01-11T16:47:58.324000Z"
}
}
],
"nextCursor": "51332afa-4419-405f-9a85-fe437ce683aa",
"hasMore": true
}Search audit log events
POST https://api.synthesia.io/v2/auditLogs/events/search
Advanced search for complex filtering scenarios. Use this endpoint instead of GET /v2/auditLogs/events when:
- Filtering by 50 or more actions or actors.
- You need programmatic access with a JSON request body.
- Your filter combination is too complex for query parameters.
Request body:
{
"organizationId": "73a6bbf3-eed0-4d31-8dd9-16435fe2ee38",
"startDate": 1736524800,
"endDate": 1736697600,
"actions": ["billing.credits.consumed", "dubbing.project.created"],
"actorIds": ["9a0840a7-a4be-42f7-9d2c-a6d96ccc6ba6", "91f0be7b-055a-4766-8457-79dbeb1c351d"],
"cursor": null,
"limit": 100
}Response:
{
"events": [
{
"id": "59fa0207-13d9-45fe-a54c-1799658ccc31",
"action": "billing.credits.consumed",
"status": "success",
"actor": {
"type": "system",
"id": "billing_system",
"name": "Billing System",
"email": null
},
"target": {
"type": "workspace",
"id": "1f32e8d4-1594-43e2-8caa-1e0a48e00bcc",
"name": "Enterprise Workspace"
},
"context": {
"workspaceId": "1f32e8d4-1594-43e2-8caa-1e0a48e00bcc",
"organizationId": "73a6bbf3-eed0-4d31-8dd9-16435fe2ee38",
"ipAddress": "internal"
},
"details": {
"feature": "DUBBING_DURATION",
"amount": 5.845,
"operationType": "credit"
},
"metadata": {
"createdAt": "2026-01-11T16:49:00.051000Z",
"processedAt": "2026-01-11T16:49:00.387000Z"
}
}
],
"nextCursor": "b8d4c4ed-1682-4831-af22-3723f400119d",
"hasMore": true
}Export audit logs as CSV
POST https://api.synthesia.io/v2/auditLogs/export
Exports filtered audit logs as a downloadable CSV file. See CSV structure for the columns it contains.
Key behavior:
- Maximum of 10,000 events per export. If your filter matches more, the response is truncated and the filename includes a
_TRUNCATEDsuffix. - The response is binary CSV data (
Content-Type: application/csv).
Request body:
{
"organizationId": "73a6bbf3-eed0-4d31-8dd9-16435fe2ee38",
"startDate": 1733932192,
"endDate": 1736524192,
"actions": ["billing.credits.consumed"],
"actorIds": null,
"targetId": null
}Response: binary CSV file, with a Content-Disposition header containing the filename, for example audit_logs_export_20260111_165018.csv.
Exporting is itself an audited action. It generates its own event:
{
"id": "2543a303-74f9-46a1-aba6-9c0538f92a3e",
"action": "audit_logs.exported",
"status": "success",
"actor": {
"type": "user",
"id": "91f0be7b-055a-4766-8457-79dbeb1c351d",
"name": "Jamie Rivera",
"email": "[email protected]"
},
"target": {
"type": "organization",
"id": "73a6bbf3-eed0-4d31-8dd9-16435fe2ee38",
"name": null
},
"context": {
"workspaceId": null,
"organizationId": "73a6bbf3-eed0-4d31-8dd9-16435fe2ee38",
"ipAddress": null
},
"details": {
"eventCount": 62,
"truncated": false,
"filename": "audit_logs_export_20260111_165018.csv",
"filters": {
"start_date": "2025-12-12T16:49:52+00:00",
"end_date": "2026-01-11T16:49:52+00:00",
"actor_ids": ["9a0840a7-a4be-42f7-9d2c-a6d96ccc6ba6", "91f0be7b-055a-4766-8457-79dbeb1c351d"]
}
},
"metadata": {
"createdAt": "2026-01-11T16:50:18.980000Z",
"processedAt": "2026-01-11T16:50:18.983000Z"
}
}Pagination
The Audit Logs API uses cursor-based pagination, which stays stable even when new events are added between requests.
- Make an initial request without a
cursorparameter. - The response includes
nextCursorandhasMore. - Pass
nextCursoras thecursorparameter in your next request. - Repeat until
hasMoreisfalse.
| Field | Type | Description |
|---|---|---|
nextCursor | string | null | Pass this as the cursor parameter in your next request. null if there are no more results. |
hasMore | boolean | Whether more events exist beyond the current page. false means nextCursor is also null. |
Best practices:
- Check
hasMoreto decide whether to keep paginating, rather than only checking whethernextCursorisnull. - Keep filter parameters (
startDate,endDate,actions, and so on) identical across all requests in a paginated sequence. Changing filters mid-sequence means starting over without a cursor. - If
eventsis empty buthasMoreistrue, keep paginating. There may be matching results further on. - Treat cursors as opaque tokens. Don't parse or modify them.
- Events are sorted by
createdAtdescending, then byiddescending, for consistent ordering across pages. - There's no offset or page-number based pagination, only cursor-based.
Response codes
| Code | Description |
|---|---|
| 200 | Success. |
| 400 | Invalid parameters, for example both workspaceId and organizationId provided. |
| 403 | Forbidden. Invalid API key, or Public API access disabled. |
| 404 | Workspace or organization not found. |
| 429 | Rate limit exceeded. |
| 5XX | Server error. |
Data model reference
Actor types
| Type | Description |
|---|---|
user | A human user performed the action. |
system | Synthesia's systems performed the action automatically, for example the billing system. |
service | An external service or integration performed the action. |
Target types
| Type | Description |
|---|---|
workspace | A workspace. |
video | A video or dubbing project. |
user | A user account. |
organization | An organization. |
asset | A media asset. |
CSV structure
Exported files are named audit_logs_export_<YYYYMMDD>_<HHMMSS>.csv. A single export is capped at 10,000 events—if your filtered result has more, the file is truncated and _TRUNCATED is appended to the filename. Narrow your date range or filters to get the rest.
Each row has these columns:
| Column | Description |
|---|---|
event_id | Unique identifier for the event. |
timestamp | When the event occurred, in ISO 8601 (UTC). |
action | The event, in domain.resource.past_tense_verb format (for example, workspace.user.invited). |
actor_type | Who or what performed the action: user or system. |
actor_id | The actor's unique identifier. |
actor_name | The actor's display name. |
actor_email | The actor's email address. |
target_type | The kind of thing the action was performed on (for example, workspace, user, video, asset). |
target_id | The target's unique identifier. |
target_name | The target's display name. |
status | Whether the action succeeded, for example success. |
details | A JSON-encoded string with information specific to that action, such as what changed from and to. Quotes inside it are escaped and need unescaping before you parse it. |
workspace_id | The workspace the action occurred in, if applicable. |
organization_id | The organization the action occurred in. |
ip_address | The IP address the action came from. Blank for most user actions, and internal for actions performed by Synthesia's systems. |
Note:The CSV flattens the
actor,target, andcontextobjects from the JSON response into individual columns, and uses a singletimestamprather than the JSON response's separatecreatedAtandprocessedAt.
Event structure
Each event, whether from events, events/search, or a CSV row, records:
id: a unique identifier for the event.action: what was done, indomain.resource.past_tense_verbformat (for example,workspace.user.invited).status: whether the action succeeded.actor: who or what performed the action.target: what the action was performed on.context: the workspace, organization, and IP address the action occurred in.details: additional information specific to that action, such as what changed from and to.metadata: timestamps for when the event was created and processed.
Event types
Actions follow the domain.resource.past_tense_verb format shown throughout this reference. Each event's Name is the label it appears under in the Synthesia app's Events filter—see Audit logs for how to browse events there. A dash (—) means the event isn't available in the list of filter options.
Authentication
| Event | Name | Description |
|---|---|---|
user.authentication.login | User Authentication Login | A user logged in. |
user.authentication.logout | User Authentication Logout | A user logged out. |
User
| Event | Name | Description |
|---|---|---|
user.profile.updated | User Profile Updated | A profile field was updated. |
user.profile_picture.updated | User Profile Picture Updated | A profile picture was uploaded or deleted. |
user.email.changed | — | A user's email address was changed. Can be triggered by the user themselves, or automatically, for example by an SSO sync. |
user.account.banned | — | A user account was banned. |
user.api_key.created | User Api Key Created | An API key was created. |
user.scim.created | User SCIM Created | A user was created via SCIM provisioning. |
user.scim.updated | User SCIM Updated | A user was updated via SCIM provisioning. |
user.scim.deleted | User SCIM Deleted | A user was deleted via SCIM provisioning. |
user.jit.provisioned | User JIT Provisioned | A user was provisioned via Just-in-Time (JIT) provisioning. |
Workspace
| Event | Name | Description |
|---|---|---|
workspace.created | Workspace Created | A workspace was created. |
workspace.bound | Workspace Bound | A workspace was bound to an organization. Performed by Synthesia's systems, not a person. |
workspace.unbound | Workspace Unbound | A workspace was unbound from an organization. Performed by Synthesia's systems, not a person. |
workspace.deletion.scheduled | Workspace Deletion Scheduled | Workspace deletion was scheduled. |
workspace.name.changed | Workspace Name Changed | The workspace name was changed. |
workspace.icon.changed | Workspace Icon Changed | The workspace icon was uploaded or deleted. |
workspace.insights.requested | Workspace Insights Requested | An Insights report was requested. |
workspace.preferences.updated | Workspace Preferences Updated | A workspace setting was changed. |
workspace.joining_strategy.updated | Workspace Joining Strategy Updated | The workspace's discoverability setting was changed (for example, between invitation-only and open for anyone from listed domains). |
workspace.invite_link.updated | Workspace Invite Link Updated | The workspace's invite link was turned on or off. |
workspace.invite_link.reset | Workspace Invite Link Reset | The workspace's invite link was reset, invalidating the old one. |
workspace.share_page_colors.updated | Workspace Share Page Colors Updated | The share page's primary, secondary, or background color was changed. |
workspace.share_page_logo.updated | Workspace Share Page Logo Updated | The share page logo was uploaded or deleted. |
workspace.user.invited | Workspace User Invited | A user was invited to the workspace. |
workspace.invitation.accepted | Workspace Invitation Accepted | A workspace invitation was accepted. |
workspace.invitation.revoked | Workspace Invitation Revoked | A workspace invitation was revoked. |
workspace.user.role_changed | Workspace User Role Changed | A user's role in the workspace was changed. |
workspace.user.removed | Workspace User Removed | A user was removed from the workspace. |
workspace.user.left | Workspace User Left | A user left the workspace voluntarily. |
workspace.license.changed | Workspace License Changed | A user's license in the workspace was changed. |
workspace.license.consumed | Workspace License Consumed | A user's license in the workspace was upgraded to Full. |
workspace.license.released | Workspace License Released | A user's license in the workspace was downgraded to Restricted. |
Organization
| Event | Name | Description |
|---|---|---|
organization.created | — | An organization was created. |
organization.name.changed | Organization Name Changed | The organization name was changed. |
organization.preferences.updated | Organization Preferences Updated | An organization setting was changed. |
organization.workspace_discoverability_domain.added | Organization Workspace Discoverability Domain Added | An allowed domain was added for workspace discoverability. |
organization.workspace_discoverability_domain.removed | Organization Workspace Discoverability Domain Removed | An allowed domain was removed from workspace discoverability. |
organization.sso_settings.updated | Organization SSO Settings Updated | Organization SSO settings were updated. |
organization.invitation.resent | Organization Invitation Resent | An organization invitation was resent. |
organization.invitation.revoked | Organization Invitation Revoked | An organization invitation was revoked. |
organization.user.role_changed | Organization User Role Changed | A user's role in the organization was changed. |
organization.user.removed | Organization User Removed | A user was removed from the organization. |
organization.license.changed | Organization License Changed | A user's license in the organization was changed. |
organization.license.consumed | Organization License Consumed | A user's license in the organization was upgraded to Full. |
organization.license.released | Organization License Released | A user's license in the organization was downgraded to Restricted. |
organization.insights.requested | Organization Insights Requested | An Insights report was requested. |
Billing
| Event | Name | Description |
|---|---|---|
billing.credits.consumed | Billing Credits Consumed | Credits were consumed by a feature. |
billing.credits.allocated | Billing Credits Allocated | Credits were allocated to a workspace. |
billing.credits.added | Billing Credits Added | Credits were manually granted to an account, for example by Synthesia support. |
billing.credits.purchased | Billing Credits Purchased | Credits were purchased. |
billing.credit_allocation_strategy.changed | Billing Credit Allocation Strategy Changed | The organization's credit allocation strategy was changed, between a shared pool across all workspaces and per-workspace allocation. |
billing.workspace_allocation.updated | Billing Credits Allocation Updated | A workspace's specific credit allocation amount was changed. |
Email send cap
| Event | Name | Description |
|---|---|---|
email_send_cap.recipient_exclusion.granted | Email Send Cap Recipient Exclusion Granted | A recipient was excluded from the email send cap. |
email_send_cap.recipient_exclusion.revoked | Email Send Cap Recipient Exclusion Revoked | A recipient's exclusion from the email send cap was revoked. |
Content
| Event | Name | Description |
|---|---|---|
dubbing.project.created | Dubbing Project Created | A dubbing project was created. |
asset.powerpoint.uploaded | Asset Powerpoint Uploaded | A PowerPoint file was imported. |
scorm.package.downloaded | — | A SCORM package was downloaded. |
Integrations
Covers HRIS and messaging integrations for the Learner Portal, and other external tool connections.
| Event | Name | Description |
|---|---|---|
integrations.connection.initiated | — | A connection to an external tool was started. |
integrations.connection.created | — | A connection to an external tool completed successfully. |
integrations.connection.deleted | — | A connection to an external tool was disconnected. |
Audit logs
| Event | Name | Description |
|---|---|---|
audit_logs.exported | Audit Logs Exported | An audit log export was requested. |
Learner Portal
The Learner Portal has its own set of events, covering Learner Groups, content assignment, and role entitlements. These are distinct from the core Admin/Member/Guest model—the Learner Portal has its own roles (Enablement Admin, Organization Admin, Manager, and Learner).
| Event | Name | Description |
|---|---|---|
entitlement.granted | — | A Learner Portal role (for example, Enablement Admin) was granted to a user. |
entitlement.revoked | — | A Learner Portal role was revoked from a user. |
lms.hris_sync_config.created | LMS Hris Sync Config Created | An HRIS sync was connected. |
lms.hris_sync_config.updated | LMS Hris Sync Config Updated | An HRIS sync's configuration was changed. |
lms.hris_sync_config.deleted | LMS Hris Sync Config Deleted | An HRIS sync was disconnected. |
lms.learner_group.created | LMS Learner Group Created | A Learner Group was created. Groups are either manual (fixed membership) or dynamic (populated automatically based on rules, for example department or email domain). |
lms.learner_group.updated | LMS Learner Group Updated | A Learner Group's name or targeting rule was changed. |
lms.learner_group.deleted | LMS Learner Group Deleted | A Learner Group was deleted. |
lms.learner_group_member.added | LMS Learner Group Member Added | A learner was added to a Learner Group. |
lms.learner_group_member.removed | LMS Learner Group Member Removed | A learner was removed from a Learner Group. |
lms.assignment_target.added | — | A learner was assigned a Roleplay Session. |
lms.assignment_target.removed | — | A learner's assignment to a Roleplay Session was removed. |