Download OpenAPI specification:Download
Public REST API for Clio's platform-level (API Hub) services.
These are global, product-independent endpoints — currently the multi-product
webhooks platform. Authenticate with an OAuth 2.0 bearer token
(Authorization: Bearer <jwt>) issued through the Clio API Hub.
Pass the OpenAPI version with X-API-Version: YYYY-MM-DD to pin a specific
contract, or unstable to opt in to the latest spec.
Platform-level operations require a valid token and no scope of their own.
Resource scopes (e.g. grow_lead_inbox_read) gate which event types a
subscription may include, and are not declared below — they belong to the
products that own those events.
Successful responses use { "data": ... } envelopes (with { "meta": { "paging": ... } }
on paginated collections; meta is omitted when there is only one page). Errors use
{ "error": "<code>" }, sometimes with an additional details list of strings
carrying context for that code.
Operations for managing webhook subscriptions on the authenticated entity, and for reading the deliveries recorded against them
Returns a cursor-paginated list of the calling application's webhook subscriptions for the authorized entity. signing_secret is never included. meta is omitted entirely when there is neither a next nor a previous page.
| page_token | string Opaque token for cursor-based pagination. Follow the links in |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "data": [
- {
- "id": 123,
- "status": "pending",
- "status_reason": "consecutive_dead_deliveries",
- "status_changed_at": "2026-10-20T14:45:00Z",
- "schema_version": "2026-01-01",
- "authorized_entity_id": "9f1b7c04-58d2-4e3a-b6c1-2d0e8a7f3b45",
- "event_types": [
- "grow.inbox_lead.submitted"
], - "created_at": "2026-08-07T10:30:00Z",
- "updated_at": "2026-08-07T14:45:00Z"
}
], - "meta": {
- "paging": {
}
}
}Creates a webhook subscription for the authorized entity. The subscription starts as pending and must be activated before events are delivered. Every requested event type must be one the token already holds the resource scope for. The response is one of only two places signing_secret is returned.
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
| url | string <uri> <= 2048 characters Required. The HTTPS endpoint events are delivered to. Must not resolve to a loopback, private, or link-local address. |
| event_types | Array of strings Required, and must be non-empty. The events to subscribe to, each formatted as |
| schema_version | string <= 32 characters The event payload schema version to pin to, as a |
{- "event_types": [
- "grow.inbox_lead.submitted"
], - "schema_version": "2026-01-01"
}{- "data": {
- "id": 123,
- "status": "pending",
- "status_reason": "consecutive_dead_deliveries",
- "status_changed_at": "2026-10-20T14:45:00Z",
- "schema_version": "2026-01-01",
- "authorized_entity_id": "9f1b7c04-58d2-4e3a-b6c1-2d0e8a7f3b45",
- "event_types": [
- "grow.inbox_lead.submitted"
], - "created_at": "2026-08-07T10:30:00Z",
- "updated_at": "2026-08-07T14:45:00Z",
- "signing_secret": "3f1c9b0e5a7d24816cbe0f9a3d5721c48e6b0f2a9d4c17e35b8a06d29f4c1e73"
}
}Returns a single webhook subscription belonging to the calling application and the authorized entity. signing_secret is never included. A subscription owned by another application or entity returns 404, not 403.
| id required | integer <int64> Example: 123 Unique identifier of the webhook subscription |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "data": {
- "id": 123,
- "status": "pending",
- "status_reason": "consecutive_dead_deliveries",
- "status_changed_at": "2026-10-20T14:45:00Z",
- "schema_version": "2026-01-01",
- "authorized_entity_id": "9f1b7c04-58d2-4e3a-b6c1-2d0e8a7f3b45",
- "event_types": [
- "grow.inbox_lead.submitted"
], - "created_at": "2026-08-07T10:30:00Z",
- "updated_at": "2026-08-07T14:45:00Z"
}
}Updates a webhook subscription. event_types replaces the full set rather than appending to it; supplying an empty array disables an active subscription. Changing url returns the subscription to pending from any state, so it must be re-activated. status is not writable: a request body carrying it is rejected with a 422 validation_failed, since state moves through activate, enable and disable. signing_secret is preserved and is not returned.
| id required | integer <int64> Example: 123 Unique identifier of the webhook subscription |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
| url | string <uri> <= 2048 characters The HTTPS endpoint events are delivered to. Must not resolve to a loopback, private, or link-local address. |
| event_types | Array of strings The complete set of events to subscribe to, each formatted as |
| schema_version | string <= 32 characters The event payload schema version to pin to, as a |
{- "event_types": [
- "grow.inbox_lead.submitted"
], - "schema_version": "2026-01-01"
}{- "data": {
- "id": 123,
- "status": "pending",
- "status_reason": "consecutive_dead_deliveries",
- "status_changed_at": "2026-10-20T14:45:00Z",
- "schema_version": "2026-01-01",
- "authorized_entity_id": "9f1b7c04-58d2-4e3a-b6c1-2d0e8a7f3b45",
- "event_types": [
- "grow.inbox_lead.submitted"
], - "created_at": "2026-08-07T10:30:00Z",
- "updated_at": "2026-08-07T14:45:00Z"
}
}Permanently deletes the webhook subscription and stops all delivery to it. This action cannot be undone. To stop delivery reversibly, use POST /webhook_subscriptions/{id}/disable.
| id required | integer <int64> Example: 123 Unique identifier of the webhook subscription |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "error": "not_found",
- "details": [
- "string"
]
}Activates a pending or suspended subscription. Clio issues a challenge request to the subscription's URL, signed with its signing_secret; the endpoint must echo the challenge back correctly. On success the subscription moves to active. An already-active subscription is returned unchanged without a challenge. A subscription with no event_types is rejected, and a disabled one is rejected pointing at POST /webhook_subscriptions/{id}/enable. Neither issues a challenge. signing_secret is not returned.
| id required | integer <int64> Example: 123 Unique identifier of the webhook subscription |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "data": {
- "id": 123,
- "status": "pending",
- "status_reason": "consecutive_dead_deliveries",
- "status_changed_at": "2026-10-20T14:45:00Z",
- "schema_version": "2026-01-01",
- "authorized_entity_id": "9f1b7c04-58d2-4e3a-b6c1-2d0e8a7f3b45",
- "event_types": [
- "grow.inbox_lead.submitted"
], - "created_at": "2026-08-07T10:30:00Z",
- "updated_at": "2026-08-07T14:45:00Z"
}
}Stops delivery to an active subscription, reversibly, and moves it to disabled. Recover with POST /webhook_subscriptions/{id}/enable, which needs no challenge. An already-disabled subscription is returned unchanged. A pending or suspended subscription is rejected with a 422: neither is delivering, so there is nothing to disable.
| id required | integer <int64> Example: 123 Unique identifier of the webhook subscription |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "data": {
- "id": 123,
- "status": "pending",
- "status_reason": "consecutive_dead_deliveries",
- "status_changed_at": "2026-10-20T14:45:00Z",
- "schema_version": "2026-01-01",
- "authorized_entity_id": "9f1b7c04-58d2-4e3a-b6c1-2d0e8a7f3b45",
- "event_types": [
- "grow.inbox_lead.submitted"
], - "created_at": "2026-08-07T10:30:00Z",
- "updated_at": "2026-08-07T14:45:00Z"
}
}Resumes delivery for a disabled subscription, moving it to active with no challenge, because disabled is only reachable from a subscription that already answered one. An already-active subscription is returned unchanged. A pending or suspended subscription is rejected with a 422 pointing at POST /webhook_subscriptions/{id}/activate. A subscription with no event_types is rejected, so restore an event type first.
| id required | integer <int64> Example: 123 Unique identifier of the webhook subscription |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "data": {
- "id": 123,
- "status": "pending",
- "status_reason": "consecutive_dead_deliveries",
- "status_changed_at": "2026-10-20T14:45:00Z",
- "schema_version": "2026-01-01",
- "authorized_entity_id": "9f1b7c04-58d2-4e3a-b6c1-2d0e8a7f3b45",
- "event_types": [
- "grow.inbox_lead.submitted"
], - "created_at": "2026-08-07T10:30:00Z",
- "updated_at": "2026-08-07T14:45:00Z"
}
}Replaces the subscription's signing secret with a new one and returns it. The previous secret stops working immediately, and the subscription's status is unchanged. This is one of only two places signing_secret is returned — it is never readable afterwards, so store it on receipt.
| id required | integer <int64> Example: 123 Unique identifier of the webhook subscription |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "data": {
- "id": 123,
- "status": "pending",
- "status_reason": "consecutive_dead_deliveries",
- "status_changed_at": "2026-10-20T14:45:00Z",
- "schema_version": "2026-01-01",
- "authorized_entity_id": "9f1b7c04-58d2-4e3a-b6c1-2d0e8a7f3b45",
- "event_types": [
- "grow.inbox_lead.submitted"
], - "created_at": "2026-08-07T10:30:00Z",
- "updated_at": "2026-08-07T14:45:00Z",
- "signing_secret": "3f1c9b0e5a7d24816cbe0f9a3d5721c48e6b0f2a9d4c17e35b8a06d29f4c1e73"
}
}Returns a cursor-paginated list of this subscription's deliveries — what Clio recorded for it, and how delivery of each one went. Only delivery metadata is returned — never payload data, which is why this operation needs no resource scope.
Results are ordered by event_id rather than occurred_at, and are retained for 7 days after Clio records them. meta is omitted entirely when there is neither a next nor a previous page. A subscription owned by another application or authorized entity returns 404, not 403.
| webhook_subscription_id required | integer <int64> Example: 123 Unique identifier of the webhook subscription whose deliveries are listed |
| page_token | string Opaque token for cursor-based pagination. Follow the links in |
| event_type | string Example: event_type=grow.inbox_lead.submitted Return only deliveries whose event is of this type, formatted as |
| after | string Example: after=01ARZ3NDEKTSV4RRFFQ69G5FAV Return only deliveries whose |
| occurred_after | string Example: occurred_after=2026-08-07T10:30:00.000Z Inclusive lower bound on |
| occurred_before | string Example: occurred_before=2026-08-07T18:00:00.000Z Inclusive upper bound on |
| limit | string Example: limit=100 Maximum number of deliveries to return per page. Values above 100 are capped at 100 rather than rejected. A value that is not a positive integer is a 400 |
| status | string Example: status=failed Return only deliveries in this state: |
| order | string Example: order=desc The direction to walk |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "data": [
- {
- "id": "66b3f0c2e1a4d9c7b8a02f31",
- "event_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
- "event_type": "grow.inbox_lead.submitted",
- "schema_version": "2026-01-01",
- "occurred_at": "2026-08-07T10:30:00.000Z",
- "status": "succeeded",
- "next_retry_at": "2026-08-07T10:35:00.000Z",
- "attempts": [
- {
- "attempted_at": "2026-08-07T10:30:00.000Z",
- "http_status": 200,
- "outcome": "success"
}
]
}
], - "meta": {
- "paging": {
}
}
}Returns a single delivery, including every attempt Clio made to deliver it. Only delivery metadata is returned, never payload data.
| webhook_subscription_id required | integer <int64> Example: 123 Unique identifier of the webhook subscription whose deliveries are listed |
| id required | string Example: 66b3f0c2e1a4d9c7b8a02f31 Unique identifier of the delivery, as carried on the |
| X-API-Version | string Example: 2026-08-07 Pins the request to a specific OpenAPI contract. Pass a date in |
{- "data": {
- "id": "66b3f0c2e1a4d9c7b8a02f31",
- "event_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
- "event_type": "grow.inbox_lead.submitted",
- "schema_version": "2026-01-01",
- "occurred_at": "2026-08-07T10:30:00.000Z",
- "status": "succeeded",
- "next_retry_at": "2026-08-07T10:35:00.000Z",
- "attempts": [
- {
- "attempted_at": "2026-08-07T10:30:00.000Z",
- "http_status": 200,
- "outcome": "success"
}
]
}
}Events sent to your webhook subscriptions from Clio Grow. Each event is a POST with a JSON body.
These docs describe the latest version of each payload. Every event is delivered in your subscription's schema_version, and carries that schema_version. A new version does not change what you receive until you update your subscription.
Sent when a new lead arrives in a firm's inbox. Requires the grow_lead_inbox_read or grow_lead_inbox_all_read scope.
| X-Clio-Signature required | string Example: v1=9a103be2201ae758992733a91f02903f9a103be2201ae758992733a91f02903f Set by Clio on every webhook request. HMAC-SHA256 signature over the raw request
body, prefixed with the signature version. Keyed with the subscription's |
| X-Clio-Timestamp required | integer <int64> Example: 1761600000 Set by Clio on every webhook request. Unix timestamp the signature was generated at. It is covered by the signature, so it cannot be altered without invalidating it. Reject requests older than five minutes to limit replay: a captured request verifies indefinitely otherwise. Each delivery attempt is signed afresh, so retries carry a current timestamp. |
| X-Clio-Delivery-ID required | string Example: 6708f1c2a4b3c5d6e7f80912 Set by Clio on every webhook request, identifying it. On an event delivery this is the delivery's ID, and every
retry of that delivery reuses it. On an activation challenge it is a one-off value
prefixed with |
| X-Clio-Subscription-ID required | integer <int64> Example: 123 Set by Clio on every webhook request. The ID of the webhook subscription the request belongs to. |
| event_id required | string Unique ID for the event. A retried delivery sends the same ID, so use it to discard duplicates. |
| event_type required | string Value: "grow.inbox_lead.submitted" |
| schema_version required | string <date> The version of |
| occurred_at required | string <date-time> When the event happened in Clio Grow, in UTC. |
required | object |
{- "event_id": "01JA6Z3N8Q2V5W7X9Y1B3C5D7E",
- "event_type": "grow.inbox_lead.submitted",
- "schema_version": "2026-01-01",
- "occurred_at": "2026-01-15T17:04:12Z",
- "payload": {
- "id": 1234
}
}Sent when a firm accepts an inbox lead, creating a contact and, optionally, a matter. Requires the grow_lead_inbox_read or grow_lead_inbox_all_read scope.
| X-Clio-Signature required | string Example: v1=9a103be2201ae758992733a91f02903f9a103be2201ae758992733a91f02903f Set by Clio on every webhook request. HMAC-SHA256 signature over the raw request
body, prefixed with the signature version. Keyed with the subscription's |
| X-Clio-Timestamp required | integer <int64> Example: 1761600000 Set by Clio on every webhook request. Unix timestamp the signature was generated at. It is covered by the signature, so it cannot be altered without invalidating it. Reject requests older than five minutes to limit replay: a captured request verifies indefinitely otherwise. Each delivery attempt is signed afresh, so retries carry a current timestamp. |
| X-Clio-Delivery-ID required | string Example: 6708f1c2a4b3c5d6e7f80912 Set by Clio on every webhook request, identifying it. On an event delivery this is the delivery's ID, and every
retry of that delivery reuses it. On an activation challenge it is a one-off value
prefixed with |
| X-Clio-Subscription-ID required | integer <int64> Example: 123 Set by Clio on every webhook request. The ID of the webhook subscription the request belongs to. |
| event_id required | string Unique ID for the event. A retried delivery sends the same ID, so use it to discard duplicates. |
| event_type required | string Value: "grow.inbox_lead.accepted" |
| schema_version required | string <date> The version of |
| occurred_at required | string <date-time> When the event happened in Clio Grow, in UTC. |
required | object |
{- "event_id": "01JA6Z3N8Q2V5W7X9Y1B3C5D7E",
- "event_type": "grow.inbox_lead.accepted",
- "schema_version": "2026-01-01",
- "occurred_at": "2026-01-15T17:04:12Z",
- "payload": {
- "id": 1234,
- "contact_id": 5678,
- "matter_id": 9012
}
}Sent when a firm rejects an inbox lead. Requires the grow_lead_inbox_read or grow_lead_inbox_all_read scope.
| X-Clio-Signature required | string Example: v1=9a103be2201ae758992733a91f02903f9a103be2201ae758992733a91f02903f Set by Clio on every webhook request. HMAC-SHA256 signature over the raw request
body, prefixed with the signature version. Keyed with the subscription's |
| X-Clio-Timestamp required | integer <int64> Example: 1761600000 Set by Clio on every webhook request. Unix timestamp the signature was generated at. It is covered by the signature, so it cannot be altered without invalidating it. Reject requests older than five minutes to limit replay: a captured request verifies indefinitely otherwise. Each delivery attempt is signed afresh, so retries carry a current timestamp. |
| X-Clio-Delivery-ID required | string Example: 6708f1c2a4b3c5d6e7f80912 Set by Clio on every webhook request, identifying it. On an event delivery this is the delivery's ID, and every
retry of that delivery reuses it. On an activation challenge it is a one-off value
prefixed with |
| X-Clio-Subscription-ID required | integer <int64> Example: 123 Set by Clio on every webhook request. The ID of the webhook subscription the request belongs to. |
| event_id required | string Unique ID for the event. A retried delivery sends the same ID, so use it to discard duplicates. |
| event_type required | string Value: "grow.inbox_lead.rejected" |
| schema_version required | string <date> The version of |
| occurred_at required | string <date-time> When the event happened in Clio Grow, in UTC. |
required | object |
{- "event_id": "01JA6Z3N8Q2V5W7X9Y1B3C5D7E",
- "event_type": "grow.inbox_lead.rejected",
- "schema_version": "2026-01-01",
- "occurred_at": "2026-01-15T17:04:12Z",
- "payload": {
- "id": 1234,
- "reason": "spam"
}
}Sent when a firm accepts a Clio Grow matter, creating a matter in Clio Manage. Requires the grow_matter_read scope.
| X-Clio-Signature required | string Example: v1=9a103be2201ae758992733a91f02903f9a103be2201ae758992733a91f02903f Set by Clio on every webhook request. HMAC-SHA256 signature over the raw request
body, prefixed with the signature version. Keyed with the subscription's |
| X-Clio-Timestamp required | integer <int64> Example: 1761600000 Set by Clio on every webhook request. Unix timestamp the signature was generated at. It is covered by the signature, so it cannot be altered without invalidating it. Reject requests older than five minutes to limit replay: a captured request verifies indefinitely otherwise. Each delivery attempt is signed afresh, so retries carry a current timestamp. |
| X-Clio-Delivery-ID required | string Example: 6708f1c2a4b3c5d6e7f80912 Set by Clio on every webhook request, identifying it. On an event delivery this is the delivery's ID, and every
retry of that delivery reuses it. On an activation challenge it is a one-off value
prefixed with |
| X-Clio-Subscription-ID required | integer <int64> Example: 123 Set by Clio on every webhook request. The ID of the webhook subscription the request belongs to. |
| event_id required | string Unique ID for the event. A retried delivery sends the same ID, so use it to discard duplicates. |
| event_type required | string Value: "grow.matter.accepted" |
| schema_version required | string <date> The version of |
| occurred_at required | string <date-time> When the event happened in Clio Grow, in UTC. |
required | object |
{- "event_id": "01JA6Z3N8Q2V5W7X9Y1B3C5D7E",
- "event_type": "grow.matter.accepted",
- "schema_version": "2026-01-01",
- "occurred_at": "2026-01-15T17:04:12Z",
- "payload": {
- "id": 3456,
- "global_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV"
}
}