# Create an account
Source: https://developers.dock.us/api-reference/endpoint/accounts/create-an-account
post /accounts
Create an account
# Retrieve a list of accounts
Source: https://developers.dock.us/api-reference/endpoint/accounts/retrieve-a-list-of-accounts
get /accounts
Retrieve a list of accounts
# Retrieve an account
Source: https://developers.dock.us/api-reference/endpoint/accounts/retrieve-an-account
get /accounts/{id}
Retrieve an account by ID
# Update an account
Source: https://developers.dock.us/api-reference/endpoint/accounts/update-an-account
patch /accounts/{id}
Update an account by ID. Currently this endpoint only supports updating workspace custom field values.
# Retrieve an asset share link
Source: https://developers.dock.us/api-reference/endpoint/asset-share-link/retrieve-an-asset-share-link
get /asset-share-link/{id}
Retrieve an asset share link by ID
# Retrieve asset share links
Source: https://developers.dock.us/api-reference/endpoint/asset-share-link/retrieve-asset-share-links
get /asset-share-link
Retrieve the trackable and non-trackable share links for an asset, attributed to a user. Creates the links if they do not exist yet.
# Create an asset
Source: https://developers.dock.us/api-reference/endpoint/assets/create-an-asset
post /assets
Create an asset. For file-backed types (pdf, image, video, audio, docx, ppt, xlsx, htmlPage), first create a file via POST /files and PUT the bytes to its upload URL, then pass the file id here. Link and embed assets are created from a URL (or custom embed code) directly. Office documents (docx, ppt, xlsx) are converted to a PDF rendition asynchronously and are returned as the corresponding `microsoft*EmbedPdf` asset type — poll GET /files/{id} on the asset's file to track conversion.
See [Uploading files](/api-reference/uploading-files) for the end-to-end upload flow.
# Delete an asset
Source: https://developers.dock.us/api-reference/endpoint/assets/delete-an-asset
delete /assets/{id}
Delete an asset by ID
# Retrieve a list of assets
Source: https://developers.dock.us/api-reference/endpoint/assets/retrieve-a-list-of-assets
get /assets
Retrieve a list of assets
# Retrieve an asset
Source: https://developers.dock.us/api-reference/endpoint/assets/retrieve-an-asset
get /assets/{id}
Retrieve an asset by ID
# Update an asset
Source: https://developers.dock.us/api-reference/endpoint/assets/update-an-asset
patch /assets/{id}
Update an asset by ID. All properties are optional, and omitted properties remain unchanged.
# Retrieve a custom field
Source: https://developers.dock.us/api-reference/endpoint/custom-fields/retrieve-a-custom-field
get /custom-fields/{id}
Retrieve a custom field by ID
# Retrieve a list of custom fields
Source: https://developers.dock.us/api-reference/endpoint/custom-fields/retrieve-a-list-of-custom-fields
get /custom-fields
Retrieve a list of custom fields
# Retrieve a deal
Source: https://developers.dock.us/api-reference/endpoint/deals/retrieve-a-deal
get /deals/{id}
Retrieve a deal by ID
# Retrieve a list of deals
Source: https://developers.dock.us/api-reference/endpoint/deals/retrieve-a-list-of-deals
get /deals
Retrieve a list of deals
# Update a deal
Source: https://developers.dock.us/api-reference/endpoint/deals/update-a-deal
patch /deals/{id}
Update a deal by ID. Currently this endpoint only supports updating deal custom field values.
# Create a file
Source: https://developers.dock.us/api-reference/endpoint/files/create-a-file
post /files
Create a file and receive a presigned upload URL. PUT the raw file bytes to the returned upload URL (with the matching Content-Type header), then pass the file id to POST /assets to create an asset from it.
# Retrieve a file
Source: https://developers.dock.us/api-reference/endpoint/files/retrieve-a-file
get /files/{id}
Retrieve a file by ID
# Retrieve a form
Source: https://developers.dock.us/api-reference/endpoint/forms/retrieve-a-form
get /forms/{id}
Retrieve a form by ID. Accepts the ID of a published form, or the ID of its draft, which resolves to the published form
# Retrieve a list of forms
Source: https://developers.dock.us/api-reference/endpoint/forms/retrieve-a-list-of-forms
get /forms
Retrieve a list of published forms. Draft forms are not returned
# Retrieve form responses
Source: https://developers.dock.us/api-reference/endpoint/forms/retrieve-form-responses
get /forms/{id}/responses
Retrieve the completed submissions of a form, newest first. Each submission includes the questions the respondent answered and their answers. File answers include presigned download URLs that expire after one hour
# Create a meeting
Source: https://developers.dock.us/api-reference/endpoint/meetings/create-a-meeting
post /meetings
Create a meeting with a call transcript on an account. Identify the account with exactly one of accountId, accountDomain, hubspotCompanyId or salesforceAccountId — the account must already exist (create one with POST /accounts). Provide the transcript as raw text (the meeting is created completed), or as a fileId referencing an uploaded pdf/docx file (max 25MB) from POST /files — the transcript text is then extracted asynchronously: the meeting is created with status processing and transitions to completed once extraction finishes, or to failed with the reason in processingError. Poll GET /meetings/{id}?properties=status&properties=processingError to track it. Dock asynchronously generates an AI summary and search embeddings for the meeting once the transcript is available.
## Identifying the account
Identify the account with exactly one of `accountId`, `accountDomain`,
`hubspotCompanyId` or `salesforceAccountId`. The account must already exist —
this endpoint never creates accounts. Use
[Create an account](/api-reference/endpoint/accounts/create-an-account) first,
or find one with the `filters` on
[Retrieve a list of accounts](/api-reference/endpoint/accounts/retrieve-a-list-of-accounts).
`accountDomain` is matched against the account's website after normalization
(protocol, `www.` prefix and paths are stripped) — subdomains and apex domains
are distinct.
## Providing the transcript
Provide the transcript as raw text (`transcript`), or as a `fileId`
referencing an uploaded `.pdf` or `.docx` document (max 25MB) — see
[Uploading files](/api-reference/uploading-files). The transcript text is
extracted from the document when the meeting is created, so the file upload
must be completed first.
After creation, Dock asynchronously generates an AI summary and search
embeddings for the meeting. Email participants that don't exist yet are
created as contacts on the account.
# Retrieve a meeting
Source: https://developers.dock.us/api-reference/endpoint/meetings/retrieve-a-meeting
get /meetings/{id}
Retrieve a meeting by its ID
The transcript can be large, so it is only included when explicitly requested
via `properties=transcript`.
# Ping the API
Source: https://developers.dock.us/api-reference/endpoint/status-check/ping
get /ping
Ping the API to check if it's up
# Create a tag
Source: https://developers.dock.us/api-reference/endpoint/tags/create-a-tag
post /tags
Create a tag
# Delete a tag
Source: https://developers.dock.us/api-reference/endpoint/tags/delete-a-tag
delete /tags/{id}
Delete a tag by ID
# Retrieve a list of tags
Source: https://developers.dock.us/api-reference/endpoint/tags/retrieve-a-list-of-tags
get /tags
Retrieve a list of tags
# Retrieve a tag
Source: https://developers.dock.us/api-reference/endpoint/tags/retrieve-a-tag
get /tags/{id}
Retrieve a tag by ID
# Update a tag
Source: https://developers.dock.us/api-reference/endpoint/tags/update-a-tag
patch /tags/{id}
Update a tag by ID
# Retrieve a list of templates
Source: https://developers.dock.us/api-reference/endpoint/templates/retrieve-a-list-of-templates
get /templates
Retrieve a list of templates
# Retrieve a template
Source: https://developers.dock.us/api-reference/endpoint/templates/retrieve-a-template
get /templates/{id}
Retrieve a template by ID
# Retrieve a list of users
Source: https://developers.dock.us/api-reference/endpoint/users/retrieve-a-list-of-users
get /users
Retrieve a list of users
# Retrieve a user
Source: https://developers.dock.us/api-reference/endpoint/users/retrieve-a-user
get /users/{id}
Retrieve a user by ID
# Create a workspace domain
Source: https://developers.dock.us/api-reference/endpoint/workspace-domains/create-a-workspace-domain
POST /workspace-domains
Create a workspace domain
# Delete a workspace domain
Source: https://developers.dock.us/api-reference/endpoint/workspace-domains/delete-a-workspace-domain
delete /workspace-domains/{id}
Delete a workspace domain by ID
# Retrieve a list of workspace domains
Source: https://developers.dock.us/api-reference/endpoint/workspace-domains/retrieve-a-list-of-workspace-domains
get /workspace-domains
Retrieve a list of workspace domains
# Retrieve a workspace domain
Source: https://developers.dock.us/api-reference/endpoint/workspace-domains/retrieve-a-workspace-domain
get /workspace-domains/{id}
Retrieve a workspace domain by ID
# Update a workspace domain
Source: https://developers.dock.us/api-reference/endpoint/workspace-domains/update-a-workspace-domain
PATCH /workspace-domains/{id}
Update a workspace domain
# Retrieve a list of workspace iframe embeds
Source: https://developers.dock.us/api-reference/endpoint/workspace-iframe-embeds/retrieve-a-list-of-workspace-iframe-embeds
get /workspace-iframe-embeds
Retrieve a list of workspace iframe embeds. Only embeds whose iframe is placed in a section on an existing workspace page (or that back a task action) are included — orphaned embeds are omitted.
# Retrieve a workspace iframe embed
Source: https://developers.dock.us/api-reference/endpoint/workspace-iframe-embeds/retrieve-a-workspace-iframe-embed
get /workspace-iframe-embeds/{id}
Retrieve a workspace iframe embed by ID. Returns 404 if the embed's iframe is no longer placed in a section on an existing workspace page (unless it backs a task action).
# Update a workspace iframe embed
Source: https://developers.dock.us/api-reference/endpoint/workspace-iframe-embeds/update-a-workspace-iframe-embed
patch /workspace-iframe-embeds/{id}
Update a workspace iframe embed by ID, from an embed snippet (JSON `customCode`), raw HTML (JSON `html`), or an HTML file sent as the request body (`Content-Type: text/html`). HTML input behaves exactly like the in-app Upload HTML button: full documents are wrapped in a sandboxed srcdoc iframe. Updates the embed code rendered in the workspace and directly in the published workspace view — no new publication is created and no publish side effects run. Returns 404 if the embed's iframe is no longer placed in a section on an existing workspace page (unless it backs a task action).
# Retrieve a list of workspace pages
Source: https://developers.dock.us/api-reference/endpoint/workspace-pages/retrieve-a-list-of-workspace-pages
get /workspace-pages
Retrieve a list of workspace pages
# Retrieve a workspace page
Source: https://developers.dock.us/api-reference/endpoint/workspace-pages/retrieve-a-workspace-page
get /workspace-pages/{id}
Retrieve a workspace page by ID
# Update a workspace page
Source: https://developers.dock.us/api-reference/endpoint/workspace-pages/update-a-workspace-page
patch /workspace-pages/{id}
Update a workspace page by ID
# Create a workspace plan task
Source: https://developers.dock.us/api-reference/endpoint/workspace-plan-tasks/create-a-workspace-plan-task
post /workspace-plan-tasks
Create a workspace plan task. Pass parentTaskId to create a subtask
# Retrieve a list of workspace plan tasks
Source: https://developers.dock.us/api-reference/endpoint/workspace-plan-tasks/retrieve-a-list-of-workspace-plan-tasks
get /workspace-plan-tasks
Retrieve a list of workspace plan tasks
# Retrieve a workspace plan task
Source: https://developers.dock.us/api-reference/endpoint/workspace-plan-tasks/retrieve-a-workspace-plan-task
get /workspace-plan-tasks/{id}
Retrieve a workspace plan task by ID
# Update a workspace plan task
Source: https://developers.dock.us/api-reference/endpoint/workspace-plan-tasks/update-a-workspace-plan-task
patch /workspace-plan-tasks/{id}
Update a workspace plan task by ID
# Retrieve a list of workspace plans
Source: https://developers.dock.us/api-reference/endpoint/workspace-plans/retrieve-a-list-of-workspace-plans
get /workspace-plans
Retrieve a list of workspace plans
# Retrieve a workspace plan
Source: https://developers.dock.us/api-reference/endpoint/workspace-plans/retrieve-a-workspace-plan
get /workspace-plans/{id}
Retrieve a workspace plan by ID
# Retrieve a list of workspace sections
Source: https://developers.dock.us/api-reference/endpoint/workspace-sections/retrieve-a-list-of-workspace-sections
get /workspace-sections
Retrieve a list of workspace sections
# Retrieve a workspace section
Source: https://developers.dock.us/api-reference/endpoint/workspace-sections/retrieve-a-workspace-section
get /workspace-sections/{id}
Retrieve a workspace section by ID
# Update a workspace section
Source: https://developers.dock.us/api-reference/endpoint/workspace-sections/update-a-workspace-section
patch /workspace-sections/{id}
Update a workspace section by ID
# Create a workspace user
Source: https://developers.dock.us/api-reference/endpoint/workspace-users/create-a-workspace-user
POST /workspace-users
Create a workspace user
# Delete a workspace user
Source: https://developers.dock.us/api-reference/endpoint/workspace-users/delete-a-workspace-user
delete /workspace-users/{id}
Delete a workspace user by ID
# Retrieve a list of workspace users
Source: https://developers.dock.us/api-reference/endpoint/workspace-users/retrieve-a-list-of-workspace-users
get /workspace-users
Retrieve a list of workspace users
# Retrieve a workspace user
Source: https://developers.dock.us/api-reference/endpoint/workspace-users/retrieve-a-workspace-user
get /workspace-users/{id}
Retrieve a workspace user by ID
# Update a workspace user
Source: https://developers.dock.us/api-reference/endpoint/workspace-users/update-a-workspace-user
PATCH /workspace-users/{id}
Update a workspace user by ID
# Archive a workspace
Source: https://developers.dock.us/api-reference/endpoint/workspaces/archive-a-workspace
post /workspaces/{id}/archive
Archive a workspace
# Create a workspace
Source: https://developers.dock.us/api-reference/endpoint/workspaces/create-a-workspace
post /workspaces
Create a workspace. Companies on the free plan are limited to 10 workspaces total (active and archived combined); once the limit is reached, this endpoint returns 403 FORBIDDEN.
# Get an authenticated embed url
Source: https://developers.dock.us/api-reference/endpoint/workspaces/get-an-authenticated-embed-url
post /workspaces/{id}/authenticated-embed-url
Get authenticated embed url
Once an authenticated embed url is generated it remains valid for 2 minutes.
# Retrieve a list of workspaces
Source: https://developers.dock.us/api-reference/endpoint/workspaces/retrieve-a-list-of-workspaces
get /workspaces
Retrieve a list of workspaces
# Retrieve a workspace
Source: https://developers.dock.us/api-reference/endpoint/workspaces/retrieve-a-workspace
get /workspaces/{id}
Retrieve a workspace by ID
# Set workspace access
Source: https://developers.dock.us/api-reference/endpoint/workspaces/set-workspace-access
post /workspaces/{id}/access
Set workspace access
# Update a workspace
Source: https://developers.dock.us/api-reference/endpoint/workspaces/update-a-workspace
patch /workspaces/{id}
Update a workspace by ID
# Errors
Source: https://developers.dock.us/api-reference/errors
Troubleshoot problems with this comprehensive breakdown of all error codes.
Dock API returns machine readable error codes, human readable error messages and a link to the docs for more information.
Here is how an error response looks like:
```json theme={null}
{
"error": {
"code": "NOT_FOUND",
"message": "The requested resource was not found."
}
}
```
## Error Codes
Here is a list of all error codes Dock API returns:
### `BAD_REQUEST`
* **Status:** 400
* **Problem:** The request is malformed, either missing required fields, using wrong datatypes, or being syntactically incorrect.
* **Solution:** Check the request and make sure it is properly formatted.
### `UNAUTHORIZED`
* **Status:** 401
* **Problem:** The client is unauthenticated, meaning it has not provided valid credentials to access the resource.
* **Solution:** Provide valid authentication credentials.
### `FORBIDDEN`
* **Status:** 403
* **Problem:** The client is authenticated but does not have permission to access the requested resource.
* **Solution:** Verify that the client has the necessary access rights to the resource.
### `NOT_FOUND`
* **Status:** 404
* **Problem:** The requested resource could not be found on the server.
* **Solution:** Ensure the requested URL or resource identifier is correct.
### `RATE_LIMIT_EXCEEDED`
* **Status:** 429
* **Problem:** The client has sent too many requests in a short period, triggering rate limiting.
* **Solution:** Wait for a while before sending more requests, or adjust the request rate.
### `INTERNAL_SERVER_ERROR`
* **Status:** 500
* **Problem:** The server encountered an unexpected condition that prevented it from fulfilling the request.
* **Solution:** This is a server-side issue. Try again later or contact support if the problem persists.
# Introduction
Source: https://developers.dock.us/api-reference/introduction
Fundamental concepts of Dock's API.
## Base URL
Dock's API is built on REST principles and is served over HTTPS. To ensure data privacy, unencrypted HTTP is not supported.
The Base URL for all API endpoints is:
```bash Terminal theme={null}
https://api.dock.us
```
## Authentication
Authentication to Dock's API is performed via the Authorization header with a Bearer token. To authenticate, you need to include the Authorization header with the word `Bearer` followed by your API key in your requests like so:
```bash Terminal theme={null}
Authorization: Bearer
```
Learn more about [how to get your API key](/api-reference/tokens).
## Selecting returned properties
Endpoints that return a resource accept a `properties` query parameter that controls which fields are included in the response. If you omit it, the response contains **only** the resource's `id`, `object`, and `url` — no other fields are returned by default:
```bash Request theme={null}
curl https://api.dock.us/v1/workspaces/ \
-H "Authorization: Bearer "
```
```json Response theme={null}
{
"data": {
"workspace": {
"id": "",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/"
}
}
}
```
To receive any other field, request it explicitly by repeating the `properties` parameter once per field:
```bash Request theme={null}
curl "https://api.dock.us/v1/workspaces/?properties=name&properties=workspaceUrl" \
-H "Authorization: Bearer "
```
Each endpoint's reference page lists the property names available for that resource under the `properties` parameter.
## Response Codes
The API returns standard HTTP response codes to indicate the success or failure of an API request. Here are a few examples:
| Code | Description |
| ----- | ---------------------------------------------------------------------------------------------- |
| `200` | The request was successful. |
| `400` | The request was invalid or cannot be served. |
| `401` | The request requires user authentication. |
| `403` | The server understood the request, but refuses to authorize it. |
| `404` | The requested resource could not be found. |
| `408` | The server received the request but did not process it yet. |
| `429` | Too many requests. |
| `500` | The server encountered an unexpected condition which prevented it from fulfilling the request. |
# Pagination
Source: https://developers.dock.us/api-reference/pagination
Learn how to paginate through resources in the API.
The pagination feature allows you to retrieve a subset of resources from the API. This is useful when you have a large number of resources and you want to retrieve them in smaller chunks.
These list API methods share a common set of parameters that allow you to control the number of items returned and the page number. For example, you can:
* [retrieve a list of accounts](/api-reference/endpoint/accounts/retrieve-a-list-of-accounts)
* [retrieve a list of users](/api-reference/endpoint/users/retrieve-a-list-of-users)
* [retrieve a list of workspaces](/api-reference/endpoint/workspaces/retrieve-a-list-of-workspaces)
## Parameters
The page number to retrieve. By default, the first page is returned.
The number of items to retrieve per page. The default value varies by
endpoint.
Here is how pagination response data looks like:
```json theme={null}
{
"pageInfo": {
"page": 1,
"pages": 10,
"total": 100,
"pageTotal": 10,
"hasNextPage": true,
"hasPrevPage": false
}
}
```
## Example
The following example demonstrates how to retrieve the first page of 10 links:
```bash cURL theme={null}
curl --request GET \
--url 'https://api.dock.us/v1/accounts?page=1&limit=10' \
--header 'Authorization: Bearer '
```
```javascript JavaScript theme={null}
const options = { method: 'GET', headers: { Authorization: 'Bearer ' } };
fetch('https://api.dock.us/v1/accounts?page=1&limit=10', options)
.then(response => response.json())
.then(response => console.log(response))
.catch(err => console.error(err));
```
```python Python theme={null}
import requests
url = "https://api.dock.us/v1/accounts"
querystring = {"page":"1","limit":"10"}
headers = {"Authorization": "Bearer "}
response = requests.request("GET", url, headers=headers, params=querystring)
print(response.text)
```
```go Go theme={null}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.dock.us/v1/accounts?page=1&limit=10"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer ")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := ioutil.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}
```
# Rate limits
Source: https://developers.dock.us/api-reference/rate-limits
Learn about Dock's API rate limits.
Dock API rate limiting is in conformance with the [IETF standard](https://datatracker.ietf.org/doc/html/draft-ietf-httpapi-ratelimit-headers):
| Header Name | Description |
| ----------------------- | ------------------------------------------------------------------------------- |
| `X-RateLimit-Limit` | The maximum number of requests that the consumer is permitted to make per hour. |
| `X-RateLimit-Remaining` | The number of requests remaining in the current rate limit window. |
| `X-RateLimit-Reset` | The time at which the current rate limit window resets in UTC epoch seconds. |
| `Retry-After` | The number of seconds to wait before retrying the request again. |
Dock's API is capped at **120 requests per minute** per company except for the following endpoints:
* [`POST /v1/workspaces` (30 requests per minute)](api-reference/endpoint/workspaces/create-a-workspace)
* [`GET /v1/files/{id}` (60 requests per minute)](api-reference/endpoint/files/retrieve-a-file)
This is implemented to ensure a fair usage policy so that excessive use by a single user does not adversely affect the performance and usage of the API by others.
You'll receive a `429 Too Many Requests` response code if the rate limit is exceeded.
# API Keys
Source: https://developers.dock.us/api-reference/tokens
Learn how to get your Dock API key.
API keys on Dock allow you to access your data programmatically. This is useful for integrating Dock into your application or with other tools and services.
Each API key is tied to your company – meaning you can use it to access your company's resources without having to worry about "leaking" access to other companies.
## Secret keys
API keys on Dock – **Secret keys**.
| Type | Format (Example) | When to use |
| :--------- | :------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Secret** | `69b005b71e69-4f38-9ld9-9789592a3dfe` | Use this key to authenticate requests on your server. By default, you can use this key to perform any API request without restriction, so it must be stored securely in your app's server-side code (such as in an environment variable or credential management system). Don’t expose this key on a website. |
## Create a secret API key
You must be an account `admin` to create an API key.
You can create an API key by following these steps:
Go to **Settings** > **API** in your Dock account.
Click on the "Create new secret key" button and give the API key a name.
Click on the "Copy" button and store it in a safe place since you won't be able to see it again.
Now that you have your API key, you can use it to access your workspace's resources programmatically via SDKs or within any API request as a bearer token.
```
Authorization: Bearer xxxxxxxx
```
# Uploading files
Source: https://developers.dock.us/api-reference/uploading-files
Learn how to upload files using API.
Creating an asset from a file is a two-step process: upload the file, then create the asset from it. Link and embed assets skip the upload entirely — create them directly with a `url` (or `customCode`).
## 1. Create a file and upload the bytes
Call [Create a file](/api-reference/endpoint/files/create-a-file) with the file's name and MIME type. The response contains the file `id` and a presigned `upload` target:
```bash theme={null}
curl -X POST https://api.dock.us/v1/files \
-H "Authorization: Bearer $DOCK_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileName": "sales-deck.pdf", "mimeType": "application/pdf"}'
```
```json theme={null}
{
"data": {
"file": {
"id": "f9Ghw2n0Ju3D",
"uploadStatus": "in_progress",
"url": null
},
"upload": {
"url": "https://storage.googleapis.com/...",
"method": "PUT",
"headers": { "Content-Type": "application/pdf" },
"expiresAt": ""
}
}
}
```
Then `PUT` the raw bytes directly to `upload.url` with the returned `Content-Type` header, before `expiresAt` (1 hour):
```bash theme={null}
curl -X PUT "" \
-H "Content-Type: application/pdf" \
--data-binary @sales-deck.pdf
```
The `Content-Type` header on the PUT request must exactly match the `mimeType`
the file was created with, or Google Cloud Storage rejects the upload.
## 2. Create the asset
Call [Create an asset](/api-reference/endpoint/assets/create-an-asset) with the file id. Dock verifies the upload completed, marks the file ready, and creates the asset — optionally tagged with existing [tags](/api-reference/endpoint/tags/create-a-tag):
```bash theme={null}
curl -X POST https://api.dock.us/v1/assets \
-H "Authorization: Bearer $DOCK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "pdf",
"name": "Sales deck",
"fileId": "f9Ghw2n0Ju3D",
"tagIds": ["RiHO4e0Ju3DS"]
}'
```
Calling this before the bytes are uploaded returns a `400` — retry after the PUT completes. A file can back exactly one asset.
## Supported asset types
| `type` | Source | Notes |
| ---------- | --------------------- | ----------------------------------------------------------- |
| `pdf` | `fileId` | Page count and document metadata extracted automatically |
| `image` | `fileId` | Dimensions extracted automatically |
| `video` | `fileId` | Pass `metadata.width/height/duration` if available |
| `audio` | `fileId` | Pass `metadata.duration` if available |
| `docx` | `fileId` | Converted to PDF; returned as `microsoftWordEmbedPdf` |
| `ppt` | `fileId` | Converted to PDF; returned as `microsoftPowerPointEmbedPdf` |
| `xlsx` | `fileId` | Converted to PDF; returned as `microsoftExcelEmbedPdf` |
| `htmlPage` | `fileId` | Standalone HTML file rendered as a page |
| `link` | `url` | Link preview metadata resolved automatically |
| `embed` | `url` or `customCode` | Exactly one of the two |
## Office documents convert asynchronously
Uploaded office documents (`docx`, `ppt`, `xlsx`) are rendered to PDF in the background. The asset is created immediately, but its backing file reports `uploadStatus: "in_progress"` until conversion finishes. Poll [Retrieve a file](/api-reference/endpoint/files/retrieve-a-file) with `properties[]=uploadStatus` to track it.
# Data model
Source: https://developers.dock.us/data-model
A quick overview of how Dock's data model is structured.
Whether you are using Dock's [API](/api-reference/introduction) or not, this page is a quick way to understand how Dock's data is structured.
When interacting with Dock's API, you'll also need to create an [API key](/api-reference/tokens) to authenticate your requests.
## Account
Account represents any external relationships, typically another company. The most common use case for an Account is your customer or sales prospect.
Integration with external systems like Salesforce and HubSpot allows for seamless synchronization of account data, enhancing the management of client relationships and related business processes.
All the accounts are associated with a company that can be accessed via the [API](/api-reference/endpoint/accounts/retrieve-a-list-of-accounts). An account can also be [created](/api-reference/endpoint/accounts/create-an-account), [updated](/api-reference/endpoint/accounts/update-an-account) via the API.
The name of the account.
The website of the account.
The ID of the user who owns the account.
The logo of the account.
The ID of the Salesforce account.
The ID of the Hubspot company.
## Deal
Deals are a way to track and manage your sales pipeline. If you have a CRM integration,
you can sync your deals(HubSpot deals, Salesforce opportunities, etc.) with Dock.
The name of the deal.
The Hubspot deal ID (when deal is from Hubspot).
The Salesforce opportunity ID (when deal is from Salesforce).
Monetary value of the deal.
Expected or actual closing date of the deal.
Example format: "2021-01-01T00:00:00.000Z"
Date when the deal was created in the source system.
Example format: "2021-01-01T00:00:00.000Z"
Current stage of the deal.
Type of the deal.
## User
User represents an individual who interacts with the Dock platform. Each user can be associated with a [company](/data-model#company), create or manage [workspaces](/data-model#workspace),
and perform various tasks within the system. Users have roles, permissions,
and can participate in collaborations, making them key actors in the product’s ecosystem.
The first name of the user.
The last name of the user.
The avatar of the user.
The email of the user.
The name of the user.
## Template
Template represents a pre-defined group of pages & sections. Templates can be turned into [Workspaces](/data-model#workspace).
Templates are a powerful way to build scalable processes across the organization. As your team members start to create their own [Workspaces](/data-model#workspace),
templates can help them save time configuring and ultimately help ensure that everyone is following a similar framework.
Read more about [templates](https://help.dock.us/en/articles/8404524-what-are-templates).
The types of the template.
The title of the template.
Whether a Slack channel is enabled for the template.
Whether messages are enabled for the template.
Whether stages are enabled for the template.
## Workspace
Workspaces are a shared space between your organization and an external organization. Since they are built on a flexible editor, they can be used for a variety of cases.
You can create a workspace with a [template](/data-model#template) too. Workspaces can be managed with the [Workspaces API](/api-reference/endpoint/workspaces/retrieve-a-list-of-workspaces).
Read more about [workspaces](https://help.dock.us/en/articles/6867240-what-are-workspaces).
The name of the workspace.
The URL of the workspace.
The ID of the template.
The start date of the workspace.
The target end date of the workspace.
The actual end date of the workspace.
The age of the project.
The progress of the task.
The last client view of the workspace.
The total views of the workspace.
The total actions of the workspace.
The total time spent of the workspace.
The number of clients per workspace.
The account associated with the workspace.
The name of the account.
The website of the account.
The ID of the user who owns the account.
The logo of the account.
The ID of the Salesforce account.
The ID of the Hubspot company.
Workspace domains associated with the workspace.
The domain name in the email addresses that are associated with this
workspace.
The role of the user in the workspace.
Workspace users associated with the workspace.
The role of the user in the workspace.
The user associated with the workspace user.
The first name of the user.
The last name of the user.
The avatar of the user.
The email of the user.
The name of the user.
The deal associated with the workspace.
The name of the deal.
The amount of the deal.
The close date of the deal.
Example format: "2021-01-01T00:00:00.000Z"
The created date of the deal.
Example format: "2021-01-01T00:00:00.000Z"
The type of the deal.
The stage of the deal.
The ID of the Hubspot deal. Cannot be used together with salesforceOpportunityId.
The ID of the Salesforce opportunity. Cannot be used together with hubspotDealId.
## Workspace user
Workspace users are users who are associated with a workspace.
The role of the user in the workspace.
The user associated with the workspace user.
The first name of the user.
The last name of the user.
The avatar of the user.
The email of the user.
The name of the user.
## Workspace domain
Workspace domains are domains that are associated with a workspace.
The domain name in the email addresses that are associated with this
workspace.
The role of the user in the workspace.
## Workspace page
[Workspaces](/data-model#workspace) can be composed of multiple pages to help you organize your content.
Each tab at the top of a [workspace](/data-model#workspace) is a page. Workspace pages can be ordered, hidden, and have custom names.
This allows you to organize your [workspace](/data-model#workspace) in a way that makes sense for your team.
Read more about [workspace pages](https://help.dock.us/en/articles/8253951-pages-in-a-workspace).
The name of the workspace page.
The navigation name of the workspace page.
Whether the workspace page is hidden.
The index of the workspace page.
## Workspace section
Workspace pages are made up of a collection of Workspace Sections. Sections contain text, PDFs, images, links, widgets, and embeds. Sections are the building blocks of a workspace.
Read more about [workspace sections](https://help.dock.us/en/articles/6867258-creating-sections).
The name of the workspace section.
The navigation name of the workspace section.
Whether the workspace section is hidden.
The index of the workspace section.
Whether the workspace section is synced.
Whether the workspace section is collaborative.
Whether the workspace section is hidden from navigation.
## Workspace plan
Workspace plan is a project plan that organizes a group of tasks. Dock enables you to collaborate hands-on with
customers and prospects through mutual action plans. You can customize Checklists, Timelines and Kanbans to help
ensure you're moving that customer relationship forward.
You can also using them internally within a [Workspace](/data-model#workspace), to make sure you're aligned with your team on your to-do's!
Read more about [workspace plans](https://help.dock.us/en/articles/6858708-what-are-project-plans).
The status of the workspace plan.
The title of the workspace plan.
Whether the workspace plan allows collaboration.
Whether the workspace plan allows collapse.
The view type of the workspace plan.
## Workspace plan task
Workspace plan tasks represent an action item. These checklists are composed of tasks and can be helpful in assigning out responsibilities or tracking a "to-do" list of sorts.
They are highly customizable — you can assign ownership, update the status of that item, and add a due date that sends out notifications automatically.
Tasks include assignees, due dates, start dates, action buttons, descriptions, and comments.
Read more about [workspace plan tasks](https://help.dock.us/en/articles/6858715-tasks-in-project-plans).
Whether the task is internal.
The status of the task.
The date and time when the task was completed.
The URL of the action link.
The name of the action link.
The text of the action.
The type of the action.
Whether the action text is shown.
The start date of the task.
The title of the task.
The due date of the task.
The index of the task.
## Custom field
Custom fields are a way to add custom data to your deals, accounts, and workspaces.
The name of the custom field.
The variable name of the custom field.
The type of the custom field.
The options of the custom field.
The index of the option.
The label of the option.
The value of the option.
## Asset
Assets are typically a piece of content (PDFs, links, images, or videos). Assets are found in Dock’s content library and can be tagged.
Read more about [assets](https://help.dock.us/en/articles/6885248-intro-to-content-management).
The type of the resource.
The name of the asset.
The description of the asset.
The number of views of the asset.
The number of shares of the asset.
The type of the asset.
The URL of the asset.
Whether the asset is restricted to internal use.
The tags associated with the asset.
The name of the tag.
## Asset share link
Asset share links are the shareable URLs for an asset, attributed to a user. Each link comes in a trackable variant (engagement is attributed to the user) and a non-trackable public variant. You can retrieve them with the [Asset share links API](/api-reference/endpoint/asset-share-link/retrieve-asset-share-links).
The type of the resource.
The ID of the asset the share links belong to.
The ID of the user the share links are attributed to.
The trackable share URL. Views and engagement are attributed to the user.
The non-trackable (public) share URL. Always `null` for internal assets.
## File
Files represent uploaded files and downloadable attachments in Dock.
You can retrieve a file with the [Files API](/api-reference/endpoint/files/retrieve-a-file).
The name of the file.
The thumbnail URL of the file when available.
The size of the file in bytes.
The expiration date and time of the signed download URL.
Example format: "2021-01-01T00:00:00.000Z"
## Tag
Tags are labels you can use to organize and filter your content [assets](/data-model#asset).
For example, you might have a tag called "Integrations."
Searching for a tag returns all content [assets](/data-model#asset) associated with it.
You can create and manage tags with the [Tags API](/api-reference/endpoint/tags/create-a-tag).
Read more about content management in Dock's Help Center.
The title of the tag.
# Dock MCP
Source: https://developers.dock.us/dock-mcp/dock-mcp
Connect AI agents to Dock using the Model Context Protocol.
## Dock MCP Server
Dock’s MCP server can be found here: [https://api.dock.us/mcp](https://api.dock.us/mcp)
When connected, your AI agent can create workspaces & playbooks, find content, answer enablement questions, and more.
## Where can I use Dock MCP?
Dock MCP works anywhere that accepts an MCP server like Claude, ChatGPT, Gemini, CoPilot, and Cursor.
Quick setup links can be found here:
* [Claude](https://claude.ai/directory/dock)
* [ChatGPT](https://help.dock.us/en/articles/15435827-using-dock-with-chatgpt-codex-via-mcp)
* [Gemini](https://help.dock.us/en/articles/15435990-using-dock-with-gemini-via-mcp)
## What can I do with Dock MCP?
Dock MCP supports a variety of workflows, including:
* Create and edit workspaces
* Create and edit playbooks
* Manage your library (add/remove tags, archive assets, etc)
* Ask questions about your workspaces and customers
* Ask questions about library assets
* Ask questions to custom Dock agents
# Embedding workspace
Source: https://developers.dock.us/embedding-workspace
A quick overview of how to embed Dock's workspace in your app.
## How to embed a Dock workspace into your app
You’re a developer who has a SaaS application and you want to embed Dock within your application.
The following guide will explain how to set up an onboarding experience for your customers.
Your “onboarding experience“ is an onboarding Dock workspace that’s associated with an account that has signed up for your app.
Once you create the workspace template, you can now create workspaces for new accounts that sign up for your app.
Account represents any external relationships, typically another company. The most common use case for an Account is your customer or sales prospect.
Integration with external systems like Salesforce and HubSpot allows for seamless synchronization of account data, enhancing the management of client relationships and related business processes.
All the accounts are associated with a company that can be accessed via the [API](/api-reference/endpoint/accounts/retrieve-a-list-of-accounts).
An account can also be [created](/api-reference/endpoint/accounts/create-an-account), [updated](/api-reference/endpoint/accounts/update-an-account) via the API.
Example:
* OpenAI has signed up for your app.
* After they signup you can create an onboarding workspace for them.
* If you’re using Salesforce and OpenAI is associated with an account:
* [Documentation](/api-reference/endpoint/workspaces/create-a-workspace) to create workspace with Salesforce account Id
* If you’re using HubSpot and OpenAI is associated with a company:
* [Documentation](/api-reference/endpoint/workspaces/create-a-workspace) to create workspace with HubSpot company Id
* If you are using neither CRM you can manually create an Dock account:
* [Documentation](/api-reference/endpoint/accounts/create-an-account) to create Dock account
* [Documentation](/api-reference/endpoint/workspaces/create-a-workspace) to create workspace with Dock account
* In your application, you have a page where you want to embed the Dock workspace.
* There’s a user signed in to your app ([sam@openai.com](mailto:sam@openai.com)). They are associated with the account, OpenAI.
* You want to create an Authenticated Embed Url, for [sam@openai.com](mailto:sam@openai.com), for the workspace you created for the account, OpenAI. [documentation](/api-reference/endpoint/workspaces/create-a-workspace)
* This generated url will automatically log in [sam@openai.com](mailto:sam@openai.com) to the Dock workspace.
In order to embed a workspace in your app you must have access to the Dock API
and the workspace that you want to embed must be published
## To embed a workspace in your app, you'll need to follow these steps:
Implement a business logic in your app that hits the [authenticated embed
url api end
point](api-reference/endpoint/workspaces/get-an-authenticated-embed-url)
with the **email** of the user that you want to log in and the **workspace
id**
Use the url received in the response and embed it in an iframe in your app.
```iframe theme={null}
```
Once an authenticated embed url is generated it remains valid for 2 minutes. So, make sure to use it within 2 minutes.
Once the iframe is loaded the **authToken** in the url is exchanged with the
server in order to authenticate the user. Once verified the user can access
and interact with the workspace.
# Programmatic iFrame Updates
Source: https://developers.dock.us/iframe-updates
Use an iFrame API ID to identify and update the corresponding iFrame widget in any workspace created from a template. This allows you to programmatically populate personalized or dynamic content across many workspaces.
Common use cases
* Client dashboards
* HTML Slides
* ROI calculators
* Custom content
## Setup Instructions
### Get iFrame API ID
1. In Dock, open the relevant workspace template.
2. Select **Add content**, then choose **iFrame**.
3. Add an empty iFrame widget to the template.
4. Hover over the iFrame widget and select the three-dot menu.
5. Select **Copy API ID**.
### Populate or update the iFrame
1. [Find an existing Workspace](https://developers.dock.us/api-reference/endpoint/workspaces/retrieve-a-workspace) or [create new Workspace](https://developers.dock.us/api-reference/endpoint/workspaces/create-a-workspace) from the template
2. [Find the iFrame embed](https://developers.dock.us/api-reference/endpoint/workspace-iframe-embeds/retrieve-a-workspace-iframe-embed) using its API ID
3. [Update the iFrame embed](https://developers.dock.us/api-reference/endpoint/workspace-iframe-embeds/update-a-workspace-iframe-embed) with your code or HTML file
# Welcome to Dock
Source: https://developers.dock.us/introduction
Dock is a revenue enablement platform for collaborating with buyers, managing your content, and training your team.
## Core Concepts
Three key concepts that relate to the Dock API:
* **Workspaces**: Where you collaborate with customers. Common use cases include sales rooms, customer implementations, and client portals.
* **Accounts**: Your customers. Typically synced with Salesforce or HubSpot
* **Library**: Content repository for your team. Upload all your assets and share with customers.
## Getting Started
To get started with Dock, you can do any of the following:
Sign up for an account
Learn how to use Dock API to create and manage links programmatically
Learn how to use Dock Webhooks to receive real-time notifications on events
happening across your Dock workspace
Read our latest product updates
# Create a subscription
Source: https://developers.dock.us/webhooks/create-subscription
Create a subscription to receive real-time notifications on events happening across your Dock workspace.
## Subscribing to events
To subscribe to events, you'll need to follow these steps:
You can subscribe to workspace lifecycle events (for example
`workspace.created`), course lifecycle events (`course.completed`,
`course.reviewed`), and presentation link events (`presentation.viewed`,
`presentation.downloaded`), as well as asset activity (`asset.viewed`,
`asset.shared`, `asset.downloaded`).
Click on **Create subscription** and choose a subscription type from the
dropdown list to create a subscription.
Once you've created a subscription, you'll be able to view the subscription
details on the **Subscriptions** page.
A subscription can be **viewed in detail**, **paused** or
**unsubscribed** from the **Webhook** page.
# Event types
Source: https://developers.dock.us/webhooks/event-types
Event types are the types of events that can be subscribed to.
Webhooks are a great way to get real-time notifications on events that happen in your Dock workspace. Webhooks on Dock follow the following format:
```json webhook-payload.json theme={null}
{
"id": "SI5UTJ7dqKoQ", // Event ID
"object": "webhook-event", // Event type
"webhookId": "MTmjIOBDZAI9", // Webhook ID
"subscriptionType": "workspace.viewed", // Subscription type
"subscriptionId": "LPovP9OvQoZi", // Subscription ID
"occurredAt": "2024-08-30T09:53:50.343Z", // Timestamp of when the event was created
"propertyName": null, // Name of the property that changed (if any)
"propertyPreviousValue": null, // The previous value of the property (if any)
"propertyValue": null,
"associatedObjects": {
// Associated objects
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
}
}
}
```
These are the types of events you can listen to:
* [**Workspace-level events**](#workspace-level-events)
* [**Asset events**](#asset-events)
* [**Course events**](#course-events)
* [**Presentation events**](#presentation-events)
File events (`workspace.file.downloaded`, `workspace.file.viewed`,
`workspace.file_widget.file.uploaded`, `workspace.plan.task.action.file.*`,
and `workspace.plan.task.file.uploaded`) include a `file` object in
`associatedObjects` with a short-lived presigned download `url`. The URL
expires at `expiresAt` (one hour); re-fetch the event or generate a new link
if it has expired.
## Workspace-level events
These events are triggered in the context of your entire workspace:
* [`Workspace created`](#workspace-created)
* [`Workspace viewed`](#workspace-viewed)
* [`Workspace plan task created`](#workspace-plan-task-created)
* [`Workspace plan task title changed`](#workspace-plan-task-title-changed)
* [`Workspace plan task description changed`](#workspace-plan-task-description-changed)
* [`Workspace plan task status changed`](#workspace-plan-task-status-changed)
* [`Workspace plan task completed`](#workspace-plan-task-completed)
* [`Workspace plan task uncompleted`](#workspace-plan-task-uncompleted)
* [`Workspace plan task deleted`](#workspace-plan-task-deleted)
* [`Workspace plan task due date changed`](#workspace-plan-task-due-date-changed)
* [`Workspace plan task comment created`](#workspace-plan-task-comment-created)
* [`Workspace plan task assignee added`](#workspace-plan-task-assignee-added)
* [`Workspace plan task assignee removed`](#workspace-plan-task-assignee-removed)
* [`Workspace plan task action link clicked`](#workspace-plan-task-action-link-clicked)
* [`Workspace plan task action file downloaded`](#workspace-plan-task-action-file-downloaded)
* [`Workspace plan task action file uploaded`](#workspace-plan-task-action-file-uploaded)
* [`Workspace plan task action pdf viewed`](#workspace-plan-task-action-pdf-viewed)
* [`Workspace plan task action video viewed`](#workspace-plan-task-action-video-viewed)
* [`Workspace plan task action form interacted`](#workspace-plan-task-action-form-interacted)
* [`Workspace plan task action calendar interacted`](#workspace-plan-task-action-calendar-interacted)
* [`Workspace plan task action embed interacted`](#workspace-plan-task-action-embed-interacted)
* [`Workspace plan task action custom code embed interacted`](#workspace-plan-task-action-custom-code-embed-interacted)
* [`Workspace plan task file uploaded`](#workspace-plan-task-file-uploaded)
* [`Workspace comment created`](#workspace-comment-created)
* [`Workspace comment edited`](#workspace-comment-edited)
* [`Workspace comment deleted`](#workspace-comment-deleted)
* [`Workspace embed interacted`](#workspace-embed-interacted)
* [`Workspace custom code interacted`](#workspace-custom-code-interacted)
* [`Workspace file downloaded`](#workspace-file-downloaded)
* [`Workspace file viewed`](#workspace-file-viewed)
* [`Workspace message created`](#workspace-message-created)
* [`Workspace message commented`](#workspace-message-commented)
* [`Workspace security profile document downloaded`](#workspace-security-profile-document-downloaded)
* [`Workspace security profile document viewed`](#workspace-security-profile-document-viewed)
* [`Workspace security profile document link clicked`](#workspace-security-profile-document-link-clicked)
* [`Workspace order form signed`](#workspace-order-form-signed)
* [`Workspace order form fully signed`](#workspace-order-form-fully-signed)
* [`Workspace order form viewed`](#workspace-order-form-viewed)
* [`Workspace order form downloaded`](#workspace-order-form-downloaded)
* [`Workspace NDA signed`](#workspace-NDA-signed)
* [`Workspace link clicked`](#workspace-link-clicked)
* [`Workspace text link clicked`](#workspace-text-link-clicked)
* [`Workspace page viewed`](#workspace-page-viewed)
* [`Workspace section navigation clicked`](#workspace-section-navigation-clicked)
* [`Workspace file widget file uploaded`](#workspace-file-widget-file-uploaded)
* [`Workspace form submitted`](#workspace-form-submitted)
### Workspace created
This event is triggered when a workspace is created.
Here’s an example payload:
```json workspace.created theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.created",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": null,
"propertyPreviousValue": null,
"propertyValue": null,
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
}
}
}
```
### Workspace viewed
This event is triggered when a workspace is viewed.
Here’s an example payload:
```json workspace.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.viewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": null,
"propertyPreviousValue": null,
"propertyValue": null,
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
}
},
}
```
### Workspace plan task created
This event is triggered when a workspace plan task is created.
Here’s an example payload:
```json workspace.plan.task.created theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.created",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
},
}
```
### Workspace plan task title changed
This event is triggered when a workspace plan task title is changed.
Here’s an example payload:
```json workspace.plan.task.title.changed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.title.changed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "title",
"propertyPreviousValue": "Old title",
"propertyValue": "New title",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task description changed
This event is triggered when a workspace plan task description is changed.
Here’s an example payload:
```json workspace.plan.task.description.changed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.description.changed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "description",
"propertyPreviousValue": "Old description",
"propertyValue": "New description",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
},
}
```
### Workspace plan task status changed
This event is triggered when a workspace plan task status is changed.
Here’s an example payload:
```json workspace.plan.task.status.changed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.status.changed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "status",
"propertyPreviousValue": "To do",
"propertyValue": "In progress",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
},
}
```
### Workspace plan task completed
This event is triggered when a workspace plan task is completed.
Here’s an example payload:
```json workspace.plan.task.completed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.completed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": null,
"propertyPreviousValue": null,
"propertyValue": null,
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
},
}
```
### Workspace plan task uncompleted
This event is triggered when a workspace plan task is uncompleted.
Here’s an example payload:
```json workspace.plan.task.uncompleted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.uncompleted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": null,
"propertyPreviousValue": null,
"propertyValue": null,
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task deleted
This event is triggered when a workspace plan task is deleted.
Here’s an example payload:
```json workspace.plan.task.deleted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.deleted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": null,
"propertyPreviousValue": null,
"propertyValue": null,
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task due date changed
This event is triggered when a workspace plan task due date is changed.
Here’s an example payload:
```json workspace.plan.task.due_date.changed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.due_date.changed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "dueDate",
"propertyPreviousValue": "2025-01-27",
"propertyValue": "2025-01-28",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task comment created
This event is triggered when a workspace plan task comment is created.
Here’s an example payload:
```json workspace.plan.task.comment.created theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.comment.created",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "comment",
"propertyPreviousValue": null,
"propertyValue": "This is a comment",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task assignee added
This event is triggered when a workspace plan task assignee is added.
Here’s an example payload:
```json workspace.plan.task.assignee.added theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.assignee.added",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "John Doe",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task assignee removed
This event is triggered when a workspace plan task assignee is removed.
Here’s an example payload:
```json workspace.plan.task.assignee.removed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.assignee.removed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": "John Doe",
"propertyValue": null,
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task action link clicked
This event is triggered when a workspace plan task action link is clicked.
Here’s an example payload:
```json workspace.plan.task.action.link.clicked theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.link.clicked",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "url",
"propertyPreviousValue": null,
"propertyValue": "https://dock.us",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task action file downloaded
This event is triggered when a workspace plan task action file is downloaded.
Here’s an example payload:
```json workspace.plan.task.action.file.downloaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.file.downloaded",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "file.pdf",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task action file uploaded
This event is triggered when a file is uploaded to a workspace plan task action.
Here’s an example payload:
```json workspace.plan.task.action.file.uploaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.file.uploaded",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "file.pdf",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"file": {
"id": "fL4mN6oP8qRs",
"object": "file",
"name": "proposal.pdf",
"url": "https://storage.googleapis.com/dock-production-private/...signed...",
"expiresAt": "2025-01-28T21:54:43.412Z"
}
}
}
```
### Workspace plan task action pdf viewed
This event is triggered when a PDF in a workspace plan task action is viewed.
Here’s an example payload:
```json workspace.plan.task.action.pdf.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.pdf.viewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task action video viewed
This event is triggered when a video in a workspace plan task action is viewed.
Here’s an example payload:
```json workspace.plan.task.action.video.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.video.viewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task action form interacted
This event is triggered when a form in a workspace plan task action is interacted
with.
Here’s an example payload:
```json workspace.plan.task.action.form.interacted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.form.interacted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task action calendar interacted
This event is triggered when a calendar in a workspace plan task action is
interacted with.
Here’s an example payload:
```json workspace.plan.task.action.calendar.interacted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.calendar.interacted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task action embed interacted
This event is triggered when an embed in a workspace plan task action is
interacted with.
Here’s an example payload:
```json workspace.plan.task.action.embed.interacted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.embed.interacted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task action custom code embed interacted
This event is triggered when a custom code embed in a workspace plan task action
is interacted with.
Here’s an example payload:
```json workspace.plan.task.action.custom_code_embed.interacted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.action.custom_code_embed.interacted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"templatePlanStepId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
}
}
}
```
### Workspace plan task file uploaded
This event is triggered when a file is uploaded via the file manager inside a
plan/task description. The payload includes a `file` object with a short-lived
presigned download URL.
```json workspace.plan.task.file.uploaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.plan.task.file.uploaded",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "proposal.pdf",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePlanTask": {
"id": "XycKxQP2Zfva",
"object": "workspace-plan-task",
"url": "https://api.dock.us/v1/workspace-plan-tasks/XycKxQP2Zfva",
"title": "Task title",
"templatePlanTaskId": "R6EfdsZwWuKc"
},
"workspacePlan": {
"id": "751gZMeRAScD",
"object": "workspace-plan",
"url": "https://api.dock.us/v1/workspace-plans/751gZMeRAScD",
"title": "Plan title"
},
"file": {
"id": "fL4mN6oP8qRs",
"object": "file",
"name": "proposal.pdf",
"url": "https://storage.googleapis.com/dock-production-private/...signed...",
"expiresAt": "2025-01-28T21:54:43.412Z"
}
}
}
```
### Workspace comment created
This event is triggered when a workspace comment is created.
Here’s an example payload:
```json workspace.comment.created theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.comment.created",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "comment",
"propertyPreviousValue": null,
"propertyValue": "This is a comment",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
}
}
}
```
### Workspace comment edited
This event is triggered when a workspace comment is edited.
Here’s an example payload:
```json workspace.comment.edited theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.comment.edited",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "comment",
"propertyPreviousValue": null,
"propertyValue": "This is a comment",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
}
}
}
```
### Workspace comment deleted
This event is triggered when a workspace comment is deleted.
Here’s an example payload:
```json workspace.comment.deleted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.comment.deleted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "comment",
"propertyPreviousValue": null,
"propertyValue": "This is a comment",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
}
}
}
```
### Workspace embed interacted
This event is triggered when a workspace embed is interacted with.
Here’s an example payload:
```json workspace.embed.interacted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.embed.interacted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "url",
"propertyPreviousValue": null,
"propertyValue": "https://dock.us",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace custom code interacted
This event is triggered when a workspace custom code is interacted with.
Here’s an example payload:
```json workspace.custom.code.interacted theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.custom_code.interacted",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "code",
"propertyPreviousValue": null,
"propertyValue": "console.log(\"Hello, world!\");",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace file downloaded
This event is triggered when a workspace file is downloaded.
Here’s an example payload:
```json workspace.file.downloaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.file.downloaded",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "file.pdf",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace file viewed
This event is triggered when a workspace file is viewed.
Here’s an example payload:
```json workspace.file.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.file.viewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "file.pdf",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace message created
This event is triggered when a workspace message is created.
Here’s an example payload:
```json workspace.message.created theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.message.created",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "messageBody",
"propertyPreviousValue": null,
"propertyValue": "This is a message",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
}
}
}
```
### Workspace message commented
This event is triggered when a workspace message is commented on.
Here’s an example payload:
```json workspace.message.comment.created theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.message.comment.created",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "comment",
"propertyPreviousValue": null,
"propertyValue": "This is a comment",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
}
}
}
```
### Workspace security profile document downloaded
This event is triggered when a workspace security profile document is downloaded.
Here’s an example payload:
```json workspace.security_profile_document.downloaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.security_profile_document.downloaded",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "file.pdf",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace security profile document viewed
This event is triggered when a workspace security profile document is viewed.
Here’s an example payload:
```json workspace.security_profile_document.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.security_profile_document.viewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "file.pdf",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
},
}
```
### Workspace security profile document link clicked
This event is triggered when a workspace security profile document link is clicked.
Here’s an example payload:
```json workspace.security_profile_document.link.clicked theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.security_profile_document.link.clicked",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "url",
"propertyPreviousValue": null,
"propertyValue": "https://dock.us",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace order form signed
This event is triggered when a workspace order form is signed.
Here’s an example payload:
```json workspace.order_form.signed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.order_form.signed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "title",
"propertyPreviousValue": null,
"propertyValue": "Order form",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace order form fully signed
This event is triggered when a workspace order form is fully signed.
Here’s an example payload:
```json workspace.order_form.fully_signed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.order_form.fully_signed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "title",
"propertyPreviousValue": null,
"propertyValue": "Order form",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace order form viewed
This event is triggered when a workspace order form is viewed.
Here’s an example payload:
```json workspace.order_form.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.order_form.viewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "title",
"propertyPreviousValue": null,
"propertyValue": "Order form",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace order form downloaded
This event is triggered when a workspace order form is downloaded.
Here’s an example payload:
```json workspace.order_form.downloaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.order_form.downloaded",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "title",
"propertyPreviousValue": null,
"propertyValue": "Order form",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace NDA signed
This event is triggered when a workspace NDA is signed.
Here’s an example payload:
```json workspace.nda.signed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.nda.signed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "Workspace NDA",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace link clicked
```json workspace.link.clicked theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.link.clicked",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "url",
"propertyPreviousValue": null,
"propertyValue": "https://dock.us",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace text link clicked
This event is triggered when a workspace text link is clicked.
Here’s an example payload:
```json workspace.text_link.clicked theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.text_link.clicked",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "url",
"propertyPreviousValue": null,
"propertyValue": "https://dock.us",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace page viewed
This event is triggered when a workspace page is viewed.
Here’s an example payload:
```json workspace.page.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.page.viewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": null,
"propertyPreviousValue": null,
"propertyValue": null,
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace section navigation clicked
This event is triggered when a workspace section navigation is clicked.
Here’s an example payload:
```json workspace.section_navigation.clicked theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.section_navigation.clicked",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "Section 1",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace file widget file uploaded
This event is triggered when a file is uploaded from a file widget.
Here’s an example payload:
```json workspace.file_widget.file.uploaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "workspace.file_widget.file.uploaded",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "name",
"propertyPreviousValue": null,
"propertyValue": "file.pdf",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"workspaceSection": {
"id": "mITE6OX6b8vd",
"object": "workspace-section",
"url": "https://api.dock.us/v1/workspace-sections/mITE6OX6b8vd",
"templateSectionId": "ZZnXcAAYZxL5"
},
"workspacePage": {
"id": "ShCzALeE7ZRj",
"object": "workspace-page",
"url": "https://api.dock.us/v1/workspace-pages/ShCzALeE7ZRj",
"templatePageId": "f6lAhd09H9au"
}
}
}
```
### Workspace form submitted
This event is triggered when a workspace form is submitted.
For `file_upload` questions, each `formQuestionResponses` item can include an optional `files` array with temporary download links.
`files[].url` is a presigned URL and may be `null` if link generation fails; links expire at `files[].expiresAt`.
Here’s an example payload:
```json workspace.form.submitted theme={null}
{
"id": "E2Q4LtRLrFqK",
"object": "webhook-event",
"webhookId": "2KpNX8mSPGNz",
"subscriptionType": "workspace.form.submitted",
"subscriptionId": "aq74qC2rzADt",
"occurredAt": "2025-05-06T17:25:38.930Z",
"propertyName": null,
"propertyPreviousValue": null,
"propertyValue": null,
"associatedObjects": {
"workspace": {
"id": "b6lnIUNYBkPL",
"object": "workspace",
"url": "https://api.dock.us/workspaces/b6lnIUNYBkPL",
"name": "Test webhook form"
},
"account": {
"id": "o069gCV0WkQe",
"object": "account",
"url": "https://api.dock.us/accounts/o069gCV0WkQe",
"hubspotCompanyId": "18639617835"
},
"user": {
"id": "tzmDEEZy1bvq",
"object": "user",
"url": "https://api.dock.us/users/tzmDEEZy1bvq",
"email": "test@dock.us"
},
"workspacePage": {
"id": "3TGNkB8Gopo3",
"object": "workspace-page",
"url": "https://api.dock.us/workspace-pages/3TGNkB8Gopo3",
"name": "Test webhook form"
},
"workspaceSection": {
"id": "lVwwuS0noQQv",
"object": "workspace-section",
"url": "https://api.dock.us/workspace-sections/lVwwuS0noQQv",
"name": null
},
"workspaceForm": {
"id": "9NdExtsz05Fi",
"formId": "vaQprFfsdF71",
"object": "workspace-form",
"title": "Test survey form "
},
"formQuestions": [
{
"id": "pN8QbxezAlja",
"object": "form-question",
"title": "What are the areas of your interest?",
"type": "checkbox"
},
{
"id": "ijhXFq3GCZDJ",
"object": "form-question",
"title": "Choose any one framework?",
"type": "dropdown"
},
{
"id": "EXC2Hni0vbsm",
"object": "form-question",
"title": "Fileupload Question Title",
"type": "file_upload"
},
{
"id": "TVuJd4msyAp0",
"object": "form-question",
"title": "Explain what the product does?",
"type": "paragraph"
},
{
"id": "T0aLHfaCkZFR",
"object": "form-question",
"title": "Office Address?",
"type": "single_line"
},
{
"id": "kku1qvevzwx4",
"object": "form-question",
"title": "Website for the product",
"type": "url"
},
{
"id": "0gMsa9Uw0Nff",
"object": "form-question",
"title": "Focus area of the product?",
"type": "checkbox"
}
],
"formQuestionResponses": [
{
"id": "MYpTNXp1jL7I",
"object": "form-question-response",
"formQuestionId": "pN8QbxezAlja",
"value": [
"SaaS",
"AI/ML",
"Other answer"
]
},
{
"id": "UiU2o7z4xHQr",
"object": "form-question-response",
"formQuestionId": "ijhXFq3GCZDJ",
"value": [
"Laravel"
]
},
{
"id": "nVP1ce5LJI1H",
"object": "form-question-response",
"formQuestionId": "EXC2Hni0vbsm",
"value": [
"akasa.jpg"
],
"files": [
{
"id": "3EoaD0z8Y3dN",
"object": "file",
"name": "akasa.jpg",
"url": "https://storage.googleapis.com/example/signed-url",
"expiresAt": "2025-05-06T18:25:38.930Z"
}
]
},
{
"id": "a9Pzhsyy2kKS",
"object": "form-question-response",
"formQuestionId": "TVuJd4msyAp0",
"value": "Organizes all customer-shared content in one workspace.\nCreate sales rooms, onboarding plans, & client portals that delight customers.\nWith a little help from AI to write business cases, project plans, and more."
},
{
"id": "hJHAE1PNCGJR",
"object": "form-question-response",
"formQuestionId": "T0aLHfaCkZFR",
"value": "4, 14, Kamal Park Society, B/h Geb Office, Race Course"
},
{
"id": "krVO6hdL9cZe",
"object": "form-question-response",
"formQuestionId": "kku1qvevzwx4",
"value": "https://acme.com"
},
{
"id": "ObwEWzdGzQGC",
"object": "form-question-response",
"formQuestionId": "0gMsa9Uw0Nff",
"value": [
"Fintech",
"Saas"
]
}
]
}
}
```
### Workspace form question submitted
This event is triggered when a workspace form is submitted.
When the submitted question is a `file_upload`, `associatedObjects.formQuestionResponse` can also include the optional `files` array described above.
Here’s an example payload:
```json workspace.form.question.submitted theme={null}
{
"id": "E2Q4LtRLrFqK",
"object": "webhook-event",
"webhookId": "2KpNX8mSPGNz",
"subscriptionType": "workspace.form.question.submitted",
"subscriptionId": "aq74qC2rzADt",
"occurredAt": "2025-05-06T17:25:38.930Z",
"propertyName": "value",
"propertyPreviousValue": null,
"propertyValue": "SaaS, AI/ML, Other answer",
"associatedObjects": {
"workspace": {
"id": "b6lnIUNYBkPL",
"object": "workspace",
"url": "https://api.dock.us/workspaces/b6lnIUNYBkPL",
"name": "Test webhook form"
},
"account": {
"id": "o069gCV0WkQe",
"object": "account",
"url": "https://api.dock.us/accounts/o069gCV0WkQe",
"hubspotCompanyId": "18639617835"
},
"user": {
"id": "tzmDEEZy1bvq",
"object": "user",
"url": "https://api.dock.us/users/tzmDEEZy1bvq",
"email": "test@dock.us"
},
"workspacePage": {
"id": "3TGNkB8Gopo3",
"object": "workspace-page",
"url": "https://api.dock.us/workspace-pages/3TGNkB8Gopo3",
"name": "Test webhook form"
},
"workspaceSection": {
"id": "lVwwuS0noQQv",
"object": "workspace-section",
"url": "https://api.dock.us/workspace-sections/lVwwuS0noQQv",
"name": null
},
"workspaceForm": {
"id": "9NdExtsz05Fi",
"formId": "vaQprFfsdF71",
"object": "workspace-form",
"title": "Test survey form "
},
"formQuestion": {
"id": "pN8QbxezAlja",
"object": "form-question",
"title": "What are the areas of your interest?",
"type": "checkbox"
},
"formQuestionResponse": {
"id": "MYpTNXp1jL7I",
"object": "form-question-response",
"formQuestionId": "pN8QbxezAlja",
"value": "SaaS, AI/ML, Other answer"
}
}
}
```
## Asset events
Asset events are emitted when a library asset is viewed, shared, or downloaded.
Every event includes an `asset` snapshot with its name, type, internal library
URL, internal-use flag, tags, description, and download setting.
When an `AssetLink` is involved, `shareUrl` identifies that exact link and
`trackingEnabled` indicates whether it is gated. Actions performed in a
workspace also include `workspace` and `account`; outside-workspace actions
omit them. Anonymous activity omits `user`.
### Asset viewed
Triggered when someone views an asset through an asset link.
```json asset.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "asset.viewed",
"occurredAt": "2026-07-27T09:30:00.000Z",
"associatedObjects": {
"asset": {
"id": "aSs3t5uVwXyZ",
"object": "asset",
"name": "Security Guide",
"type": "pdf",
"url": "https://acme.dock.us/library/asset/aSs3t5uVwXyZ",
"shareUrl": "https://acme.dock.us/asset/security-guide-aSLink1",
"isInternal": false,
"tags": [{ "id": "cOlL3ct10nId", "title": "Security" }],
"description": "Customer-facing security overview",
"downloadEnabled": true,
"trackingEnabled": true
}
}
}
```
### Asset shared
Triggered when an asset share link is created or an asset is shared into a
workspace.
```json asset.shared theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "asset.shared",
"occurredAt": "2026-07-27T09:35:00.000Z",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"name": "Acme Security Review"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N",
"name": "Acme"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"asset": {
"id": "aSs3t5uVwXyZ",
"object": "asset",
"name": "Security Guide",
"type": "pdf",
"url": "https://acme.dock.us/library/asset/aSs3t5uVwXyZ",
"shareUrl": "https://acme.dock.us/asset/security-guide-aSLink2",
"isInternal": false,
"tags": [{ "id": "cOlL3ct10nId", "title": "Security" }],
"description": "Customer-facing security overview",
"downloadEnabled": true,
"trackingEnabled": false
}
}
}
```
### Asset downloaded
Triggered when someone downloads a downloadable asset through an asset link.
Its payload uses the same `asset` shape as `asset.viewed`; workspace, account,
and user context are included when available.
```json asset.downloaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "asset.downloaded",
"occurredAt": "2026-07-27T09:40:00.000Z",
"associatedObjects": {
"asset": {
"id": "aSs3t5uVwXyZ",
"object": "asset",
"name": "Security Guide",
"type": "pdf",
"url": "https://acme.dock.us/library/asset/aSs3t5uVwXyZ",
"shareUrl": "https://acme.dock.us/asset/security-guide-aSLink1",
"isInternal": false,
"tags": [{ "id": "cOlL3ct10nId", "title": "Security" }],
"description": "Customer-facing security overview",
"downloadEnabled": true,
"trackingEnabled": true
}
}
}
```
## Course events
These events are triggered when a learner completes coursework in a workspace-linked course.
### Course completed
This event is triggered when a learner reaches the course completion state.
```json course.completed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "course.completed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "status",
"propertyPreviousValue": "inProgress",
"propertyValue": "completed",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com",
"name": "John Doe",
"firstName": "John",
"lastName": "Doe"
},
"learner": {
"id": "bN0pQ2rT5uVw",
"object": "learner",
"url": "https://api.dock.us/v1/users/bN0pQ2rT5uVw",
"email": "learner@example.com",
"name": "Jordan Lee",
"firstName": "Jordan",
"lastName": "Lee"
},
"reviewer": {
"id": "cQ1rS3tUvWx",
"object": "reviewer",
"url": "https://api.dock.us/v1/users/cQ1rS3tUvWx",
"email": "reviewer@example.com",
"name": "Sam Rivera",
"firstName": "Sam",
"lastName": "Rivera"
},
"course": {
"id": "dR2sT4uVwXy",
"object": "course",
"url": "https://api.dock.us/v1/courses/dR2sT4uVwXy",
"name": "Security Onboarding"
},
"assignment": {
"id": "eS3tU5vWxYz",
"object": "assignment",
"url": "https://api.dock.us/v1/course-assignments/eS3tU5vWxYz",
"status": "completed",
"dueDate": "2026-07-01T00:00:00.000Z",
"completedAt": "2026-06-26T00:00:00.000Z",
"scoreObtained": 9,
"totalScore": 10
}
}
}
```
### Course reviewed
This event is triggered when a reviewer finalizes the course review state.
```json course.reviewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "course.reviewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "status",
"propertyPreviousValue": "readyForReview",
"propertyValue": "completed",
"associatedObjects": {
"workspace": {
"id": "BfkPI6fgyXQI",
"object": "workspace",
"url": "https://api.dock.us/v1/workspaces/BfkPI6fgyXQI",
"templateId": "NNV2AWnp6AxY"
},
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "reviewer@example.com",
"name": "Sam Rivera",
"firstName": "Sam",
"lastName": "Rivera"
},
"learner": {
"id": "bN0pQ2rT5uVw",
"object": "learner",
"url": "https://api.dock.us/v1/users/bN0pQ2rT5uVw",
"email": "learner@example.com",
"name": "Jordan Lee",
"firstName": "Jordan",
"lastName": "Lee"
},
"reviewer": {
"id": "cQ1rS3tUvWx",
"object": "reviewer",
"url": "https://api.dock.us/v1/users/cQ1rS3tUvWx",
"email": "reviewer@example.com",
"name": "Sam Rivera",
"firstName": "Sam",
"lastName": "Rivera"
},
"course": {
"id": "dR2sT4uVwXy",
"object": "course",
"url": "https://api.dock.us/v1/courses/dR2sT4uVwXy",
"name": "Security Onboarding"
},
"assignment": {
"id": "eS3tU5vWxYz",
"object": "assignment",
"url": "https://api.dock.us/v1/course-assignments/eS3tU5vWxYz",
"status": "completed",
"dueDate": "2026-07-01T00:00:00.000Z",
"completedAt": "2026-06-26T00:00:00.000Z",
"scoreObtained": 9,
"totalScore": 10
}
}
}
```
## Presentation events
These events are triggered for presentation share-link activity only. Internal workspace presentation views/downloads are not emitted as these webhook event types.
### Presentation viewed
This event is triggered when a presentation is viewed through a share link.
```json presentation.viewed theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "presentation.viewed",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"presentation": {
"id": "pRe5enT8tioN",
"object": "presentation",
"name": "Q3 Pitch Deck"
},
"owners": [
{
"id": "gT5uH7iJ9kLm",
"object": "owner",
"url": "https://api.dock.us/v1/users/gT5uH7iJ9kLm",
"email": "owner@example.com",
"name": "Alex Kim",
"firstName": "Alex",
"lastName": "Kim"
}
]
}
}
```
The top-level `propertyName` / `propertyValue` / `propertyPreviousValue`
fields are only present when an event represents a property change. Events
with no property change (e.g. `presentation.viewed`, `presentation.shared`)
omit them. `account` is included only when an account is linked to the
presentation; `owners` only when the presentation has owners.
### Presentation downloaded
This event is triggered when a presentation file is downloaded through a share link.
```json presentation.downloaded theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "presentation.downloaded",
"occurredAt": "2025-01-28T20:54:43.412Z",
"propertyName": "fileType",
"propertyPreviousValue": null,
"propertyValue": "pdf",
"associatedObjects": {
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"presentation": {
"id": "pRe5enT8tioN",
"object": "presentation",
"name": "Q3 Pitch Deck"
}
}
}
```
### Presentation shared
This event is triggered when a presentation share link is created — for both
tracking and non-tracking links. Whether the link is a tracking (gated) link is
exposed as `isTracking` on the `presentation` associated object.
```json presentation.shared theme={null}
{
"id": "SI5UTJ7dqKoQ",
"object": "webhook-event",
"webhookId": "MTmjIOBDZAI9",
"subscriptionId": "LPovP9OvQoZi",
"subscriptionType": "presentation.shared",
"occurredAt": "2025-01-28T20:54:43.412Z",
"associatedObjects": {
"account": {
"id": "uUsnaBrnTV6N",
"object": "account",
"url": "https://api.dock.us/v1/accounts/uUsnaBrnTV6N"
},
"user": {
"id": "6bxK1Cyh88EK",
"object": "user",
"url": "https://api.dock.us/v1/users/6bxK1Cyh88EK",
"email": "john.doe@example.com"
},
"presentation": {
"id": "pRe5enT8tioN",
"object": "presentation",
"name": "Q3 Pitch Deck",
"isTracking": true
},
"owners": [
{
"id": "gT5uH7iJ9kLm",
"object": "owner",
"url": "https://api.dock.us/v1/users/gT5uH7iJ9kLm",
"email": "owner@example.com",
"name": "Alex Kim",
"firstName": "Alex",
"lastName": "Kim"
}
]
}
}
```
# Introduction
Source: https://developers.dock.us/webhooks/introduction
Use webhooks to get real-time notifications on events happening across your Dock workspace.
Webhooks allows you to listen to real-time events happening across your Dock workspace. With webhooks, you can build custom integrations with Dock, such as:
* Sending click events in real-time for further processing
* Triggering a Slack notification when someone clicks on your pitch deck link
* Triggering downstream automations when a workspace is created
* Syncing learner lifecycle updates from `course.completed` and `course.reviewed`
* Tracking library asset views, shares, and downloads
`presentation.viewed` and `presentation.downloaded` are emitted for
presentation share-link activity only. Asset link activity is available
through `asset.viewed`, `asset.shared`, and `asset.downloaded`.
In this guide, we'll show you how to configure webhooks for your Dock workspace and a list of available events you can listen to.
## Creating a webhook
You must be an account `admin` to create a webhook.
To create a webhook for your Dock workspace, you'll need to follow these steps:
Go to **Settings** and click on **Webhooks** from the **Data Management**
section in the side navigation.
Click on **Create Webhook** button and enter a name to create a webhook in
your application. Once created, it will appear in the list on the page.
Enter the webhook target URL and click on **Save** to verify the webhook
target URL.
The webhook target URL must accept a POST request for verification and
event delivery.
You can click on the **View Key** button to see the secret key. You can use
this secret key to verify incoming webhook event from Dock incase you have a
custom implementation to consume webhook events.
# Retry behaviour
Source: https://developers.dock.us/webhooks/retry-behaviour
Retry behaviour for webhooks.
## Retry Behaviour
If your webhook endpoint does not respond with a success status code (2XX), we retry the request to ensure every message will be delivered. You can see all the retry attempts in your webhook event logs.
Webhooks are retried until they are successfully delivered – with an exponential backoff to avoid overwhelming your webhook endpoint (also known as the "[thundering herd problem](https://en.wikipedia.org/wiki/Thundering_herd_problem)"). The delay is capped at 5th retry attempt.
| Retry attempt | Delay |
| ------------- | ----- |
| 1st | 0s |
| 2nd | 2s |
| 3rd | 4s |
| 4th | 8s |
| 5th | 16s |
# Send test events
Source: https://developers.dock.us/webhooks/test-event
Send test events to your webhook URL to ensure that it's working correctly.
## Sending test events
You can send test events to your webhook URL to ensure that it's working correctly. To do this:
Use this flow to validate sample payloads for `workspace.created`,
`course.completed`, `course.reviewed`, `presentation.viewed`, and
`presentation.downloaded`, plus `asset.viewed`, `asset.shared`, and
`asset.downloaded` subscriptions before going live.
Click on the **Details** button to view the subcription's sample payload and
details.
Scroll down, enter the Test URL in the input and click on **Test** button to
send the event and view the response.
# Verify webhook requests
Source: https://developers.dock.us/webhooks/verify-webhook-requests
Learn how to verify webhook requests to ensure they're coming from Dock.
With signature verification, you can determine if the webhook came from Dock, and has not been tampered with in transit.
All webhooks are delivered with a `X-Dock-Signature` and `X-Timestamp` header. Dock generates this header using a secret key that only you and Dock know.
An example header looks like this:
```
X-Dock-Signature: c9ed6a2abf93f59d761eea69908d8de00f4437b5b6d7cd8b9bf5719cbe61bf46
X-Timestamp: 1716998400
```
## Finding your webhook's signing secret
You can find your webhook's signing secret in the **Webhook** page by clicking on the **View Secret Key** button:
Make sure to keep this secret safe by only storing it in a secure environment variable (e.g. `DOCK_WEBHOOK_SECRET`). Do not commit it to git or add it in any client-side code.
## Verifying a webhook request
To verify, you can use the secret key to generate your own signature for webhook. If both signatures match then you can be sure that a received event came from Dock.
The steps required are:
1. Get the raw body of the request.
2. Extract the signature from the `X-Dock-Signature` header.
3. Calculate the HMAC of the `Request Method + Target Url + Raw Body` using the `SHA-256` hash function and the secret.
4. Compare the calculated `HMAC` with the one sent in the `X-Dock-Signature` header. If they match, the webhook is verified.
Here's an example of how you can verify a webhook request in different languages:
```javascript Node.js theme={null}
export const POST = async (req: Request,res: Response) => {
const webhookSignature = req.headers.get("X-Dock-Signature");
if (!webhookSignature) {
return res.status(401).send("No signature provided.");
}
// Copy this from the webhook details page
const secret = process.env.DOCK_WEBHOOK_SECRET;
if (!secret) {
return res.status(401).send("No secret provided.");
}
// Make sure to get the body from the request
const url = `https://${req.header('host')}${req.path}`;
const body = JSON.stringify(req.body);
const payload = `${req.method}\n${url}\n${body}`;
const computedSignature = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex");
if (crypto.timingSafeEqual(
Buffer.from(webhookSignature, 'hex'),
Buffer.from(computedSignature, 'hex'),
)) {
return res.status(400).send("Invalid signature");
}
// Handle the webhook event
// ...
};
```
```python Python theme={null}
import hmac
import hashlib
import os
from flask import Flask, request, Response
app = Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook_handler():
webhook_signature = request.headers.get("X-Dock-Signature")
if not webhook_signature:
return Response("No signature provided.", status=401)
secret = os.getenv("DOCK_WEBHOOK_SECRET")
if not secret:
return Response("No secret provided.", status=401)
body = request.get_data(as_text=True)
url = f"{request.host}{request.path}"
payload = f"{request.method}\n{url}\n{body}"
computed_signature = hmac.new(
secret.encode('utf-8'),
payload.encode('utf-8'),
hashlib.sha256
).hexdigest()
if not hmac.compare_digest(webhook_signature, computed_signature):
return Response("Invalid signature.", status=400)
## Handle the webhook event
## ...
```
```go Golang theme={null}
package main
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"io"
"net/http"
"os"
)
func webhookHandler(w http.ResponseWriter, r *http.Request) {
webhookSignature := r.Header.Get("X-Dock-Signature")
if webhookSignature == "" {
http.Error(w, "No signature provided.", http.StatusUnauthorized)
return
}
secret := os.Getenv("DOCK_WEBHOOK_SECRET")
if secret == "" {
http.Error(w, "No secret provided.", http.StatusUnauthorized)
return
}
bodyBytes, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "Unable to read request body.", http.StatusInternalServerError)
return
}
// Reconstruct the payload
url := r.Host + r.URL.Path
payload := r.Method + "\n" + url + "\n" + string(bodyBytes)
h := hmac.New(sha256.New, []byte(secret))
h.Write([]byte(payload))
computedSignature := hex.EncodeToString(h.Sum(nil))
if !hmac.Equal([]byte(webhookSignature), []byte(computedSignature)) {
http.Error(w, "Invalid signature.", http.StatusBadRequest)
return
}
// Handle the webhook event
//...
}
```
## Why is signature verification important?
Signature verification is a crucial security measure that protects against request forgery and data tampering. Without verification, malicious actors could send fake webhook events to your endpoint, potentially triggering unauthorized actions.
The HMAC-SHA256 signature verification process ensures that only Dock can generate valid webhook requests and that payloads haven't been modified in transit. This provides both authentication (confirming the sender is Dock) and integrity (ensuring the message hasn't been tampered with).