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

# Create proposal template

> Creates a template with the dashboard defaults. Required: name, sender (from GET /proposal-senders), hourly_rate.rate and ai.instructions. All other update fields are accepted



## OpenAPI

````yaml post /proposal-templates
openapi: 3.0.4
info:
  title: Vollna API
  description: API for managing Upwork profiles, proposals, results, and filters
  version: 1.0.0
servers:
  - url: https://api.vollna.com/v1
security: []
tags:
  - name: Profiles
    description: Manage Upwork profiles
  - name: Proposals
    description: Access and manage Upwork proposals
  - name: Results
    description: View monitoring results and projects
  - name: Filters
    description: Manage monitoring filters
  - name: Auto Bidding
    description: Manage auto bidding jobs and setups
paths:
  /proposal-templates:
    post:
      tags:
        - Proposal Templates
      summary: Create proposal template
      description: >-
        Creates a template with the dashboard defaults. Required: name, sender
        (from GET /proposal-senders), hourly_rate.rate and ai.instructions. All
        other update fields are accepted
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProposalTemplateCreate'
      responses:
        '201':
          description: >-
            Template created; returns the same shape as GET
            /proposal-templates/{id}
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/ProposalTemplate'
        '400':
          description: Invalid request body, or validation failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - apiToken: []
