> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.hellotracks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update a form template

> Changes the template's fields (content), title, description or status. Sending content replaces all fields. An unknown, foreign or deleted id is answered with 400 invalid_request. Admins, operators and the company key only; workers get 403 permission_denied.



## OpenAPI

````yaml v1/openapi.json PATCH /forms/templates/{id}
openapi: 3.1.0
info:
  title: Hellotracks REST API
  version: '1'
  description: >-
    Plain REST resources over HTTPS, for tools, automations and services. The ht
    command line is built on it.
  contact:
    email: api@hellotracks.com
servers:
  - url: https://api.hellotracks.com/v1
security:
  - ApiKey: []
tags:
  - name: Sign-up and sign-in
    description: >-
      Create a company or get an API key by an emailed code, without a key; and
      check which account a key belongs to.
  - name: Company
    description: The company the API key belongs to, with its settings and teams.
  - name: Members
    description: 'The people in the company: admins, operators and workers.'
  - name: API keys
    description: 'The company''s API keys: list, create, revoke and delete.'
  - name: Jobs
    description: 'Jobs: work at a location on a date, assigned to a member.'
  - name: Places
    description: 'Places: customer sites and other saved locations with a check-in radius.'
  - name: Zones
    description: 'Zones: the company''s geofences.'
  - name: Routing
    description: Route optimization for one member's day.
  - name: ETA pages
    description: >-
      Live ETA pages (eta.page links) that show a job's recipient when the
      worker arrives.
  - name: Maps
    description: Rendered maps as GeoJSON, and public map share links.
  - name: Timesheets
    description: Clock-in and clock-out entries of members, with totals, and editing them.
  - name: Forms
    description: >-
      Form templates, submitted forms, attachments for file and image fields,
      and forms linked to places and jobs.
  - name: Alerts
    description: >-
      Alert rules (configs) that watch members, places and zones, and the alerts
      (instances) they raised.
  - name: Reports
    description: >-
      Reports: the newer reporting API (catalog, preview, run, saved) and the
      older one (types, generate, jobs, uploads, recurring).
  - name: Webhooks
    description: URLs Hellotracks calls when jobs, check-ins, clock-ins or alerts happen.
