Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
contact:
name: Linkbreakers Support
url: https://app.linkbreakers.com
description: 'This is a documentation of all the APIs of Linkbreakers
## Entry points
`GET https://api.linkbreakers.com/` and `GET https://api.linkbreakers.com/v1` answer without credentials with the API''s name, version and links. This document is served at `https://api.linkbreakers.com/openapi.json`.
## Rate limits
Every response describes where the caller stands in the IETF `RateLimit-Policy` and `RateLimit` header fields (draft-ietf-httpapi-ratelimit-headers), and in `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` and `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` (a Unix timestamp) for clients that read those. A request past the limit gets `429 Too Many Requests` with `Retry-After` in seconds.
- Workspace API token: 720 requests per 60 seconds, per token.
- Dashboard session or OAuth token: 600 requests per 60 seconds, per token.
- No credentials: 300 requests per 60 seconds, per client IP.
Each plan also includes a number of API calls per billing cycle. Past it, calls answer `429` with the code `MAX_PUBLIC_API_QUERIED_REACHED` until the cycle renews or the plan changes.
## Pagination
Every list pages with opaque cursors (AIP-158). Pass `pageSize`, then send the `nextPageToken` of each response back as `pageToken` (or its alias `cursor`) to get the next page. An empty or absent `nextPageToken` means the list is complete. Each list operation describes this in `x-pagination`.
## Batches and background jobs
`POST /v1/links/bulk` creates up to 250 links in one transactional request; `POST /v1/links/batch` takes the same links as a bare JSON array. `POST /v1/links/bulk/jobs` accepts the same batch and answers `202 Accepted` at once with a job and a `Location` header; poll `GET /v1/jobs/{id}` until `status` is `JOB_STATUS_SUCCEEDED` (the created link ids are in `linksBulkCreate.linkIds`) or `JOB_STATUS_FAILED` (`error` says why, and nothing was created). Jobs can be read for 24 hours after they finish.
## Versioning and deprecation
The version is in the path: every operation lives under `/v1`. Within a version, changes are additive only: new operations, new optional request fields, new response fields and new enum values. Clients should ignore fields and enum values they do not know. Anything that would break an existing client ships under a new path version instead.
An operation is retired in two steps. First it is deprecated: it keeps working, is flagged `deprecated: true` in this document, and every response carries a `Deprecation` header field (RFC 9745) with the time it was deprecated and a `Link` with `rel="deprecation"` to the policy. Then, at least 180 days later, it may be removed; that date is announced in advance in a `Sunset` header field (RFC 8594) and as `x-sunset` on the operation. The full policy: https://linkbreakers.com/help/article/api-versioning-and-deprecation-policy
## Idempotent retries
Every POST, PUT and PATCH accepts an optional `Idempotency-Key` header (draft-ietf-httpapi-idempotency-key-header). Send a new unique value, such as a UUID, with each logical request and reuse it only to retry that request. A retry with the same key and the same request returns the first response, marked `Idempotent-Replayed: true`, instead of running again. Keys are scoped to the token and kept for 24 hours. The same key with a different request is refused with `422`, and a retry while the first request is still running gets `409` with `Retry-After`. Server errors (5xx) and refusals such as 401, 403 and 429 are not stored, so retrying them runs the request again.'
title: Linkbreakers Webhooks API
version: 1.185.0
x-api-versioning:
compatibility: additive changes only within a version
currentVersion: v1
deprecationHeaders:
- Deprecation
- Sunset
- Link
minimumNoticeDays: 180
policy: https://linkbreakers.com/help/article/api-versioning-and-deprecation-policy
strategy: url-path
servers:
- url: https://api.linkbreakers.com
security:
- bearerAuth: []
tags:
- description: Endpoints for managing webhooks in Linkbreakers. These endpoints allow you to create, list, and delete webhooks for event notifications.
name: Webhooks
paths:
/v1/webhooks:
get:
description: 'Enumerate all webhooks for the workspace to manage event integrations.
Requires the `webhooks:read` scope.'
operationId: WebhooksService_List
parameters:
- default: WEBHOOK_STATUS_UNSPECIFIED
description: "Filter by webhook status (optional)\n\n - WEBHOOK_STATUS_UNSPECIFIED: Webhook status not specified\n - WEBHOOK_STATUS_ACTIVE: Webhook is active and receiving events\n - WEBHOOK_STATUS_DISABLED: Webhook is disabled due to repeated failures\n - WEBHOOK_STATUS_PAUSED: Webhook is paused by user action"
enum:
- WEBHOOK_STATUS_UNSPECIFIED
- WEBHOOK_STATUS_ACTIVE
- WEBHOOK_STATUS_DISABLED
- WEBHOOK_STATUS_PAUSED
in: query
name: status
required: false
schema:
type: string
- description: Maximum number of webhooks to return. Defaults to 100, capped at 1000.
in: query
name: pageSize
required: false
schema:
format: int64
type: integer
- description: 'Cursor from a previous response''s next_page_token. Empty starts at the
first page. Pages are ordered by (created_at, id), which never change, so a
record cannot move between pages while a client is walking them.'
in: query
name: pageToken
required: false
schema:
type: string
- description: Opaque cursor from the previous page's nextPageToken. Same as pageToken; when both are sent, pageToken wins.
in: query
name: cursor
required: false
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/ListWebhooksResponse'
description: Everything worked as expected.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
'429':
$ref: '#/components/responses/TooManyRequests'
default:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: Unexpected error
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
security:
- bearerAuth:
- webhooks:read
- oauth2:
- webhooks:read
summary: List webhooks
tags:
- Webhooks
x-pagination:
cursorAlias: cursor
cursorParam: pageToken
endOfList: nextPageToken is empty or absent
nextCursorField: nextPageToken
pageSizeParam: pageSize
type: cursor
x-required-scope: webhooks:read
post:
description: 'Create a new webhook endpoint to receive event notifications when workflow steps complete.
Requires the `webhooks:write` scope.'
operationId: WebhooksService_Create
parameters:
- description: Makes retrying this request safe. See components.parameters.IdempotencyKey.
in: header
name: Idempotency-Key
required: false
schema:
maxLength: 255
minLength: 1
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/CreateWebhookRequest'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/CreateWebhookResponse'
description: Everything worked as expected.
headers:
Idempotent-Replayed:
$ref: '#/components/headers/Idempotent-Replayed'
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
'429':
$ref: '#/components/responses/TooManyRequests'
default:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: Unexpected error
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
security:
- bearerAuth:
- webhooks:write
- oauth2:
- webhooks:write
summary: Create a webhook
tags:
- Webhooks
x-required-scope: webhooks:write
/v1/webhooks/{id}:
delete:
description: 'Remove a webhook endpoint so it no longer receives event notifications.
Requires the `webhooks:write` scope.'
operationId: WebhooksService_Delete
parameters:
- description: Identifier of the webhook to delete (UUID)
in: path
name: id
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
properties: {}
type: object
description: Everything worked as expected.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
'429':
$ref: '#/components/responses/TooManyRequests'
default:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: Unexpected error
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
security:
- bearerAuth:
- webhooks:write
- oauth2:
- webhooks:write
summary: Delete a webhook
tags:
- Webhooks
x-required-scope: webhooks:write
get:
description: 'Retrieve details for a specific webhook endpoint.
Requires the `webhooks:read` scope.'
operationId: WebhooksService_Get
parameters:
- description: Identifier of the desired webhook (UUID)
in: path
name: id
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/GetWebhookResponse'
description: Everything worked as expected.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
'429':
$ref: '#/components/responses/TooManyRequests'
default:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: Unexpected error
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
security:
- bearerAuth:
- webhooks:read
- oauth2:
- webhooks:read
summary: Get a webhook
tags:
- Webhooks
x-required-scope: webhooks:read
patch:
description: 'Modify an existing webhook endpoint configuration.
Requires the `webhooks:write` scope.'
operationId: WebhooksService_Update
parameters:
- description: Identifier of the webhook to update (UUID)
in: path
name: id
required: true
schema:
type: string
- description: Makes retrying this request safe. See components.parameters.IdempotencyKey.
in: header
name: Idempotency-Key
required: false
schema:
maxLength: 255
minLength: 1
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/WebhooksServiceUpdateBody'
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateWebhookResponse'
description: Everything worked as expected.
headers:
Idempotent-Replayed:
$ref: '#/components/headers/Idempotent-Replayed'
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
'429':
$ref: '#/components/responses/TooManyRequests'
default:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: Unexpected error
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
security:
- bearerAuth:
- webhooks:write
- oauth2:
- webhooks:write
summary: Update a webhook
tags:
- Webhooks
x-required-scope: webhooks:write
components:
headers:
RateLimit-Remaining:
description: Requests left in the current window.
schema:
example: 598
type: integer
RateLimit:
description: 'What is left of the quota: `"<name>";r=<remaining requests>;t=<seconds until the window resets>` (draft-ietf-httpapi-ratelimit-headers).'
schema:
example: '"token";r=598;t=42'
type: string
Retry-After:
description: Seconds to wait before retrying a refused request.
schema:
example: 42
type: integer
X-RateLimit-Reset:
description: Unix time, in seconds, at which the current window resets.
schema:
example: 1791650400
type: integer
RateLimit-Limit:
description: Requests allowed in the current window.
schema:
example: 600
type: integer
X-RateLimit-Remaining:
description: Same as RateLimit-Remaining, for clients that read the X- convention.
schema:
example: 598
type: integer
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
example: 42
type: integer
Idempotent-Replayed:
description: true when this response is the stored answer to an earlier request with the same Idempotency-Key.
schema:
type: boolean
RateLimit-Policy:
description: 'The quota that applies to this caller, as a structured field: `"<name>";q=<requests>;w=<window seconds>` (draft-ietf-httpapi-ratelimit-headers).'
schema:
example: '"token";q=600;w=60'
type: string
X-RateLimit-Limit:
description: Same as RateLimit-Limit, for clients that read the X- convention.
schema:
example: 600
type: integer
responses:
TooManyRequests:
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
description: Too many requests. Wait the number of seconds in Retry-After, or until the RateLimit window resets, then retry.
headers:
RateLimit:
$ref: '#/components/headers/RateLimit'
RateLimit-Limit:
$ref: '#/components/headers/RateLimit-Limit'
RateLimit-Policy:
$ref: '#/components/headers/RateLimit-Policy'
RateLimit-Remaining:
$ref: '#/components/headers/RateLimit-Remaining'
RateLimit-Reset:
$ref: '#/components/headers/RateLimit-Reset'
Retry-After:
$ref: '#/components/headers/Retry-After'
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
schemas:
CreateWebhookResponse:
properties:
webhook:
$ref: '#/components/schemas/Webhook'
title: The created webhook
title: CreateWebhookResponse represents the response after creating a webhook
type: object
WebhooksServiceUpdateBody:
properties:
endpointUrl:
title: The URL endpoint that will receive webhook POST requests
type: string
linkId:
description: 'Filter webhook notifications by a specific link ID.
Only events from this link will trigger webhook notifications.
If empty, all links in the workspace will trigger notifications.'
type: string
name:
title: The name of the webhook
type: string
source:
$ref: '#/components/schemas/WebhookSource'
title: Source of the webhook - indicates whether created manually or via integration
status:
$ref: '#/components/schemas/WebhookStatus'
title: Current status of the webhook
triggers:
description: 'Filter webhook notifications by workflow step kinds.
Only workflow steps matching these kinds will trigger webhook notifications.
If empty, all workflow step kinds will trigger notifications.'
items:
description: "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps"
enum:
- KIND_UNSPECIFIED
- KIND_ENTRY
- KIND_EXIT
- KIND_INTERACTION
- KIND_CONDITION
type: array
title: UpdateWebhookRequest represents the request to update a webhook
type: object
CreateWebhookRequest:
properties:
endpointUrl:
title: The URL endpoint that will receive webhook POST requests
type: string
linkId:
description: 'Filter webhook notifications by a specific link ID.
Only events from this link will trigger webhook notifications.
If empty, all links in the workspace will trigger notifications.'
type: string
name:
title: The name of the webhook
type: string
source:
$ref: '#/components/schemas/WebhookSource'
title: Source of the webhook - indicates creation method (optional, defaults to LINKBREAKERS for manual dashboard creation)
triggers:
description: 'Filter webhook notifications by workflow step kinds.
Only workflow steps matching these kinds will trigger webhook notifications.
If empty, all workflow step kinds will trigger notifications.'
items:
description: "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps"
enum:
- KIND_UNSPECIFIED
- KIND_ENTRY
- KIND_EXIT
- KIND_INTERACTION
- KIND_CONDITION
type: array
required:
- name
- endpointUrl
title: CreateWebhookRequest represents the request to create a new webhook
type: object
ErrorResponse:
properties:
code:
description: HTTP status code
format: int32
type: integer
codeType:
default: UNKNOWN
description: Custom error code type
type: string
details:
description: Additional error details
items:
type: object
type: array
message:
description: Error message
type: string
required:
- code
- codeType
- message
- details
type: object
GetWebhookResponse:
properties:
webhook:
$ref: '#/components/schemas/Webhook'
title: Webhook details
title: GetWebhookResponse represents the response containing a webhook
type: object
WebhookStatus:
default: WEBHOOK_STATUS_UNSPECIFIED
description: "- WEBHOOK_STATUS_UNSPECIFIED: Webhook status not specified\n - WEBHOOK_STATUS_ACTIVE: Webhook is active and receiving events\n - WEBHOOK_STATUS_DISABLED: Webhook is disabled due to repeated failures\n - WEBHOOK_STATUS_PAUSED: Webhook is paused by user action"
enum:
- WEBHOOK_STATUS_UNSPECIFIED
- WEBHOOK_STATUS_ACTIVE
- WEBHOOK_STATUS_DISABLED
- WEBHOOK_STATUS_PAUSED
title: The status of a webhook
type: string
ListWebhooksResponse:
properties:
nextPageToken:
description: Cursor to continue listing webhooks. Empty on the last page.
type: string
totalCount:
description: 'How many records exist in total, so a client can tell a complete answer
from a page of one. A local-first client reads absence from this list as
deletion, and may only do so when the count it was given matches what it
received: without that, one page would look like the whole model and
everything beyond it would be removed locally.'
format: int64
type: integer
webhooks:
items:
$ref: '#/components/schemas/Webhook'
type: object
title: Webhooks scoped to the calling workspace
type: array
title: ListWebhooksResponse returns the webhook inventory for management screens
type: object
WebhookSource:
default: WEBHOOK_SOURCE_UNSPECIFIED
description: "- WEBHOOK_SOURCE_UNSPECIFIED: Webhook source not specified (defaults to LINKBREAKERS)\n - WEBHOOK_SOURCE_LINKBREAKERS: Webhook created manually through the Linkbreakers dashboard/platform\n - WEBHOOK_SOURCE_MAKE: Webhook created automatically via Make.com integration\n - WEBHOOK_SOURCE_ZAPIER: Webhook created automatically via Zapier integration"
enum:
- WEBHOOK_SOURCE_UNSPECIFIED
- WEBHOOK_SOURCE_LINKBREAKERS
- WEBHOOK_SOURCE_MAKE
- WEBHOOK_SOURCE_ZAPIER
title: "The source of a webhook - indicates whether the webhook was created manually \nthrough the Linkbreakers dashboard or automatically via an integration platform such as Make.com or Zapier"
type: string
UpdateWebhookResponse:
properties:
webhook:
$ref: '#/components/schemas/Webhook'
title: The updated webhook
title: UpdateWebhookResponse represents the response after updating a webhook
type: object
Webhook:
description: 'Describes a webhook endpoint that receives event notifications when specified conditions are met,
providing real-time integration capabilities for external systems.'
externalDocs:
description: Learn more about webhooks in Linkbreakers
url: https://linkbreakers.com/help/article/how-do-webhooks-work-in-linkbreakers
properties:
createdAt:
format: date-time
readOnly: true
title: The timestamp when the webhook was created
type: string
createdBy:
example: 123e4567-e89b-12d3-a456-426614174000
title: The member who created the webhook (UUID)
type: string
endpointUrl:
example: https://api.example.com/webhooks/linkbreakers
title: The URL endpoint that will receive webhook POST requests
type: string
failureCount:
format: int64
readOnly: true
title: Count of failed webhook deliveries
type: integer
id:
example: d22f7bf1-83a9-4f3a-9b37-9a3a21b6ac11
title: The unique identifier of the webhook (UUID)
type: string
lastDeliveredAt:
description: 'The timestamp when the webhook was last successfully delivered to the endpoint.
This field is only updated when the webhook endpoint responds with a 2xx status code.
Use this to track actual successful event notifications to external systems.'
format: date-time
readOnly: true
type: string
lastSentAt:
description: 'The timestamp when the webhook was last triggered (attempted), regardless of success or failure.
This field is updated on every webhook transmission attempt, including failed deliveries.
Use this to track webhook activity and debugging transmission issues.'
format: date-time
readOnly: true
type: string
linkId:
description: 'Filter webhook notifications by a specific link ID.
Only events from this link will trigger webhook notifications.
If empty, all links in the workspace will trigger notifications.'
example: d22f7bf1-83a9-4f3a-9b37-9a3a21b6ac11
type: string
name:
example: Production Event Notifications
title: The name of the webhook
type: string
source:
$ref: '#/components/schemas/WebhookSource'
example: WEBHOOK_SOURCE_LINKBREAKERS
title: "Source of the webhook - indicates whether it was created manually through \nthe dashboard or automatically via an integration platform"
status:
$ref: '#/components/schemas/WebhookStatus'
example: WEBHOOK_STATUS_ACTIVE
title: Current status of the webhook
successCount:
format: int64
readOnly: true
title: Count of successful webhook deliveries
type: integer
triggers:
description: 'Filter webhook notifications by workflow step kinds.
Only workflow steps matching these kinds will trigger webhook notifications.
If empty, all workflow step kinds will trigger notifications.'
example:
- KIND_ENTRY
- KIND_EXIT
items:
description: "- KIND_UNSPECIFIED: Workflow step kind not specified\n - KIND_ENTRY: Entry steps are automatically triggered when a visitor reaches the workflow\n - KIND_EXIT: Exit steps finalize the workflow (commonly a redirect)\n - KIND_INTERACTION: Interaction steps require visitor input (forms, passwords, etc.)\n - KIND_CONDITION: Condition steps evaluate logic and route to different next steps"
enum:
- KIND_UNSPECIFIED
- KIND_ENTRY
- KIND_EXIT
- KIND_INTERACTION
- KIND_CONDITION
type: array
updatedAt:
format: date-time
readOnly: true
title: The timestamp when the webhook was last updated
type: string
workspaceId:
example: c0d3cafe-5b1e-4d42-a6fd-0c5f5c3962d0
title: The workspace ID the webhook belongs to (UUID)
type: string
title: Webhook
type: object
securitySchemes:
bearerAuth:
bearerFormat: JWT
description: JWT Bearer token authentication. Use a workspace API token obtained from the Linkbreakers dashboard. When using the SDK, pass this token to the `accessToken` field in the Configuration constructor (not `apiKey`). A token has full access or a list of scopes; each operation lists the one scope it requires, and a write scope also grants the read scope of the same resource. GET /v1/api-scopes lists every scope.
scheme: bearer
type: http
oauth2:
description: OAuth 2.0 authorization code flow with PKCE and dynamic client registration. Request only the scopes you need. The scope names are the same ones workspace API tokens hold.
flows:
authorizationCode:
authorizationUrl: https://mcp.linkbreakers.com/oauth/authorize
refreshUrl: https://mcp.linkbreakers.com/oauth/token
scopes:
analytics:read: Read events, metrics, time series, analytics data and dashboards.
analytics:write: Create, update and delete analytics dashboards and generate widget summaries.
assistant:read: Read the Assistant conversation.
assistant:write: Send files to the Assistant, clear the conversation and contact support.
billing:write: Open checkout, credit top-up and billing portal sessions.
domains:read: Read custom domains and their DNS instructions.
domains:write: Add, verify, update and delete custom domains.
integrations:read: Read the Slack and Google Forms integrations.
integrations:write: Connect, configure, test, sync and disconnect the Slack and Google Forms integrations.
links:read: Read links, their QR code images, tags, folders and link settings.
links:write: Create, update and delete links, tags, folders and link settings.
mcp:tools: Full access, including scopes added later.
media:read: Read uploaded media.
media:write: Upload and delete media.
members:read: Read workspace members.
members:write: Update, revoke, sign out and remove members. Inviting a member or changing a sign-in email or password needs full access.
page_themes:read: Read page themes and page theme templates.
page_themes:write: Change page themes and create, publish and delete page theme templates.
qrcodes:read: Read QR code designs and QR code templates.
qrcodes:write: Change QR code designs and create, publish and delete QR code templates.
tokens:read: Read API tokens and their scopes, never their secrets.
tokens:write: Create, update and delete API tokens, limited to the scopes the calling token holds.
visitors:read: Read and search visitors and their attributes.
visitors:write: Identify, update and delete visitors and their attributes.
webhooks:read: Read webhooks.
webhooks:write: Create, update and delete webhooks.
workflows:read: Read the workflow steps behind a link and validate them.
workflows:write: Create, connect, update, lay out and delete workflow steps.
workspace:read: Read the workspace and its settings.
workspace:write: Update the workspace, request enrollment and delete the workspace.
tokenUrl: https://mcp.linkbreakers.com/oauth/token
type: oauth2