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

# Apply template to bot

> DEPRECATED: Use `POST /bots/{botId}/templates/{templateId}` instead. Apply a workflow template to a bot by providing values for all required variables. If the template has already been applied to this bot, the existing workflow will be replaced. Each variable can be provided in one of three ways: (1) an inline value (plain string or `{ value }`) that substitutes text directly, (2) `{ value, createOrgVariable: true }` which creates/updates an org variable and keeps the `{{placeholder}}` in the workflow for runtime resolution, or (3) `{ existingOrgVariableId }` which links to a pre-existing org variable by ID. Org-variable-backed placeholders are resolved at runtime, so updating the variable value propagates to all linked workflows automatically.



## OpenAPI

````yaml /openapi/openapi.yaml post /templates/{templateId}/apply
openapi: 3.0.3
info:
  title: Annie API
  description: >
    ### Overview


    The Annie API is a (mostly) RESTful API. Typically, both POST bodies and
    responses are JSON-encoded.


    Note: The documenation is Work In Progress and is subject to change.


    ### Base URL


    The base URL for the Annie API is https://api.helloannie.com/.


    Examples in this document may abbreviate this to `/`.


    ### Versioning


    Routes are prefixed with a version number i.e. `v1`. The version will change
    when there is a non-backwards compatible or other significant change to the
    api.


    ### Authentication


    The Annie API supports two authentication methods API Keys and OAuth Access
    Tokens:


    #### API Keys


    API Keys are long-lived tokens that can be generated from the Developer
    Portal on your organization page. API keys are prefixed with `annie-sk-v2-`
    and can be used directly in the `Authorization` header.


    ```

    curl -H "Authorization: Bearer annie-sk-xxxxx"
    https://api.helloannie.com/...

    ```


    #### OAuth Tokens


    OAuth tokens are short-lived access tokens generated using the OAuth 2.0
    Client Credentials flow (Machine-to-Machine). OAuth clients provide scoped
    permissions and are ideal for server-to-server integrations.


    **Creating an OAuth Client**


    OAuth clients can be created in the Developer Portal on your organization
    page. When creating a client, you'll receive:


    - `client_id`: Your OAuth client identifier

    - `client_secret`: Your OAuth client secret (store this securely)


    **Generating an OAuth Token**


    To generate an OAuth access token, make a POST request to the Annie OAuth
    token endpoint:


    **Endpoint:** `https://annie-external-api.us.auth0.com/oauth/token`


    **Example Request:**


    ```bash

    curl -X POST https://annie-external-api.us.auth0.com/oauth/token \
      -H "Content-Type: application/json" \
      -d '{
        "grant_type": "client_credentials",
        "client_id": "your-client-id",
        "client_secret": "your-client-secret",
        "audience": "https://api.helloannie.com"
      }'
    ```


    The `access_token` from the response should be used in the `Authorization`
    header when making requests to the Annie API:


    ```

    curl -H "Authorization: Bearer eyJhbGciOiJSUzI..."
    https://api.helloannie.com/v1/...

    ```


    ### API Response Structure


    The Annie API returns status codes consistent with standard HTTP
    conventions. Success and Error responses follow the below structure:


    ```

    {
      "success": boolean
      "data": {}
      "message": string // optional
    }

    ```


    ### Rate Limiting


    The Annie API enforces rate limits to ensure stability and fair usage. The
    default rate limit is **60 requests per minute** per organization. This
    limit is applied per endpoint pattern (e.g. `GET /v1/bots/:id`).


    When the rate limit is exceeded, the API responds with HTTP `429 Too Many
    Requests`.


    Response headers include:


    - `X-RateLimit-Limit`: The maximum number of requests allowed in the current
    window.

    - `X-RateLimit-Remaining`: The number of requests remaining in the current
    window.

    - `X-RateLimit-Reset`: The time at which the current rate limit window
    resets (in UTC epoch seconds).


    If you exceed the limit, the response will contain a `Retry-After` header
    indicating how many seconds to wait before retrying.


    ### Pagination


    The Annie API does not currently support pagination. All results are
    returned at once.
  version: v1
servers:
  - url: https://api.helloannie.com/v1
