# Subscription Actions

### Subscription Actions

Actions define delivery mechanisms for subscription results. Each action specifies where and how signal outputs should be sent when the subscription triggers.

**Supported action types:**

* `webhook` — Deliver results to an HTTP endpoint

Multiple actions of the same type are allowed on a single subscription, up to a maximum of **10 actions** per subscription.

> **Note:** Subscription action webhooks are currently delivered without HMAC signatures. Do not rely on request signatures to authenticate incoming payloads from subscription actions.

## List all actions for a subscription

> Retrieve a paginated list of actions configured on a subscription.

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"tags":[{"name":"Subscription Actions","summary":"Subscription Actions","kind":"nav","description":"## Subscription Actions\n\nActions define delivery mechanisms for subscription results. Each action\nspecifies where and how signal outputs should be sent when the subscription\ntriggers.\n\n**Supported action types:**\n- `webhook` — Deliver results to an HTTP endpoint\n\nMultiple actions of the same type are allowed on a single subscription,\nup to a maximum of **10 actions** per subscription.\n\n> **Note:** Subscription action webhooks are currently delivered without\n> HMAC signatures. Do not rely on request signatures to authenticate\n> incoming payloads from subscription actions.\n"}],"servers":[{"url":"https://api.saber.app","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication using Bearer token. Format: sk_live_ followed by a secure random string."}},"schemas":{"ListSubscriptionActionsResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionActionResponse"}},"total":{"type":"integer","description":"Total number of actions for the subscription"},"limit":{"type":"integer","description":"Maximum number of actions returned"},"offset":{"type":"integer","description":"Number of actions skipped"},"hasMore":{"type":"boolean","description":"Whether there are more actions available"}},"required":["items","total","limit","offset","hasMore"]},"SubscriptionActionResponse":{"type":"object","description":"A subscription action resource.","required":["id","subscriptionId","type","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The action ID"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription this action belongs to"},"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"},"enabled":{"type":"boolean","description":"Whether the action is enabled. Disabled actions are skipped during dispatch.","default":true},"createdAt":{"type":"string","format":"date-time","description":"When the action was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the action was last updated"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}},"ErrorResponse":{"type":"object","description":"Standard error envelope returned by every endpoint that flows through the global error handler. Note: the global rate-limit middleware (HTTP 429 from per-API-key throttling) returns a different, flat shape — see `RateLimitErrorResponse`.\n","required":["error"],"properties":{"error":{"type":"object","required":["type","code","requestId"],"properties":{"type":{"type":"string","description":"Error category. Maps 1:1 to HTTP status (e.g. VALIDATION → 422, UNAUTHORIZED → 401).","enum":["BAD_REQUEST","VALIDATION","UNPROCESSABLE_ENTITY","NOT_FOUND","CONFLICT","UNAUTHORIZED","FORBIDDEN","PAYMENT_REQUIRED","PAYLOAD_TOO_LARGE","INTERNAL","EXTERNAL","TIMEOUT"]},"code":{"type":"string","description":"Stable machine-readable error code. Safe to switch on in client code."},"message":{"type":"string","description":"Human-readable error message. Wording may change; do not match against this string."},"errorCode":{"type":"string","description":"Optional public error code propagated from a downstream service (e.g. NestJS, LinkedIn)."},"errorAction":{"type":"string","description":"Optional user action guidance (e.g. \"reconnect Sales Navigator\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured fields forwarded from a downstream service. Shape depends on the source."},"requestId":{"type":"string","format":"uuid","description":"Correlation ID for this request. Include when reporting issues."},"fields":{"type":"array","description":"Per-field validation errors (populated when `type` is `VALIDATION` and the cause is a struct-tag validator).","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"debug":{"type":"object","description":"Debug information. Only present in development environments.","properties":{"cause":{"type":"string"}}}}}}}}},"paths":{"/v1/companies/signals/subscriptions/{subscriptionId}/actions":{"get":{"summary":"List all actions for a subscription","description":"Retrieve a paginated list of actions configured on a subscription.","operationId":"listSubscriptionActions","tags":["Subscription Actions"],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"The subscription whose actions to list","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","description":"Maximum number of actions to return","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"offset","in":"query","description":"Number of actions to skip for pagination","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Actions retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSubscriptionActionsResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Subscription not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}
```

## Create a subscription action

> Create an action on a subscription. Actions define what happens when the\
> subscription triggers (e.g., deliver results via webhook).\
> A maximum of 10 actions per subscription is allowed.<br>

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"tags":[{"name":"Subscription Actions","summary":"Subscription Actions","kind":"nav","description":"## Subscription Actions\n\nActions define delivery mechanisms for subscription results. Each action\nspecifies where and how signal outputs should be sent when the subscription\ntriggers.\n\n**Supported action types:**\n- `webhook` — Deliver results to an HTTP endpoint\n\nMultiple actions of the same type are allowed on a single subscription,\nup to a maximum of **10 actions** per subscription.\n\n> **Note:** Subscription action webhooks are currently delivered without\n> HMAC signatures. Do not rely on request signatures to authenticate\n> incoming payloads from subscription actions.\n"}],"servers":[{"url":"https://api.saber.app","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication using Bearer token. Format: sk_live_ followed by a secure random string."}},"schemas":{"CreateSubscriptionActionRequest":{"type":"object","description":"Create a new action on a subscription. The `type` field determines which\nconfiguration object is required.\n","required":["type"],"properties":{"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}},"SubscriptionActionResponse":{"type":"object","description":"A subscription action resource.","required":["id","subscriptionId","type","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The action ID"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription this action belongs to"},"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"},"enabled":{"type":"boolean","description":"Whether the action is enabled. Disabled actions are skipped during dispatch.","default":true},"createdAt":{"type":"string","format":"date-time","description":"When the action was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the action was last updated"}}},"ErrorResponse":{"type":"object","description":"Standard error envelope returned by every endpoint that flows through the global error handler. Note: the global rate-limit middleware (HTTP 429 from per-API-key throttling) returns a different, flat shape — see `RateLimitErrorResponse`.\n","required":["error"],"properties":{"error":{"type":"object","required":["type","code","requestId"],"properties":{"type":{"type":"string","description":"Error category. Maps 1:1 to HTTP status (e.g. VALIDATION → 422, UNAUTHORIZED → 401).","enum":["BAD_REQUEST","VALIDATION","UNPROCESSABLE_ENTITY","NOT_FOUND","CONFLICT","UNAUTHORIZED","FORBIDDEN","PAYMENT_REQUIRED","PAYLOAD_TOO_LARGE","INTERNAL","EXTERNAL","TIMEOUT"]},"code":{"type":"string","description":"Stable machine-readable error code. Safe to switch on in client code."},"message":{"type":"string","description":"Human-readable error message. Wording may change; do not match against this string."},"errorCode":{"type":"string","description":"Optional public error code propagated from a downstream service (e.g. NestJS, LinkedIn)."},"errorAction":{"type":"string","description":"Optional user action guidance (e.g. \"reconnect Sales Navigator\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured fields forwarded from a downstream service. Shape depends on the source."},"requestId":{"type":"string","format":"uuid","description":"Correlation ID for this request. Include when reporting issues."},"fields":{"type":"array","description":"Per-field validation errors (populated when `type` is `VALIDATION` and the cause is a struct-tag validator).","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"debug":{"type":"object","description":"Debug information. Only present in development environments.","properties":{"cause":{"type":"string"}}}}}}}}},"paths":{"/v1/companies/signals/subscriptions/{subscriptionId}/actions":{"post":{"summary":"Create a subscription action","description":"Create an action on a subscription. Actions define what happens when the\nsubscription triggers (e.g., deliver results via webhook).\nA maximum of 10 actions per subscription is allowed.\n","operationId":"createSubscriptionAction","tags":["Subscription Actions"],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"The subscription to add the action to","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionActionRequest"}}}},"responses":{"201":{"description":"Action created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionActionResponse"}}}},"400":{"description":"Invalid action configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Subscription not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}
```

## Get a subscription action by ID

> Retrieve a single action by its ID.

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"tags":[{"name":"Subscription Actions","summary":"Subscription Actions","kind":"nav","description":"## Subscription Actions\n\nActions define delivery mechanisms for subscription results. Each action\nspecifies where and how signal outputs should be sent when the subscription\ntriggers.\n\n**Supported action types:**\n- `webhook` — Deliver results to an HTTP endpoint\n\nMultiple actions of the same type are allowed on a single subscription,\nup to a maximum of **10 actions** per subscription.\n\n> **Note:** Subscription action webhooks are currently delivered without\n> HMAC signatures. Do not rely on request signatures to authenticate\n> incoming payloads from subscription actions.\n"}],"servers":[{"url":"https://api.saber.app","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication using Bearer token. Format: sk_live_ followed by a secure random string."}},"schemas":{"SubscriptionActionResponse":{"type":"object","description":"A subscription action resource.","required":["id","subscriptionId","type","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The action ID"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription this action belongs to"},"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"},"enabled":{"type":"boolean","description":"Whether the action is enabled. Disabled actions are skipped during dispatch.","default":true},"createdAt":{"type":"string","format":"date-time","description":"When the action was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the action was last updated"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}},"ErrorResponse":{"type":"object","description":"Standard error envelope returned by every endpoint that flows through the global error handler. Note: the global rate-limit middleware (HTTP 429 from per-API-key throttling) returns a different, flat shape — see `RateLimitErrorResponse`.\n","required":["error"],"properties":{"error":{"type":"object","required":["type","code","requestId"],"properties":{"type":{"type":"string","description":"Error category. Maps 1:1 to HTTP status (e.g. VALIDATION → 422, UNAUTHORIZED → 401).","enum":["BAD_REQUEST","VALIDATION","UNPROCESSABLE_ENTITY","NOT_FOUND","CONFLICT","UNAUTHORIZED","FORBIDDEN","PAYMENT_REQUIRED","PAYLOAD_TOO_LARGE","INTERNAL","EXTERNAL","TIMEOUT"]},"code":{"type":"string","description":"Stable machine-readable error code. Safe to switch on in client code."},"message":{"type":"string","description":"Human-readable error message. Wording may change; do not match against this string."},"errorCode":{"type":"string","description":"Optional public error code propagated from a downstream service (e.g. NestJS, LinkedIn)."},"errorAction":{"type":"string","description":"Optional user action guidance (e.g. \"reconnect Sales Navigator\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured fields forwarded from a downstream service. Shape depends on the source."},"requestId":{"type":"string","format":"uuid","description":"Correlation ID for this request. Include when reporting issues."},"fields":{"type":"array","description":"Per-field validation errors (populated when `type` is `VALIDATION` and the cause is a struct-tag validator).","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"debug":{"type":"object","description":"Debug information. Only present in development environments.","properties":{"cause":{"type":"string"}}}}}}}}},"paths":{"/v1/companies/signals/subscriptions/{subscriptionId}/actions/{actionId}":{"get":{"summary":"Get a subscription action by ID","description":"Retrieve a single action by its ID.","operationId":"getSubscriptionAction","tags":["Subscription Actions"],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"The subscription that owns the action","schema":{"type":"string","format":"uuid"}},{"name":"actionId","in":"path","required":true,"description":"The action ID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Action retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionActionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Subscription or action not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}
```

## Update a subscription action

> Replace the configuration of an existing action. The action type is\
> immutable; only the type-specific configuration can be updated.<br>

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"tags":[{"name":"Subscription Actions","summary":"Subscription Actions","kind":"nav","description":"## Subscription Actions\n\nActions define delivery mechanisms for subscription results. Each action\nspecifies where and how signal outputs should be sent when the subscription\ntriggers.\n\n**Supported action types:**\n- `webhook` — Deliver results to an HTTP endpoint\n\nMultiple actions of the same type are allowed on a single subscription,\nup to a maximum of **10 actions** per subscription.\n\n> **Note:** Subscription action webhooks are currently delivered without\n> HMAC signatures. Do not rely on request signatures to authenticate\n> incoming payloads from subscription actions.\n"}],"servers":[{"url":"https://api.saber.app","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication using Bearer token. Format: sk_live_ followed by a secure random string."}},"schemas":{"UpdateSubscriptionActionRequest":{"type":"object","description":"Update the configuration of an existing action. The action type is\nimmutable; only the type-specific configuration can be changed.\n","properties":{"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}},"SubscriptionActionResponse":{"type":"object","description":"A subscription action resource.","required":["id","subscriptionId","type","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The action ID"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription this action belongs to"},"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"},"enabled":{"type":"boolean","description":"Whether the action is enabled. Disabled actions are skipped during dispatch.","default":true},"createdAt":{"type":"string","format":"date-time","description":"When the action was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the action was last updated"}}},"ErrorResponse":{"type":"object","description":"Standard error envelope returned by every endpoint that flows through the global error handler. Note: the global rate-limit middleware (HTTP 429 from per-API-key throttling) returns a different, flat shape — see `RateLimitErrorResponse`.\n","required":["error"],"properties":{"error":{"type":"object","required":["type","code","requestId"],"properties":{"type":{"type":"string","description":"Error category. Maps 1:1 to HTTP status (e.g. VALIDATION → 422, UNAUTHORIZED → 401).","enum":["BAD_REQUEST","VALIDATION","UNPROCESSABLE_ENTITY","NOT_FOUND","CONFLICT","UNAUTHORIZED","FORBIDDEN","PAYMENT_REQUIRED","PAYLOAD_TOO_LARGE","INTERNAL","EXTERNAL","TIMEOUT"]},"code":{"type":"string","description":"Stable machine-readable error code. Safe to switch on in client code."},"message":{"type":"string","description":"Human-readable error message. Wording may change; do not match against this string."},"errorCode":{"type":"string","description":"Optional public error code propagated from a downstream service (e.g. NestJS, LinkedIn)."},"errorAction":{"type":"string","description":"Optional user action guidance (e.g. \"reconnect Sales Navigator\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured fields forwarded from a downstream service. Shape depends on the source."},"requestId":{"type":"string","format":"uuid","description":"Correlation ID for this request. Include when reporting issues."},"fields":{"type":"array","description":"Per-field validation errors (populated when `type` is `VALIDATION` and the cause is a struct-tag validator).","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"debug":{"type":"object","description":"Debug information. Only present in development environments.","properties":{"cause":{"type":"string"}}}}}}}}},"paths":{"/v1/companies/signals/subscriptions/{subscriptionId}/actions/{actionId}":{"put":{"summary":"Update a subscription action","description":"Replace the configuration of an existing action. The action type is\nimmutable; only the type-specific configuration can be updated.\n","operationId":"updateSubscriptionAction","tags":["Subscription Actions"],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"The subscription that owns the action","schema":{"type":"string","format":"uuid"}},{"name":"actionId","in":"path","required":true,"description":"The action ID to update","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriptionActionRequest"}}}},"responses":{"200":{"description":"Action updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionActionResponse"}}}},"400":{"description":"Invalid action configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Subscription or action not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}
```

## Delete a subscription action

> Permanently delete an action from a subscription.

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"tags":[{"name":"Subscription Actions","summary":"Subscription Actions","kind":"nav","description":"## Subscription Actions\n\nActions define delivery mechanisms for subscription results. Each action\nspecifies where and how signal outputs should be sent when the subscription\ntriggers.\n\n**Supported action types:**\n- `webhook` — Deliver results to an HTTP endpoint\n\nMultiple actions of the same type are allowed on a single subscription,\nup to a maximum of **10 actions** per subscription.\n\n> **Note:** Subscription action webhooks are currently delivered without\n> HMAC signatures. Do not rely on request signatures to authenticate\n> incoming payloads from subscription actions.\n"}],"servers":[{"url":"https://api.saber.app","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication using Bearer token. Format: sk_live_ followed by a secure random string."}},"schemas":{"ErrorResponse":{"type":"object","description":"Standard error envelope returned by every endpoint that flows through the global error handler. Note: the global rate-limit middleware (HTTP 429 from per-API-key throttling) returns a different, flat shape — see `RateLimitErrorResponse`.\n","required":["error"],"properties":{"error":{"type":"object","required":["type","code","requestId"],"properties":{"type":{"type":"string","description":"Error category. Maps 1:1 to HTTP status (e.g. VALIDATION → 422, UNAUTHORIZED → 401).","enum":["BAD_REQUEST","VALIDATION","UNPROCESSABLE_ENTITY","NOT_FOUND","CONFLICT","UNAUTHORIZED","FORBIDDEN","PAYMENT_REQUIRED","PAYLOAD_TOO_LARGE","INTERNAL","EXTERNAL","TIMEOUT"]},"code":{"type":"string","description":"Stable machine-readable error code. Safe to switch on in client code."},"message":{"type":"string","description":"Human-readable error message. Wording may change; do not match against this string."},"errorCode":{"type":"string","description":"Optional public error code propagated from a downstream service (e.g. NestJS, LinkedIn)."},"errorAction":{"type":"string","description":"Optional user action guidance (e.g. \"reconnect Sales Navigator\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured fields forwarded from a downstream service. Shape depends on the source."},"requestId":{"type":"string","format":"uuid","description":"Correlation ID for this request. Include when reporting issues."},"fields":{"type":"array","description":"Per-field validation errors (populated when `type` is `VALIDATION` and the cause is a struct-tag validator).","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"debug":{"type":"object","description":"Debug information. Only present in development environments.","properties":{"cause":{"type":"string"}}}}}}}}},"paths":{"/v1/companies/signals/subscriptions/{subscriptionId}/actions/{actionId}":{"delete":{"summary":"Delete a subscription action","description":"Permanently delete an action from a subscription.","operationId":"deleteSubscriptionAction","tags":["Subscription Actions"],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"The subscription that owns the action","schema":{"type":"string","format":"uuid"}},{"name":"actionId","in":"path","required":true,"description":"The action ID to delete","schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Action deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Subscription or action not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}
```

## Pause a subscription action

> Disable an action so it is skipped during dispatch. The action\
> configuration is preserved and can be re-enabled with unpause.<br>

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"tags":[{"name":"Subscription Actions","summary":"Subscription Actions","kind":"nav","description":"## Subscription Actions\n\nActions define delivery mechanisms for subscription results. Each action\nspecifies where and how signal outputs should be sent when the subscription\ntriggers.\n\n**Supported action types:**\n- `webhook` — Deliver results to an HTTP endpoint\n\nMultiple actions of the same type are allowed on a single subscription,\nup to a maximum of **10 actions** per subscription.\n\n> **Note:** Subscription action webhooks are currently delivered without\n> HMAC signatures. Do not rely on request signatures to authenticate\n> incoming payloads from subscription actions.\n"}],"servers":[{"url":"https://api.saber.app","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication using Bearer token. Format: sk_live_ followed by a secure random string."}},"schemas":{"SubscriptionActionResponse":{"type":"object","description":"A subscription action resource.","required":["id","subscriptionId","type","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The action ID"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription this action belongs to"},"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"},"enabled":{"type":"boolean","description":"Whether the action is enabled. Disabled actions are skipped during dispatch.","default":true},"createdAt":{"type":"string","format":"date-time","description":"When the action was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the action was last updated"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}},"ErrorResponse":{"type":"object","description":"Standard error envelope returned by every endpoint that flows through the global error handler. Note: the global rate-limit middleware (HTTP 429 from per-API-key throttling) returns a different, flat shape — see `RateLimitErrorResponse`.\n","required":["error"],"properties":{"error":{"type":"object","required":["type","code","requestId"],"properties":{"type":{"type":"string","description":"Error category. Maps 1:1 to HTTP status (e.g. VALIDATION → 422, UNAUTHORIZED → 401).","enum":["BAD_REQUEST","VALIDATION","UNPROCESSABLE_ENTITY","NOT_FOUND","CONFLICT","UNAUTHORIZED","FORBIDDEN","PAYMENT_REQUIRED","PAYLOAD_TOO_LARGE","INTERNAL","EXTERNAL","TIMEOUT"]},"code":{"type":"string","description":"Stable machine-readable error code. Safe to switch on in client code."},"message":{"type":"string","description":"Human-readable error message. Wording may change; do not match against this string."},"errorCode":{"type":"string","description":"Optional public error code propagated from a downstream service (e.g. NestJS, LinkedIn)."},"errorAction":{"type":"string","description":"Optional user action guidance (e.g. \"reconnect Sales Navigator\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured fields forwarded from a downstream service. Shape depends on the source."},"requestId":{"type":"string","format":"uuid","description":"Correlation ID for this request. Include when reporting issues."},"fields":{"type":"array","description":"Per-field validation errors (populated when `type` is `VALIDATION` and the cause is a struct-tag validator).","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"debug":{"type":"object","description":"Debug information. Only present in development environments.","properties":{"cause":{"type":"string"}}}}}}}}},"paths":{"/v1/companies/signals/subscriptions/{subscriptionId}/actions/{actionId}/pause":{"post":{"summary":"Pause a subscription action","description":"Disable an action so it is skipped during dispatch. The action\nconfiguration is preserved and can be re-enabled with unpause.\n","operationId":"pauseSubscriptionAction","tags":["Subscription Actions"],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"The subscription that owns the action","schema":{"type":"string","format":"uuid"}},{"name":"actionId","in":"path","required":true,"description":"The action ID to pause","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Action paused successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionActionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Subscription or action not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}
```

## Unpause a subscription action

> Re-enable a paused action so it resumes being dispatched when the\
> subscription triggers.<br>

```json
{"openapi":"3.2.0","info":{"title":"Saber Platform API","version":"1.0.0"},"tags":[{"name":"Subscription Actions","summary":"Subscription Actions","kind":"nav","description":"## Subscription Actions\n\nActions define delivery mechanisms for subscription results. Each action\nspecifies where and how signal outputs should be sent when the subscription\ntriggers.\n\n**Supported action types:**\n- `webhook` — Deliver results to an HTTP endpoint\n\nMultiple actions of the same type are allowed on a single subscription,\nup to a maximum of **10 actions** per subscription.\n\n> **Note:** Subscription action webhooks are currently delivered without\n> HMAC signatures. Do not rely on request signatures to authenticate\n> incoming payloads from subscription actions.\n"}],"servers":[{"url":"https://api.saber.app","description":"Production server"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key","description":"API key authentication using Bearer token. Format: sk_live_ followed by a secure random string."}},"schemas":{"SubscriptionActionResponse":{"type":"object","description":"A subscription action resource.","required":["id","subscriptionId","type","enabled","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"The action ID"},"subscriptionId":{"type":"string","format":"uuid","description":"The subscription this action belongs to"},"type":{"type":"string","description":"The action type discriminator","enum":["webhook"]},"webhook":{"$ref":"#/components/schemas/WebhookActionConfig"},"enabled":{"type":"boolean","description":"Whether the action is enabled. Disabled actions are skipped during dispatch.","default":true},"createdAt":{"type":"string","format":"date-time","description":"When the action was created"},"updatedAt":{"type":"string","format":"date-time","description":"When the action was last updated"}}},"WebhookActionConfig":{"type":"object","description":"Configuration for a webhook action.","required":["destination"],"properties":{"destination":{"type":"string","format":"uri","description":"The URL to deliver webhook payloads to"}}},"ErrorResponse":{"type":"object","description":"Standard error envelope returned by every endpoint that flows through the global error handler. Note: the global rate-limit middleware (HTTP 429 from per-API-key throttling) returns a different, flat shape — see `RateLimitErrorResponse`.\n","required":["error"],"properties":{"error":{"type":"object","required":["type","code","requestId"],"properties":{"type":{"type":"string","description":"Error category. Maps 1:1 to HTTP status (e.g. VALIDATION → 422, UNAUTHORIZED → 401).","enum":["BAD_REQUEST","VALIDATION","UNPROCESSABLE_ENTITY","NOT_FOUND","CONFLICT","UNAUTHORIZED","FORBIDDEN","PAYMENT_REQUIRED","PAYLOAD_TOO_LARGE","INTERNAL","EXTERNAL","TIMEOUT"]},"code":{"type":"string","description":"Stable machine-readable error code. Safe to switch on in client code."},"message":{"type":"string","description":"Human-readable error message. Wording may change; do not match against this string."},"errorCode":{"type":"string","description":"Optional public error code propagated from a downstream service (e.g. NestJS, LinkedIn)."},"errorAction":{"type":"string","description":"Optional user action guidance (e.g. \"reconnect Sales Navigator\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured fields forwarded from a downstream service. Shape depends on the source."},"requestId":{"type":"string","format":"uuid","description":"Correlation ID for this request. Include when reporting issues."},"fields":{"type":"array","description":"Per-field validation errors (populated when `type` is `VALIDATION` and the cause is a struct-tag validator).","items":{"type":"object","required":["field","message"],"properties":{"field":{"type":"string"},"message":{"type":"string"}}}},"debug":{"type":"object","description":"Debug information. Only present in development environments.","properties":{"cause":{"type":"string"}}}}}}}}},"paths":{"/v1/companies/signals/subscriptions/{subscriptionId}/actions/{actionId}/unpause":{"post":{"summary":"Unpause a subscription action","description":"Re-enable a paused action so it resumes being dispatched when the\nsubscription triggers.\n","operationId":"unpauseSubscriptionAction","tags":["Subscription Actions"],"parameters":[{"name":"subscriptionId","in":"path","required":true,"description":"The subscription that owns the action","schema":{"type":"string","format":"uuid"}},{"name":"actionId","in":"path","required":true,"description":"The action ID to unpause","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Action unpaused successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionActionResponse"}}}},"401":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Subscription or action not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developers.saber.app/subscription-actions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