paths:
  /forms/templates/{id}:
    patch:
      tags:
        - Forms
      summary: Update a form template
      description: >-
        Changes the template's fields (content), title, description or status.
        Sending content replaces all fields. An unknown, foreign or deleted id
        is answered with 400 invalid_request. Admins, operators and the company
        key only; workers get 403 permission_denied.
      operationId: updateFormTemplate
      parameters:
        - name: id
          in: path
          required: true
          description: Form template id (UUID).
          schema:
            type: string
          example: 3f2b8c1e-0000-4000-8000-000000000001
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FormTemplateInput'
            example:
              title: Site check (v2)
              status: archived
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Envelope'
                properties:
                  data:
                    type: object
                    properties:
                      template:
                        $ref: '#/components/schemas/FormTemplate'
                      items:
                        type: array
                        items:
                          $ref: '#/components/schemas/FormTemplate'
                        description: >-
                          All templates of the company (not deleted) after the
                          change.
              example:
                data:
                  template:
                    id: 3f2b8c1e-0000-4000-8000-000000000001
                    templateId: 3f2b8c1e-0000-4000-8000-000000000001
                    title: Site check
                    submissionId: 0
                    submissionUid: '0'
                    creatorUid: a1b2c3
                    createdTs: 1761900000000
                    updatedTs: 1761900000000
                    updaterUid: a1b2c3
                    status: 1
                    statusText: archived
                    content:
                      id: 3f2b8c1e-0000-4000-8000-000000000001
                      title: Site check
                      description: ''
                      timestamp: 1761900000000
                      content:
                        - type: section
                          name: Arrival
                          options: []
                          value: ''
                          required: false
                          conditionals: []
                        - type: radio
                          name: Site clean
                          options:
                            - 'Yes'
                            - 'No'
                          value: ''
                          required: true
                          conditionals:
                            - equalsTo: 'No'
                              content:
                                - type: paragraph
                                  name: What was wrong
                                  options: []
                                  value: ''
                                  required: true
                        - type: image
                          name: Photo
                          options: []
                          value: ''
                          required: false
                          conditionals: []
                    fieldCount: 3
                    requiredCount: 2
                  items: []
                error: null
                meta:
                  path: /v1/forms/templates/3f2b8c1e-0000-4000-8000-000000000001
                  method: PATCH
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/ServerError'
components:
  schemas:
    FormTemplateInput:
      type: object
      additionalProperties: false
      description: >-
        content is either a FormContent object (then the top-level title,
        description and timestamp are ignored) or just the array of fields (then
        title, description and timestamp are taken from the top level). Required
        on create. On update, title or description alone change only those. id
        is accepted but ignored; a new template always gets a new UUID.
      properties:
        id:
          type: string
        title:
          type: string
        description:
          type: string
        timestamp:
          type: integer
          format: int64
        content:
          oneOf:
            - $ref: '#/components/schemas/FormContent'
            - type: array
              items:
                $ref: '#/components/schemas/FormItem'
        status:
          oneOf:
            - type: string
              enum:
                - active
                - normal
                - archived
                - deleted
            - type: integer
              enum:
                - 0
                - 1
                - 2
          description: Default active.
    Envelope:
      type: object
      properties:
        data:
          description: The payload.
        error:
          type: 'null'
        meta:
          $ref: '#/components/schemas/Meta'
    FormTemplate:
      type: object
      properties:
        id:
          type: string
          description: Template id (UUID).
        templateId:
          type: string
          description: Same as id.
        title:
          type: string
        submissionId:
          type: integer
          description: 0 for a template.
        submissionUid:
          type: string
        creatorUid:
          type: string
        createdTs:
          type: integer
          format: int64
          description: Milliseconds since the epoch.
        updatedTs:
          type: integer
          format: int64
          description: Milliseconds since the epoch.
        updaterUid:
          type: string
        status:
          type: integer
          enum:
            - 0
            - 1
            - 2
          description: 0 active, 1 archived, 2 deleted.
        statusText:
          type: string
          enum:
            - active
            - archived
            - deleted
            - unknown
        content:
          $ref: '#/components/schemas/FormContent'
        fieldCount:
          type: integer
          description: Input fields, follow-ups included.
        requiredCount:
          type: integer
    FormContent:
      type: object
      properties:
        id:
          type: string
          description: The template id (set by the server).
        title:
          type: string
        description:
          type: string
        timestamp:
          type: integer
          format: int64
          description: Milliseconds since the epoch.
        content:
          type: array
          items:
            $ref: '#/components/schemas/FormItem'
    FormItem:
      type: object
      description: >-
        One field of a form. form_title, form_description, section and label are
        headers without a value.
      required:
        - type
      properties:
        type:
          type: string
          enum:
            - form_title
            - form_description
            - section
            - label
            - text
            - paragraph
            - checkbox
            - number
            - decimal
            - radio
            - dropdown
            - file
            - image
            - signature
          description: Case-insensitive on input.
        name:
          type: string
          description: >-
            Required for input fields; unique (case-insensitive) within a
            template. Also the question text.
        label:
          type: string
          description: Accepted on input but not stored.
        options:
          type: array
          items:
            type: string
          description: Choices; required for radio and dropdown.
        value:
          description: >-
            The answer (empty in a template). For file and image fields, the
            value from POST /forms/attachments.
        required:
          type: boolean
          default: false
        minAnswers:
          type: integer
          minimum: 0
          description: 'Sections only: how many questions of the section must be answered.'
        index:
          type: integer
          description: Accepted on input but not stored.
        conditionals:
          type: array
          description: >-
            Follow-up fields shown when this field's value equals equalsTo
            (number, decimal, checkbox, radio, dropdown only).
          items:
            type: object
            additionalProperties: false
            properties:
              equalsTo:
                type: string
              content:
                type: array
                items:
                  $ref: '#/components/schemas/FormItem'
    Meta:
      type: object
      properties:
        path:
          type: string
          description: The request path, without /v1.
          example: /jobs
        method:
          type: string
          example: GET
    ErrorEnvelope:
      type: object
      properties:
        data:
          type: 'null'
        error:
          $ref: '#/components/schemas/Error'
        meta:
          $ref: '#/components/schemas/Meta'
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: Stable error code for programs.
          enum:
            - invalid_request
            - invalid_format
            - invalid_data
            - invalid_api_key
            - unknown_user
            - authentication_failed
            - forbidden
            - not_found
            - already_exists
            - throttled
            - not_ready
            - clock_invalid
            - force_logout
            - internal_error
            - unknown_error
        message:
          type: string
          description: Why it failed, for people.
  responses:
    BadRequest:
      description: The request is invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            data: null
            error:
              code: invalid_request
              message: date must be YYYY-MM-DD
            meta:
              path: /jobs
              method: GET
    Unauthorized:
      description: The API key is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            data: null
            error:
              code: invalid_api_key
              message: Invalid Hellotracks API key.
            meta:
              path: /jobs
              method: GET
    Forbidden:
      description: The key may not do this.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            data: null
            error:
              code: forbidden
              message: No permission.
            meta:
              path: /jobs
              method: GET
    TooManyRequests:
      description: Too many requests; slow down.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            data: null
            error:
              code: throttled
              message: Too many requests.
            meta:
              path: /jobs
              method: GET
    ServerError:
      description: Hellotracks failed; retry later.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            data: null
            error:
              code: internal_error
              message: Hellotracks API is temporarily unavailable.
            meta:
              path: /jobs
              method: GET
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: API-Key
      description: >-
        Your API key, from More → API & Integrations in the dashboard, or from
        ht signup / ht auth login.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.