Clipform Dynamic Links API
Create and manage re-pointable links whose target form can be swapped without changing the printed or embedded URL.
Create and manage re-pointable links whose target form can be swapped without changing the printed or embedded URL.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/clipform-io:clipform-io-dynamic-links-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Clipform Io Dynamic Links API
version: 1.0.0
contact:
name: Clipform
url: https://clipform.io
email: support@clipform.io
termsOfService: https://clipform.io/terms
description: 'Operations tagged dynamic-links across 2 of this provider''s published API definitions: api.clipform.io_openapi.json, clipform-io-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.clipform.io/v1
description: Production
x-internal: false
tags:
- name: dynamic-links
x-displayName: Dynamic Links
description: Create and manage re-pointable links whose target form can be swapped without changing the printed or embedded URL.
paths:
/workspaces/{workspaceId}/dynamic-links:
get:
operationId: listDynamicLinks
tags:
- dynamic-links
summary: List dynamic links
description: Lists a workspace's dynamic links, oldest first, including any orphaned by a deleted form.
parameters:
- name: workspaceId
in: path
required: true
schema:
type: string
format: uuid
maxLength: 36
- name: unattached
in: query
required: false
description: Set to "true" to return only unattached (free) links with no form_id; any other value or omission lists all.
schema:
type: string
maxLength: 10
security:
- bearerAuth: []
responses:
'200':
description: Dynamic links
content:
application/json:
schema:
type: object
properties:
dynamic_links:
type: array
items:
$ref: '#/components/schemas/DynamicLink'
maxItems: 500
'429':
$ref: '#/components/responses/RateLimited'
post:
operationId: createDynamicLink
tags:
- dynamic-links
summary: Create a dynamic link
description: Creates a dynamic link, either free or pointed at a form in the workspace, minting a repointable public id.
parameters:
- name: workspaceId
in: path
required: true
schema:
type: string
format: uuid
maxLength: 36
security:
- bearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- name
properties:
name:
type: string
maxLength: 100
form_id:
type: string
format: uuid
maxLength: 36
nullable: true
responses:
'201':
description: Dynamic link created
content:
application/json:
schema:
$ref: '#/components/schemas/DynamicLink'
'400':
description: Missing/invalid name, or form_id is not a valid UUID
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: The workspace's plan does not include dynamic links
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: form_id does not belong to this workspace
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: A dynamic link with that name already exists
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://api.clipform.io/v1
description: Production
x-internal: false
/workspaces/{workspaceId}/dynamic-links/{publicId}:
put:
operationId: updateDynamicLink
tags:
- dynamic-links
summary: Update a dynamic link
description: Renames, attaches, repoints, or detaches (form_id null) a dynamic link, the primitive for swapping the destination behind a fixed printed URL.
parameters:
- name: workspaceId
in: path
required: true
schema:
type: string
format: uuid
maxLength: 36
- name: publicId
in: path
required: true
schema:
type: string
maxLength: 20
security:
- bearerAuth: []
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
maxLength: 100
form_id:
type: string
format: uuid
maxLength: 36
nullable: true
description: A form id to attach/repoint, or null to detach and leave the link free.
slug:
type: string
nullable: true
pattern: ^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$
maxLength: 63
description: Sets the vanity path on the workspace's custom domain, or null to clear it. Rejects a reserved framework/runtime path.
responses:
'200':
description: Dynamic link updated
content:
application/json:
schema:
$ref: '#/components/schemas/DynamicLink'
'400':
description: Invalid name/form_id
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: Dynamic link (or the target form_id) not found in this workspace
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: A dynamic link with that name already exists
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
$ref: '#/components/responses/RateLimited'
delete:
operationId: deleteDynamicLink
tags:
- dynamic-links
summary: Delete a dynamic link
description: Deletes a dynamic link, immediately breaking any printed or embedded URL built from it.
parameters:
- name: workspaceId
in: path
required: true
schema:
type: string
format: uuid
maxLength: 36
- name: publicId
in: path
required: true
schema:
type: string
maxLength: 20
security:
- bearerAuth: []
responses:
'200':
description: Deleted
content:
application/json:
schema:
type: object
properties:
deleted:
type: boolean
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://api.clipform.io/v1
description: Production
x-internal: false
/dynamic-links/public/{publicId}:
get:
operationId: resolveDynamicLink
tags:
- dynamic-links
summary: Resolve a dynamic link
description: Resolves a dynamic link's public id to the share id of the form it currently points at.
security: []
parameters:
- name: publicId
in: path
required: true
schema:
type: string
maxLength: 20
- name: host
in: query
required: false
description: The custom domain a respondent is viewing the form on; scopes resolution to that domain's workspace.
schema:
type: string
maxLength: 253
responses:
'200':
description: The resolved form
content:
application/json:
schema:
type: object
properties:
share_id:
type: string
maxLength: 2000
form_id:
type: string
format: uuid
maxLength: 36
'404':
description: Unknown dynamic link, its target form is not live, or the link does not belong to the given host's workspace
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
$ref: '#/components/responses/RateLimited'
servers:
- url: https://api.clipform.io/v1
description: Production
x-internal: false
components:
schemas:
Error:
type: object
description: Standard error envelope returned by every failed request.
required:
- code
- error
properties:
code:
type: string
description: Machine-readable error code. Keep in lockstep with the ErrorCode union in apps/api/src/lib/errors.ts (source of truth).
enum:
- VALIDATION_ERROR
- UNKNOWN_SESSION
- RATE_LIMITED
- UNAUTHORIZED
- FORBIDDEN
- NOT_FOUND
- INTERNAL_ERROR
- RENDER_FAILED
- PAYMENT_ERROR
- BOOKING_ERROR
- PLAN_LIMIT
- RESPONSE_LIMIT
- CONFLICT
error:
type: string
description: Human-readable error message.
maxLength: 2000
details:
description: 'Optional structured detail; present on some validation errors. The fallback 401 ("Authentication required...") carries `details.reason` for a rejected Bearer session token: `no_token`, `token_rejected`, `auth_unavailable`, `not_a_member`, `no_workspace`, `membership_lookup_failed`, or `not_evaluated`, plus `auth_code` and `auth_status` when the auth provider returned them.'
DynamicLink:
type: object
properties:
id:
type: string
format: uuid
maxLength: 36
public_id:
type: string
description: Opaque 8-character hex handle, repointable to a different form_id without changing this value.
maxLength: 20
name:
type: string
maxLength: 100
form_id:
type: string
format: uuid
nullable: true
description: Null when the target form has been deleted (an orphaned link, still listed and repointable).
maxLength: 36
slug:
type: string
nullable: true
pattern: ^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$
maxLength: 63
description: Vanity path on the workspace's active custom domain (forms.acme.com/<slug>). Null until set.
form:
type: object
nullable: true
description: Present in list responses only.
properties:
share_id:
type: string
nullable: true
maxLength: 2000
title:
type: string
nullable: true
maxLength: 2000
created_at:
type: string
format: date-time
maxLength: 30
updated_at:
type: string
format: date-time
maxLength: 30
responses:
RateLimited:
description: Rate limit exceeded.
headers:
Access-Control-Allow-Origin:
description: CORS origin permitted to read the response.
schema:
type: string
maxLength: 2048
example: '*'
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
format: int32
minimum: 0
maximum: 86400
example: 42
RateLimit-Limit:
description: Request quota for the current window.
schema:
type: integer
format: int32
minimum: 0
maximum: 1000000
example: 60
RateLimit-Remaining:
description: Requests remaining in the current window.
schema:
type: integer
format: int32
minimum: 0
maximum: 1000000
example: 0
RateLimit-Reset:
description: Seconds until the current window resets.
schema:
type: integer
format: int32
minimum: 0
maximum: 86400
example: 42
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: API key (cf_*) passed as Bearer token
oauth2:
type: oauth2
description: Authorization-code OAuth for installed apps acting on a user's workspace. Access tokens (cf_at_*) are passed as Bearer tokens and authorize the Integrations operations. They are opaque, single-audience, server-side records. Client credentials are issued per app - contact support@clipform.io.
flows:
authorizationCode:
authorizationUrl: https://api.clipform.io/oauth/authorize
tokenUrl: https://api.clipform.io/oauth/token
refreshUrl: https://api.clipform.io/oauth/token
scopes:
forms:read: Read the workspace's forms.
responses:read: Read the workspace's form responses.
webhooks:manage: Subscribe and unsubscribe webhook endpoints.
x-refined-from:
- api.clipform.io_openapi.json
- clipform-io-openapi.yml