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

# Criar oferta

> Cria uma oferta para um produto. Você envia apenas o essencial; a Ticto preenche os ~80 campos internos com padrões seguros a partir de um preset. Escopo: `offers:write`. Exige `Idempotency-Key`.



## OpenAPI

````yaml /api-reference/openapi.json post /api/v2/products/{hash}/offers
openapi: 3.0.3
info:
  title: Ticto API v2
  version: 2.0.0
  description: >-
    API pública da Ticto para criar produtos e ofertas e ler pedidos,
    assinaturas e saques. Autenticação por token Bearer com escopos granulares.
    Todo acesso é isolado ao produtor dono do token — por construção, não por
    checagem por endpoint.
servers:
  - url: https://api.ticto.cloud
    description: Produção (tokens ticto_live_)
  - url: https://sandbox.ticto.cloud
    description: Sandbox (tokens ticto_test_)
security:
  - bearerAuth: []
tags:
  - name: Produtos
    description: Criação e leitura de produtos.
  - name: Ofertas
    description: Criação e leitura de ofertas de um produto.
  - name: Pedidos
    description: Leitura de pedidos (paridade com a API v1).
  - name: Assinaturas
    description: Leitura de assinaturas (paridade com a API v1).
  - name: Saques
    description: Leitura de saques/cashouts (paridade com a API v1).
paths:
  /api/v2/products/{hash}/offers:
    post:
      tags:
        - Ofertas
      summary: Criar oferta
      description: >-
        Cria uma oferta para um produto. Você envia apenas o essencial; a Ticto
        preenche os ~80 campos internos com padrões seguros a partir de um
        preset. Escopo: `offers:write`. Exige `Idempotency-Key`.
      operationId: createOffer
      parameters:
        - $ref: '#/components/parameters/ProductHash'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateOffer'
            examples:
              pagamento-unico:
                summary: Pagamento único
                value:
                  name: Oferta padrão
                  price: 19900
                  charge_type: one_time
                  payment_methods:
                    - credit_card
                    - pix
                    - boleto
              recorrente:
                summary: Assinatura mensal com trial
                value:
                  name: Plano Mensal
                  price: 4990
                  charge_type: recurring
                  recurrence:
                    interval: monthly
                    trial_days: 7
                  payment_methods:
                    - credit_card
      responses:
        '201':
          description: Oferta criada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Offer'
        '400':
          $ref: '#/components/responses/IdempotencyRequired'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
      security:
        - bearerAuth:
            - offers:write
components:
  parameters:
    ProductHash:
      name: hash
      in: path
      required: true
      schema:
        type: string
      description: 'Hash do produto (identificador canônico da API, ex.: `PABC123`).'
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      schema:
        type: string
        format: uuid
      description: >-
        UUID v4 único por operação. Garante que retries não criem recursos
        duplicados.
  schemas:
    CreateOffer:
      type: object
      required:
        - name
        - price
        - charge_type
      properties:
        name:
          type: string
          maxLength: 255
        price:
          type: integer
          minimum: 500
          description: Preço em centavos (mín. 500 = R$5,00).
        charge_type:
          type: string
          enum:
            - one_time
            - recurring
        recurrence:
          type: object
          description: >-
            Obrigatório quando `charge_type=recurring`; proibido quando
            `one_time`.
          properties:
            interval:
              type: string
              enum:
                - monthly
                - quarterly
                - semiannually
                - annually
            trial_days:
              type: integer
              minimum: 0
              maximum: 365
            cycles:
              type: integer
              minimum: 1
              nullable: true
              description: Número de cobranças; null = infinito.
        payment_methods:
          type: array
          items:
            type: string
            enum:
              - credit_card
              - pix
              - boleto
          description: 'Métodos aceitos. Padrão: todos.'
    Offer:
      type: object
      description: >-
        Retorno de uma oferta. É o corpo devolvido ao criar (`POST`) e ao
        consultar (`GET`) — a resposta é a mesma. Campos como nome, tipo de
        cobrança e recorrência são de entrada (`CreateOffer`) e não são ecoados
        na resposta.
      properties:
        object:
          type: string
          example: offer
        id:
          type: string
          description: Código da oferta — identificador canônico da API.
          example: O709D4B48
        reference_id:
          type: integer
          description: >-
            ID numérico legado (reconcilia com a dashboard). Não é fronteira de
            segurança.
          example: 11
        product_id:
          type: string
          description: Hash do produto pai.
          example: PABC123
        price:
          type: integer
          description: Preço em centavos.
          example: 19900
        is_active:
          type: boolean
          example: true
        checkout_url:
          type: string
          description: >-
            Link de checkout pronto para compartilhar. Formato: base do checkout
            da Ticto + código da oferta.
          example: https://checkout.ticto.app/O709D4B48
        created_at:
          type: string
          format: date-time
    Error:
      type: object
      properties:
        error:
          type: string
          example: insufficient_scope
        message:
          type: string
          example: 'Token is missing the required ability: orders:read.'
        request_id:
          type: string
          nullable: true
    ValidationErrorBody:
      type: object
      properties:
        error:
          type: string
          example: validation_failed
        message:
          type: string
          example: The request payload is invalid.
        request_id:
          type: string
          nullable: true
        details:
          type: array
          items:
            type: string
          example:
            - The name field is required.
  responses:
    IdempotencyRequired:
      description: Operação de escrita sem o header `Idempotency-Key`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: idempotency_key_required
            message: POST requests must include an Idempotency-Key header.
            request_id: null
    Unauthorized:
      description: Token ausente, inválido ou expirado.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: unauthorized
            message: Invalid or expired token.
            request_id: null
    Forbidden:
      description: O token não tem o escopo exigido.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: insufficient_scope
            message: 'Token is missing the required ability: orders:read.'
            request_id: null
    NotFound:
      description: >-
        Recurso inexistente ou que não pertence ao produtor autenticado (o
        isolamento não confirma a existência de recursos de terceiros).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: not_found
            message: Resource not found.
            request_id: null
    ValidationError:
      description: Payload inválido.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ValidationErrorBody'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Token opaco no formato `ticto_live_...` (produção) ou `ticto_test_...`
        (sandbox). Enviado como `Authorization: Bearer <token>`.

````

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