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

# Create app template

> Create a new WhatsApp message template. The template will be submitted to Meta for review and automatically linked to this app for webhook events.



## OpenAPI

````yaml /openapi.json post /v1/whatsapp/templates
openapi: 3.1.0
info:
  version: 1.0.0
  title: Chirp API
  description: Communication APIs for SMS, MMS, and WhatsApp messaging
servers:
  - url: https://api.buildwithchirp.com
security: []
paths:
  /v1/whatsapp/templates:
    post:
      tags:
        - App
        - WhatsApp Templates
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                whatsappBusinessProfileId:
                  type: string
                  description: >-
                    The ID of the WhatsApp Business Profile to create the
                    template for
                  example: wabp_abc123
                name:
                  type: string
                  minLength: 1
                  maxLength: 512
                  pattern: ^[a-z][a-z0-9_]*$
                  description: >-
                    Template name (lowercase letters, numbers, underscores only,
                    must start with a letter)
                  example: order_confirmation
                language:
                  type: string
                  minLength: 2
                  maxLength: 10
                  description: Language code (BCP 47 format)
                  example: en_US
                category:
                  type: string
                  enum:
                    - MARKETING
                    - UTILITY
                    - AUTHENTICATION
                  description: Template category
                  example: UTILITY
                components:
                  type: array
                  items:
                    type: object
                    properties:
                      type:
                        type: string
                        enum:
                          - HEADER
                          - BODY
                          - FOOTER
                          - BUTTONS
                      format:
                        type: string
                        enum:
                          - TEXT
                          - IMAGE
                          - VIDEO
                          - DOCUMENT
                      text:
                        type: string
                      example:
                        type: object
                        properties:
                          header_text:
                            type: array
                            items:
                              type: string
                          header_handle:
                            type: array
                            items:
                              type: string
                          body_text:
                            type: array
                            items:
                              type: array
                              items:
                                type: string
                      buttons:
                        type: array
                        items:
                          type: object
                          properties:
                            type:
                              type: string
                              enum:
                                - QUICK_REPLY
                                - URL
                                - PHONE_NUMBER
                                - COPY_CODE
                                - FLOW
                            text:
                              type: string
                              maxLength: 25
                            url:
                              type: string
                              format: uri
                            phone_number:
                              type: string
                            example:
                              type: array
                              items:
                                type: string
                          required:
                            - type
                            - text
                    required:
                      - type
                  minItems: 1
                  description: Template components (must include at least a BODY)
                  example:
                    - type: BODY
                      text: >-
                        Hello {{customer_name}}, your order #{{order_id}} has
                        been confirmed!
              required:
                - whatsappBusinessProfileId
                - name
                - language
                - category
                - components
      responses:
        '201':
          description: Template created and linked to app
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                  organizationId:
                    type: string
                  whatsappBusinessProfileId:
                    type: string
                  metaTemplateId:
                    type:
                      - string
                      - 'null'
                  name:
                    type: string
                  language:
                    type: string
                  category:
                    type: string
                    enum:
                      - MARKETING
                      - UTILITY
                      - AUTHENTICATION
                  status:
                    type: string
                    enum:
                      - PENDING
                      - APPROVED
                      - REJECTED
                      - PAUSED
                      - DISABLED
                  components:
                    type: array
                    items:
                      type: object
                      properties:
                        type:
                          type: string
                          enum:
                            - HEADER
                            - BODY
                            - FOOTER
                            - BUTTONS
                        format:
                          type: string
                          enum:
                            - TEXT
                            - IMAGE
                            - VIDEO
                            - DOCUMENT
                        text:
                          type: string
                        example:
                          type: object
                          properties:
                            header_text:
                              type: array
                              items:
                                type: string
                            header_handle:
                              type: array
                              items:
                                type: string
                            body_text:
                              type: array
                              items:
                                type: array
                                items:
                                  type: string
                        buttons:
                          type: array
                          items:
                            type: object
                            properties:
                              type:
                                type: string
                                enum:
                                  - QUICK_REPLY
                                  - URL
                                  - PHONE_NUMBER
                                  - COPY_CODE
                                  - FLOW
                              text:
                                type: string
                                maxLength: 25
                              url:
                                type: string
                                format: uri
                              phone_number:
                                type: string
                              example:
                                type: array
                                items:
                                  type: string
                            required:
                              - type
                              - text
                      required:
                        - type
                  variableMapping:
                    type:
                      - object
                      - 'null'
                    additionalProperties:
                      type: number
                  rejectionReason:
                    type:
                      - string
                      - 'null'
                  qualityScore:
                    type:
                      - string
                      - 'null'
                  createdAt:
                    type: string
                  updatedAt:
                    type: string
                required:
                  - id
                  - organizationId
                  - whatsappBusinessProfileId
                  - metaTemplateId
                  - name
                  - language
                  - category
                  - status
                  - components
                  - variableMapping
                  - rejectionReason
                  - qualityScore
                  - createdAt
                  - updatedAt
        '400':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '404':
          description: 'Business profile not found Possible codes: `whatsapp_not_configured`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '424':
          description: 'Provider error from Meta Possible codes: `meta_api_error`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
      security:
        - appAuth: []