security: []
paths:
  /templates/{templateId}/apply:
    post:
      tags:
        - Templates
      summary: Apply template to bot
      description: >-
        DEPRECATED: Use `POST /bots/{botId}/templates/{templateId}` instead.
        Apply a workflow template to a bot by providing values for all required
        variables. If the template has already been applied to this bot, the
        existing workflow will be replaced. Each variable can be provided in one
        of three ways: (1) an inline value (plain string or `{ value }`) that
        substitutes text directly, (2) `{ value, createOrgVariable: true }`
        which creates/updates an org variable and keeps the `{{placeholder}}` in
        the workflow for runtime resolution, or (3) `{ existingOrgVariableId }`
        which links to a pre-existing org variable by ID. Org-variable-backed
        placeholders are resolved at runtime, so updating the variable value
        propagates to all linked workflows automatically.
      operationId: postV1TemplatesByTemplateIdApply
      parameters:
        - name: templateId
          in: path
          required: true
          schema:
            format: uuid
            type: string
      requestBody:
        description: Request body for applying a template to a bot
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TemplateApplyRequest'
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TemplateApplyRequest'
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/TemplateApplyRequest'
      responses:
        '200':
          description: Response containing the applied template result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TemplateApplyResponse'
        '400':
          description: The request was invalid or malformed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestResponse'
        '403':
          description: You do not have permission to perform this action
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenResponse'
        '404':
          description: The requested resource was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundResponse'
        '409':
          description: The request conflicts with another in-progress operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConflictResponse'
      deprecated: true
components:
  schemas:
    TemplateApplyRequest:
      additionalProperties: false
      type: object
      required:
        - botId
        - variables
      properties:
        botId:
          format: uuid
          description: The bot to apply the template to
          type: string
        variables:
          description: >-
            Variable values keyed by variable name. Each value can be a plain
            string (inline substitution) or an options object.
          example:
            office_name: Happy Dental
            phone_number:
              value: '+15551234567'
              createOrgVariable: true
            office_address:
              existingOrgVariableId: a1b2c3d4-e5f6-7890-abcd-ef1234567890
          type: object
          additionalProperties:
            description: >-
              A plain string (inline substitution) or an options object
              specifying how to handle the variable. Empty string is allowed for
              STRING variables.
            anyOf:
              - type: string
              - additionalProperties: false
                type: object
                properties:
                  value:
                    description: >-
                      Value for the variable (Way 1 or Way 2). Empty string is
                      allowed for STRING variables.
                    type: string
                  createOrgVariable:
                    description: >-
                      If true and value is set, creates an OrgVariable and keeps
                      {{var}} placeholder (Way 2). If false or omitted,
                      substitutes the value inline (Way 1).
                    type: boolean
                  existingOrgVariableId:
                    format: uuid
                    description: >-
                      Link to an existing OrgVariable (Way 3). Cannot be
                      combined with value.
                    type: string
    TemplateApplyResponse:
      additionalProperties: false
      type: object
      required:
        - success
        - data
      properties:
        success:
          enum:
            - true
          type: boolean
        data:
          type: object
          required:
            - applicationId
            - workflowId
            - workflow
          properties:
            applicationId:
              format: uuid
              description: ID of the application record
              type: string
            workflowId:
              format: uuid
              description: ID of the created workflow (PromptBlock)
              type: string
            workflow:
              description: The created workflow details
    BadRequestResponse:
      additionalProperties: false
      type: object
      required:
        - success
        - data
        - message
      properties:
        success:
          enum:
            - false
          type: boolean
        data:
          additionalProperties: false
          type: object
          properties: {}
        message:
          type: string
    ForbiddenResponse:
      additionalProperties: false
      type: object
      required:
        - success
        - data
        - message
      properties:
        success:
          enum:
            - false
          type: boolean
        data:
          additionalProperties: false
          type: object
          properties: {}
        message:
          type: string
    NotFoundResponse:
      additionalProperties: false
      type: object
      required:
        - success
        - data
        - message
      properties:
        success:
          enum:
            - false
          type: boolean
        data:
          additionalProperties: false
          type: object
          properties: {}
        message:
          type: string
    ConflictResponse:
      additionalProperties: false
      type: object
      required:
        - success
        - data
        - message
      properties:
        success:
          enum:
            - false
          type: boolean
        data:
          additionalProperties: false
          type: object
          properties: {}
        message:
          type: string

````