components:
  schemas:
    ProposalTemplateCreate:
      allOf:
        - $ref: '#/components/schemas/ProposalTemplateUpdate'
        - type: object
          required:
            - name
            - sender
            - hourly_rate
            - ai
          description: >-
            Required on create: name, sender, hourly_rate.rate and
            ai.instructions. Everything else falls back to the dashboard
            defaults (visibility shared_admins, fixed price by job terms, A/B
            testing off)
    ProposalTemplate:
      type: object
      properties:
        id:
          type: integer
          example: 123
        name:
          type: string
          nullable: true
          example: Web development
        visibility:
          type: string
          enum:
            - shared_view
            - shared_edit
            - shared_admins
          description: Who on the team can see and edit this template
          example: shared_admins
        sender:
          type: object
          description: Who bids with this template
          properties:
            name:
              type: string
              nullable: true
              description: Contractor or freelancer name
              example: John Smith
            type:
              type: string
              enum:
                - agency
                - freelancer
                - manual
              example: agency
            organization:
              type: string
              nullable: true
              description: >-
                Agency name for agency templates, Upwork team name for
                freelancer templates
              example: Acme Agency LLC
        hourly_rate:
          type: object
          properties:
            mode:
              type: string
              enum:
                - fixed
                - smart
                - flexible
              example: smart
            rate:
              type: number
              nullable: true
              description: Base rate; the default rate in flexible mode
              example: 50
            smart_rate_min:
              type: number
              nullable: true
              description: Smart mode only
              example: 25
            smart_rate_max:
              type: number
              nullable: true
              description: Smart mode only
              example: 120
            smart_rate_percent:
              type: integer
              nullable: true
              description: 'Smart mode only: percent of the client''s budget'
              example: 98
            rules_count:
              type: integer
              description: 'Flexible mode: number of budget rules'
              example: 0
            increase_percent:
              type: number
              nullable: true
              description: Scheduled rate increase, percent
              example: null
            increase_frequency:
              type: string
              enum:
                - never
                - every-3-months
                - every-6-months
                - every-12-months
              example: never
        fixed_price:
          type: object
          properties:
            type:
              type: string
              enum:
                - by-job-terms
                - by-project
              example: by-job-terms
            price:
              type: number
              nullable: true
              description: 'by-project only: the same bid on every fixed-price job'
            min_price:
              type: number
              nullable: true
              description: 'by-job-terms only: minimum bid'
            client_budget_percent:
              type: integer
              nullable: true
              description: 'by-job-terms only: bid as a percent of the client''s budget'
        ai:
          type: object
          properties:
            model:
              type: string
              nullable: true
              description: Selected AI model; null means the default model
              example: gemini-3.6-flash
            instructions:
              type: string
              nullable: true
              description: AI instructions the generator follows
              example: Write like a human
            client_questions:
              type: string
              nullable: true
              description: >-
                Prompt for answering client screening questions; null when
                disabled
              example: Answer briefly
            additional_context:
              type: string
              nullable: true
              description: Additional context for generation; null when disabled
            template_structure:
              type: boolean
              description: Generated proposals follow the template structure
        filters:
          type: array
          description: Filters this template is assigned to
          items:
            type: object
            properties:
              id:
                type: integer
              name:
                type: string
        auto_bidding_setups:
          type: array
          description: Auto-bidding setups that bid with this template
          items:
            type: object
            properties:
              id:
                type: integer
              name:
                type: string
        ab_testing:
          type: boolean
          description: Cover letter variants rotate for A/B testing
        answers:
          type: array
          description: Targeted answers to client screening questions
          items:
            type: object
            properties:
              question:
                type: string
                example: Availability?
              answer:
                type: string
                example: Full time
              match_type:
                type: string
                example: exact
        attachments:
          type: array
          items:
            type: object
            properties:
              uid:
                type: string
                example: 9f1c2ab34de56f7890ab12cd34ef56ab
              name:
                type: string
                example: portfolio.pdf
              mime_type:
                type: string
                example: application/pdf
              size_bytes:
                type: integer
                example: 245760
        cover_letters:
          type: object
          nullable: true
          description: >-
            Cover letter variants by A/B slot; null when template structure is
            disabled and the AI ignores them
          properties:
            variant_a:
              type: string
              nullable: true
              example: Hi, I build web apps with Symfony and React...
            variant_b:
              type: string
              nullable: true
        created_at:
          type: string
          format: date-time
          example: '2026-08-26T10:00:00+00:00'
        updated_at:
          type: string
          format: date-time
          example: '2026-08-26T10:00:00+00:00'
    ValidationError:
      type: object
      properties:
        error:
          type: string
          example: Validation failed
        fields:
          type: object
          description: Field errors keyed by dot path, all collected in one response
          additionalProperties:
            type: string
          example:
            hourly_rate.rate: must be a number between 3 and 999
            ai.model: unknown model
    Error:
      type: object
      properties:
        error:
          type: string
    ProposalTemplateUpdate:
      type: object
      description: >-
        All fields optional; send only what you change. null clears or disables
        where noted
      properties:
        name:
          type: string
          maxLength: 255
          description: Non-empty; null not allowed
          example: Web development
        sender:
          type: object
          description: >-
            Assign who bids with this template, from GET /proposal-senders.
            contractor_uid is required for agencies and not allowed for
            freelancer profiles. Switching an agency template to a freelancer
            sender makes it ineligible for auto-bidding
          required:
            - organization_id
          properties:
            organization_id:
              type: integer
              example: 15
            contractor_uid:
              type: string
              example: contractor_abc123
        hourly_rate:
          type: object
          description: Partial update of the hourly rate block
          properties:
            mode:
              type: string
              enum:
                - fixed
                - smart
              description: >-
                Flexible budget rules are managed in the dashboard and cannot be
                set here
            rate:
              type: number
              minimum: 3
              maximum: 999
            smart_rate_min:
              type: number
              minimum: 3
              maximum: 999
              description: Smart mode; effective min must not exceed effective max
            smart_rate_max:
              type: number
              minimum: 3
              maximum: 999
            smart_rate_percent:
              type: integer
              minimum: 1
              maximum: 100
            increase_percent:
              type: number
              nullable: true
              minimum: 0
            increase_frequency:
              type: string
              enum:
                - never
                - every-3-months
                - every-6-months
                - every-12-months
        fixed_price:
          type: object
          properties:
            type:
              type: string
              enum:
                - by-job-terms
                - by-project
            price:
              type: number
              nullable: true
              minimum: 5
              maximum: 1000000
            min_price:
              type: number
              nullable: true
              minimum: 5
              maximum: 1000000
            client_budget_percent:
              type: integer
              nullable: true
              minimum: 1
              maximum: 1000
        ai:
          type: object
          properties:
            model:
              type: string
              nullable: true
              description: A model id from the catalog; null resets to the default model
              example: gemini-3.6-flash
            instructions:
              type: string
              maxLength: 10000
              description: >-
                AI instructions the generator follows. Cannot be cleared: null
                and empty strings are rejected
              example: Write like a human
            client_questions:
              type: string
              nullable: true
              maxLength: 10000
              description: Prompt for client screening questions; null disables the feature
            additional_context:
              type: string
              nullable: true
              maxLength: 10000
              description: null disables the feature
            template_structure:
              type: boolean
        ab_testing:
          type: boolean
        answers:
          type: array
          maxItems: 50
          description: Replaces the whole list
          items:
            type: object
            required:
              - question
              - answer
              - match_type
            properties:
              question:
                type: string
                maxLength: 500
                example: Availability?
              answer:
                type: string
                maxLength: 5000
                example: Full time
              match_type:
                type: string
                enum:
                  - exact
                  - contains
                  - startsWith
        cover_letters:
          type: object
          description: Partial update of the A/B slots
          properties:
            variant_a:
              type: string
              nullable: true
              maxLength: 5000
              description: null clears the slot
            variant_b:
              type: string
              nullable: true
              maxLength: 5000
        visibility:
          type: string
          enum:
            - shared_view
            - shared_edit
            - shared_admins
          description: >-
            The API token acts with team admin rights; private is not available
            through the API
  securitySchemes:
    apiToken:
      type: apiKey
      name: X-API-TOKEN
      in: header
      description: API token for authentication

````