components:
  schemas:
    ApiError:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              enum:
                - invalid_request_error
                - authentication_error
                - provider_error
                - api_error
              description: The type of error returned
              example: invalid_request_error
            code:
              type: string
              enum:
                - message_undeliverable
                - conversation_window_expired
                - recipient_not_on_whatsapp
                - phone_number_not_assigned
                - unsupported_message_type
                - media_too_large
                - invalid_phone_number
                - template_not_found
                - template_parameter_mismatch
                - groups_not_eligible
                - account_restricted
                - display_name_not_approved
                - whatsapp_not_configured
                - meta_api_error
                - meta_api_unavailable
                - telnyx_api_error
                - telnyx_api_unavailable
                - rate_limit_exceeded
                - whatsapp_rate_limited
                - resource_already_exists
                - test_app_required
                - call_not_found
                - call_already_ended
                - call_failed
                - call_rejected
                - call_timeout
                - call_busy
                - calling_not_configured
                - calling_disabled
                - max_concurrent_calls_reached
                - recording_not_found
                - recording_already_in_progress
                - recording_failed
                - voicemail_not_found
                - voicemail_disabled
                - invalid_call_command
                - command_not_applicable
                - whatsapp_calling_not_enabled
                - whatsapp_call_permission_required
                - whatsapp_call_permission_limit
                - whatsapp_pstn_bridge_forbidden
                - livekit_api_error
                - livekit_room_error
                - sip_trunk_error
              description: A machine-readable error code for programmatic handling
              example: invalid_phone_number
            message:
              type: string
              description: Human-readable error message
              example: The phone number "+1abc" is not in E.164 format.
            doc_url:
              type: string
              format: uri
              description: URL to documentation for this error code
              example: >-
                https://docs.buildwithchirp.com/api_reference/error-codes#invalid_phone_number
            param:
              type: string
              description: The parameter that caused the error
              example: from
            provider:
              $ref: '#/components/schemas/ProviderError'
            additional_info:
              type: array
              items:
                type: string
              description: Human-readable remediation hints (e.g. from Meta Health Status).
          required:
            - type
            - message
      required:
        - error
    ProviderError:
      type: object
      properties:
        source:
          type: string
          enum:
            - meta
            - telnyx
            - livekit
          description: Provider name
          example: meta
        code:
          anyOf:
            - type: number
            - type: string
          description: Provider's native error code
        message:
          type: string
          description: Provider's error message
        fbtrace_id:
          type: string
          description: Meta's trace ID for support tickets
        health_status:
          $ref: '#/components/schemas/HealthStatusPayload'
      required:
        - source
        - code
        - message
    HealthStatusPayload:
      type: object
      properties:
        can_send_message:
          type: string
          enum:
            - AVAILABLE
            - LIMITED
            - BLOCKED
          description: Meta Health Status value
        entities:
          type: array
          items:
            $ref: '#/components/schemas/HealthStatusEntity'
      required:
        - can_send_message
        - entities
      description: >-
        Meta Health Status payload, present when the error was enriched via the
        Health Status API.
    HealthStatusEntity:
      oneOf:
        - type: object
          properties:
            entity_type:
              type: string
              enum:
                - PHONE_NUMBER
                - MESSAGE_TEMPLATE
                - WABA
                - BUSINESS
                - APP
            id:
              type: string
            can_send_message:
              type: string
              enum:
                - AVAILABLE
            can_receive_call_sip:
              type: string
              enum:
                - AVAILABLE
                - LIMITED
                - BLOCKED
              description: Meta Health Status value
            errors:
              type: array
              items:
                $ref: '#/components/schemas/HealthStatusError'
          required:
            - entity_type
            - id
            - can_send_message
        - type: object
          properties:
            entity_type:
              type: string
              enum:
                - PHONE_NUMBER
                - MESSAGE_TEMPLATE
                - WABA
                - BUSINESS
                - APP
            id:
              type: string
            can_send_message:
              type: string
              enum:
                - LIMITED
            can_receive_call_sip:
              type: string
              enum:
                - AVAILABLE
                - LIMITED
                - BLOCKED
              description: Meta Health Status value
            additional_info:
              type: array
              items:
                type: string
            errors:
              type: array
              items:
                $ref: '#/components/schemas/HealthStatusError'
          required:
            - entity_type
            - id
            - can_send_message
            - additional_info
        - type: object
          properties:
            entity_type:
              type: string
              enum:
                - PHONE_NUMBER
                - MESSAGE_TEMPLATE
                - WABA
                - BUSINESS
                - APP
            id:
              type: string
            can_send_message:
              type: string
              enum:
                - BLOCKED
            can_receive_call_sip:
              type: string
              enum:
                - AVAILABLE
                - LIMITED
                - BLOCKED
              description: Meta Health Status value
            errors:
              type: array
              items:
                $ref: '#/components/schemas/HealthStatusError'
          required:
            - entity_type
            - id
            - can_send_message
            - errors
    HealthStatusError:
      type: object
      properties:
        error_code:
          type: number
        error_description:
          type: string
        possible_solution:
          type: string
      required:
        - error_code
        - error_description
        - possible_solution
  securitySchemes:
    appAuth:
      type: http
      scheme: bearer
      description: >-
        App API key (format: sk_live_app_* or sk_test_app_*) for app-level
        operations

````