Clipform Dynamic Links API

Create and manage re-pointable links whose target form can be swapped without changing the printed or embedded URL.

GitHub OpenAPI

Operations 5

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/clipform-io:clipform-io-dynamic-links-api"
All apis
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.

Get an API 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 Specification

clipform-io-dynamic-links-api-openapi.yml Raw ↑
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