Skip to main content
TypeScript

Authorizations

Authorization
string
header
required

Your Periskope API token, sent as Authorization: Bearer <token>. Generate one from the Periskope dashboard under Settings → API & Webhooks. API access requires an active Pro or Enterprise plan.

Body

application/json
hookUrl
string
required

HTTP or HTTPS endpoint that will receive the subscribed events as JSON POST requests. Each delivery is signed with an HMAC-SHA256 signature of the body computed with the workspace signing key.

Example:

"https://example.com/webhooks/periskope"

integrationName
required

Event type(s) to subscribe the endpoint to — a single event type or an array. One subscription row is created per event type; the rows share the same hookUrl and integration_id. Deliverable event types: chat.created, chat.notification.created, message.created, message.updated, message.deleted, message.ack.updated, message.flagged, message.unflagged, reaction.created, ticket.created, ticket.updated, ticket.deleted, org.phone.connected, org.phone.disconnected, org.phone.updated, org.phone.qr, note.created, chat.custom_properties.updated. The legacy names org.created, org.updated, org.member.created, org.member.updated, org.subscription.trial_will_end, org.integrations.updated, org.phone.created, chat.updated, chat.label.updated, reaction.updated, reaction.added, message.ticket.attached are also accepted for compatibility, but events are never delivered for them.

Available options:
chat.created,
chat.notification.created,
message.created,
message.updated,
message.deleted,
message.ack.updated,
message.flagged,
message.unflagged,
reaction.created,
ticket.created,
ticket.updated,
ticket.deleted,
org.phone.connected,
org.phone.disconnected,
org.phone.updated,
org.phone.qr,
note.created,
chat.custom_properties.updated,
org.created,
org.updated,
org.member.created,
org.member.updated,
org.subscription.trial_will_end,
org.integrations.updated,
org.phone.created,
chat.updated,
chat.label.updated,
reaction.updated,
reaction.added,
message.ticket.attached
Example:
integrationMetadata
object

Arbitrary JSON object stored with the subscription. Two keys are special: id (a non-empty string becomes the integration_id shared by the created rows; otherwise a UUID is generated) and name (used as the display name unless the name field is passed).

Example:
integrationType
string

Label stored as integration_type on the created rows. Defaults to 'webhook' — leave it unset unless an integration guide instructs otherwise.

Example:

"webhook"

type
enum<string>

Kind of integration record to create. Defaults to 'webhook'. Any other value makes the subscription invisible to this API — GET, PATCH and DELETE /webhooks/{id} and the list endpoint only address records of type 'webhook'.

Available options:
zapier,
pabbly,
api,
webhook,
hubspot,
freshdesk,
slack,
jira,
salesforce,
zohodesk,
gsheets,
zohocrm
Example:

"webhook"

name
string

Display name of the webhook, stored as integration_metadata.name on every created row. Defaults to integrationMetadata.name, or to hookUrl when neither is given.

Example:

"Ticket webhook"

Response

The created subscription rows — one per event type in integrationName

id
string

Unique id of the webhook subscription (UUID). Use it as the id path parameter when fetching, updating or deleting the subscription.

Example:

"00000000-0000-0000-0000-000000000000"

org_id
string

Id of the workspace (org) the webhook belongs to

Example:

"00000000-0000-0000-0000-000000000000"

hook_url
string

HTTP(S) endpoint that receives the subscribed events as JSON POST requests, signed with an HMAC-SHA256 signature of the body computed with the workspace signing key

Example:

"https://example.com/webhooks/periskope"

integration_name
enum<string>

The event type this subscription row delivers. One row exists per subscribed event type. Deliverable event types: chat.created, chat.notification.created, message.created, message.updated, message.deleted, message.ack.updated, message.flagged, message.unflagged, reaction.created, ticket.created, ticket.updated, ticket.deleted, org.phone.connected, org.phone.disconnected, org.phone.updated, org.phone.qr, note.created, chat.custom_properties.updated. The legacy names org.created, org.updated, org.member.created, org.member.updated, org.subscription.trial_will_end, org.integrations.updated, org.phone.created, chat.updated, chat.label.updated, reaction.updated, reaction.added, message.ticket.attached are also accepted for compatibility, but events are never delivered for them.

Available options:
chat.created,
chat.notification.created,
message.created,
message.updated,
message.deleted,
message.ack.updated,
message.flagged,
message.unflagged,
reaction.created,
ticket.created,
ticket.updated,
ticket.deleted,
org.phone.connected,
org.phone.disconnected,
org.phone.updated,
org.phone.qr,
note.created,
chat.custom_properties.updated,
org.created,
org.updated,
org.member.created,
org.member.updated,
org.subscription.trial_will_end,
org.integrations.updated,
org.phone.created,
chat.updated,
chat.label.updated,
reaction.updated,
reaction.added,
message.ticket.attached
Example:

"ticket.created"

integration_type
string

Label of the integration that created the subscription. Webhooks created via this API default to 'webhook'.

Example:

"webhook"

type
enum<string>

Kind of integration record. This API only lists, fetches, updates and deletes records of type 'webhook' — other values belong to built-in integrations (Zapier, Slack, ...) managed from the dashboard.

Available options:
zapier,
pabbly,
api,
webhook,
hubspot,
freshdesk,
slack,
jira,
salesforce,
zohodesk,
gsheets,
zohocrm
Example:

"webhook"

is_subscribed
boolean

Whether event delivery is active. false pauses delivery without deleting the subscription — set it via PATCH isSubscribed, or automatically by Periskope when the endpoint keeps failing (workspace admins are emailed when that happens).

Example:

true

integration_id
string

Groups the subscription rows created together: every row created by the same POST /webhooks call shares this id (taken from integrationMetadata.id when provided, otherwise generated). null on some legacy rows.

Example:

"00000000-0000-0000-0000-000000000000"

integration_metadata
object

Metadata stored with the subscription. Webhooks created via this API always carry id (mirrors integration_id) and name (display name); any other keys sent in integrationMetadata are stored as-is.

Example:
phone_scopes
string[]

Phone numbers whose events this webhook receives. Webhooks created via this API are unscoped (they receive events from every phone in the workspace); for unscoped rows this field is materialized in responses as the workspace's current full list of phone numbers.

Example:
subscribed_at
string

When the subscription was created, as an ISO 8601 timestamp. Re-creating the same event type + hookUrl pair refreshes it.

Example:

"2026-01-15T09:30:00.000Z"