Feathery Forms API

Form creation and management

OpenAPI Specification

feathery-forms-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Feathery REST Account Forms API
  description: 'RESTful API for managing forms, fields, submissions, documents, end users, and workflows. Feathery is an enterprise form SDK and AI-driven data intake platform purpose-built for financial services including insurance and wealth management. Supports multi-region deployments across US, Canada, Europe, and Australia with token-based authentication.

    '
  version: 1.0.0
  contact:
    url: https://www.feathery.io
  license:
    name: Proprietary
servers:
- url: https://api.feathery.io
  description: US (default)
- url: https://api-ca.feathery.io
  description: Canada
- url: https://api-eu.feathery.io
  description: Europe
- url: https://api-au.feathery.io
  description: Australia
security:
- TokenAuth: []
tags:
- name: Forms
  description: Form creation and management
paths:
  /api/form/:
    get:
      operationId: listForms
      summary: List all forms
      description: Retrieve a list of all forms.
      tags:
      - Forms
      parameters:
      - $ref: '#/components/parameters/PageSize'
      - $ref: '#/components/parameters/Page'
      - name: tags
        in: query
        schema:
          type: string
        description: Filter by tags (comma-separated)
      responses:
        '200':
          description: List of forms
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedForms'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createForm
      summary: Create form from template
      description: Create a new form from a template.
      tags:
      - Forms
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - name
              properties:
                name:
                  type: string
                  description: Name of the new form
                template_id:
                  type: string
                  description: Template ID to create from
                tags:
                  type: array
                  items:
                    type: string
                  description: Tags for the form
      responses:
        '201':
          description: Form created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Form'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/form/{form_id}/:
    get:
      operationId: getForm
      summary: Retrieve form schema
      description: Retrieve the full schema for a specific form.
      tags:
      - Forms
      parameters:
      - $ref: '#/components/parameters/FormId'
      responses:
        '200':
          description: Form schema
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FormDetail'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateForm
      summary: Update form properties
      description: Update properties of a specific form.
      tags:
      - Forms
      parameters:
      - $ref: '#/components/parameters/FormId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: New name for the form
                active:
                  type: boolean
                  description: Whether the form is active
                tags:
                  type: array
                  items:
                    type: string
                  description: Updated tags
      responses:
        '200':
          description: Form updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Form'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteForm
      summary: Delete form
      description: Delete a specific form.
      tags:
      - Forms
      parameters:
      - $ref: '#/components/parameters/FormId'
      responses:
        '204':
          description: Form deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/form/copy/:
    post:
      operationId: copyForm
      summary: Duplicate form
      description: Create a copy of an existing form.
      tags:
      - Forms
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - form_id
              properties:
                form_id:
                  type: string
                  description: ID of the form to duplicate
                name:
                  type: string
                  description: Name for the duplicated form
      responses:
        '201':
          description: Form duplicated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Form'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/form/submission/:
    get:
      operationId: listSubmissions
      summary: List form submissions
      description: Retrieve a list of form submissions.
      tags:
      - Forms
      parameters:
      - $ref: '#/components/parameters/PageSize'
      - $ref: '#/components/parameters/Page'
      - name: form_id
        in: query
        schema:
          type: string
        description: Filter submissions by form ID
      - name: completed
        in: query
        schema:
          type: boolean
        description: Filter by completion status
      - $ref: '#/components/parameters/StartTime'
      - $ref: '#/components/parameters/EndTime'
      - name: fields
        in: query
        schema:
          type: string
        description: Comma-separated list of fields to include
      - name: sort
        in: query
        schema:
          type: string
        description: Sort order for results
      responses:
        '200':
          description: List of form submissions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedSubmissions'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createSubmission
      summary: Create/update form submissions
      description: Create or update form submissions.
      tags:
      - Forms
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmissionInput'
      responses:
        '200':
          description: Submission created or updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Submission'
        '201':
          description: Submission created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Submission'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/form/submission/pdf/:
    post:
      operationId: exportSubmissionPdf
      summary: Export submission as PDF
      description: Export a form submission as a PDF document.
      tags:
      - Forms
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - submission_id
              properties:
                submission_id:
                  type: string
                  description: Submission ID to export
      responses:
        '200':
          description: PDF generated successfully
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  parameters:
    FormId:
      name: form_id
      in: path
      required: true
      schema:
        type: string
      description: Unique form identifier
    EndTime:
      name: end_time
      in: query
      schema:
        type: string
        format: date-time
      description: Filter results up to this datetime
    StartTime:
      name: start_time
      in: query
      schema:
        type: string
        format: date-time
      description: Filter results from this datetime
    PageSize:
      name: page_size
      in: query
      schema:
        type: integer
        maximum: 1000
        default: 100
      description: Number of results per page (max 1000)
    Page:
      name: page
      in: query
      schema:
        type: integer
        default: 1
      description: Page number
  schemas:
    SubmissionValue:
      type: object
      properties:
        id:
          type: string
          description: Field identifier
        type:
          type: string
          description: Field type
        value:
          description: Submitted value (type varies by field type)
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    LogicRule:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: Logic rule identifier
        name:
          type: string
          description: Rule name
        description:
          type: string
          description: Rule description
        trigger_event:
          type: string
          enum:
          - change
          - load
          - form_complete
          - submit
          - error
          - view
          - action
          description: Event that triggers the rule
        index:
          type: number
          description: Execution order index
        steps:
          type: array
          items:
            type: string
          nullable: true
          description: Step IDs (for submit/load triggers)
        elements:
          type: array
          items:
            type: string
          nullable: true
          description: Element IDs (for change/error/view/action triggers)
        code:
          type: object
          additionalProperties: true
          description: Executable rule definition
        enabled:
          type: boolean
          description: Whether the rule is enabled
        valid:
          type: boolean
          description: Whether the rule is valid
        mode:
          type: string
          enum:
          - code_editor
          - no-code
          description: Rule editing mode
    FormDetail:
      allOf:
      - $ref: '#/components/schemas/Form'
      - type: object
        properties:
          steps:
            type: array
            items:
              $ref: '#/components/schemas/FormStep'
            description: Form steps
          logic_rules:
            type: array
            items:
              $ref: '#/components/schemas/LogicRule'
            description: Logic rules
          integrations:
            type: array
            items:
              type: object
              additionalProperties: true
            description: Integrations configured for the form
    Error:
      type: object
      properties:
        detail:
          type: string
          description: Error detail message
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
          description: Field-level validation errors
    SubmissionInput:
      type: object
      properties:
        form_id:
          type: string
          description: Form identifier
        user_id:
          type: string
          description: User identifier
        field_values:
          type: object
          additionalProperties: true
          description: Field ID to value mapping
        completed:
          type: boolean
          description: Whether to mark the submission as completed
    PaginatedSubmissions:
      allOf:
      - $ref: '#/components/schemas/PaginatedResponse'
      - type: object
        properties:
          results:
            type: array
            items:
              $ref: '#/components/schemas/Submission'
    PaginatedResponse:
      type: object
      properties:
        count:
          type: integer
          description: Total number of available records
        next:
          type: string
          format: uri
          nullable: true
          description: URL for the next page
        previous:
          type: string
          format: uri
          nullable: true
          description: URL for the previous page
        total_pages:
          type: integer
          description: Total number of pages
        current_page:
          type: integer
          description: Current page number
    Field:
      type: object
      properties:
        id:
          type: string
          description: Field identifier
        internal_id:
          type: string
          format: uuid
          description: Internal field identifier
        type:
          type: string
          enum:
          - text_field
          - integer_field
          - decimal_field
          - date_field
          - checkbox
          - dropdown
          - radio_button
          - file_upload
          - signature
          - matrix
          - phone_number
          - email
          description: Field type
        required:
          type: boolean
          description: Whether the field is required
        placeholder:
          type: string
          description: Field placeholder text
        display_text:
          type: string
          description: Label displayed to the user
        max_length:
          type: integer
          nullable: true
          description: Maximum input length
        min_length:
          type: integer
          nullable: true
          description: Minimum input length
        metadata:
          type: object
          additionalProperties: true
          description: Additional metadata including options and validation rules
        repeated:
          type: boolean
          description: Whether the field can be repeated
        repeat_trigger:
          type: string
          nullable: true
          description: Trigger for field repetition
    FormStep:
      type: object
      properties:
        id:
          type: string
          description: Step identifier
        internal_id:
          type: string
          format: uuid
          description: Internal step identifier
        origin:
          type: boolean
          description: Whether this is the first step
        images:
          type: array
          items:
            type: object
          description: Images on the step
        videos:
          type: array
          items:
            type: object
          description: Videos on the step
        texts:
          type: array
          items:
            type: object
          description: Text elements on the step
        buttons:
          type: array
          items:
            type: object
          description: Buttons on the step
        fields:
          type: array
          items:
            $ref: '#/components/schemas/Field'
          description: Fields on the step
    Submission:
      type: object
      properties:
        values:
          type: array
          items:
            $ref: '#/components/schemas/SubmissionValue'
          description: Submitted field values
        user_id:
          type: string
          description: User identifier
        submission_start:
          type: string
          format: date-time
          description: When the submission was started
        last_submitted:
          type: string
          format: date-time
          description: When the submission was last updated
    Form:
      type: object
      properties:
        id:
          type: string
          description: Form identifier
        name:
          type: string
          description: Form name
        active:
          type: boolean
          description: Whether the form is active
        internal_id:
          type: string
          format: uuid
          description: Workspace-specific internal identifier
        tags:
          type: array
          items:
            type: string
          description: Form tags
        created_at:
          type: string
          format: date-time
          description: Creation timestamp
        updated_at:
          type: string
          format: date-time
          description: Last update timestamp
    PaginatedForms:
      allOf:
      - $ref: '#/components/schemas/PaginatedResponse'
      - type: object
        properties:
          results:
            type: array
            items:
              $ref: '#/components/schemas/Form'
  responses:
    Unauthorized:
      description: Unauthorized - invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    TokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: 'Token-based authentication. Format: Token <API KEY>'