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

# Enviar venda

> Envie até 500 vendas por requisição, no formato Open Delivery

Envia vendas para a Repediu, no mesmo formato de payload do padrão Open Delivery (itens, descontos, entrega, cliente). Suporta até **500 vendas por requisição**.

<Warning>
  `items` e `customer` são obrigatórios de fato: uma venda sem `items` ou sem `customer` causa um erro interno (HTTP 500), não um `400` com mensagem clara. Sempre envie os dois. O campo `merchant` é aceito mas **ignorado** — o estabelecimento é resolvido pelo token, não por este campo.
</Warning>

## Comportamento síncrono x assíncrono

<Info>
  Em **produção**, o processamento é sempre **assíncrono** (enfileirado) — a venda fica disponível no dia seguinte. O texto retornado varia conforme o horário do envio: `"Sales saved successfully"` durante a janela de manutenção diária (03:00–08:00 UTC) ou `"Sales queued successfully"` fora dela — em ambos os casos a venda é enfileirada. Processamento **síncrono** (venda aparece imediatamente) só ocorre em **homologação**.
</Info>

| Ambiente | Comportamento | Resposta |
| - | - | - |
| Homologação | Síncrono — vendas aparecem na Repediu imediatamente. Não recomendado para altas cargas. | `"Sales saved successfully"` |
| Produção | Sempre assíncrono (enfileirado) — disponível no próximo dia. Recomendado para alta carga. | `"Sales queued successfully"` (ou `"Sales saved successfully"` dentro da janela de manutenção 03:00–08:00 UTC — a venda é enfileirada do mesmo jeito) |

## Deduplicação

A deduplicação aplicada nesta rota é por **colisão de canal**: se o `salesChannel` de uma venda coincide (após normalização — minúsculas, sem espaços/traços/underscores, sem sufixo de versão) com o nome de outra integração ativa da mesma empresa, a venda é descartada silenciosamente (sem erro visível). Deduplicação adicional por `id` repetido ou por proximidade de horário entre vendas do mesmo cliente pode ocorrer em etapas posteriores de processamento, fora desta rota.

## Erros

| HTTP | Mensagem | Quando acontece |
| - | - | - |
| `400` | `No sales found, please check the request` | Lista vazia |
| `400` | `Only 500 sales per requisition are allowed` | Mais de 500 itens |
| `400` | `Company not found` | Empresa não encontrada para o token |
| `400` | `Integration not found` | Integração não encontrada |
| `400` | Lista de vendas com `ExternalCode`/`Message`/`Success` | Só no caminho síncrono (homologação): uma ou mais vendas falharam individualmente |

<Card title="Atualizar clientes" icon="users" href="/envio-de-dados/atualizar-clientes">
  Depois de enviar vendas, mantenha os dados de clientes atualizados.
</Card>


## OpenAPI

````yaml openapi-envio-de-dados.yaml POST /orders
openapi: 3.0.1
info:
  title: Repediu — API de Envio de Dados
  description: >-
    API para o parceiro ENVIAR dados para a Repediu (vendas, clientes,
    avaliações e cashback) — sentido inverso ao da API Open Delivery, onde o
    parceiro LÊ dados da Repediu. Autenticação própria via
    clientId/clientSecret, sem relação com o token client_credentials do Open
    Delivery.
  version: v1
servers:
  - url: https://public-api.repediu.com.br
    description: Produção
security:
  - Bearer: []
paths:
  /orders:
    post:
      tags:
        - Vendas
      summary: Enviar venda
      description: >-
        Envia até 500 vendas por requisição, no formato Open Delivery. Em
        produção o processamento é sempre assíncrono (enfileirado); fora de
        produção pode ser síncrono. Limite de 60 requisições/minuto por token.
      operationId: insertSales
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              maxItems: 500
              items:
                $ref: '#/components/schemas/Sale'
      responses:
        '200':
          description: >-
            Vendas recebidas (síncrono) ou enfileiradas (assíncrono) com
            sucesso.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StringEnvelope'
              examples:
                enfileirada:
                  summary: Produção (assíncrono)
                  value:
                    result: Sales queued successfully
                    error: null
                    timeGenerated: '2025-09-26T14:38:34.0739726Z'
                    success: true
                sincrona:
                  summary: Homologação (síncrono)
                  value:
                    result: Sales saved successfully
                    error: null
                    timeGenerated: '2025-09-26T14:38:34.0739726Z'
                    success: true
        '400':
          description: >-
            Lista vazia, mais de 500 itens, empresa/integração não encontrada,
            ou (só no caminho síncrono) uma ou mais vendas falharam
            individualmente.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StringEnvelope'
              example:
                result: null
                error:
                  message: Only 500 sales per requisition are allowed
                  notifications: null
                  errorDetails: null
                timeGenerated: '2025-09-26T14:38:34.0739726Z'
                success: false
        '429':
          $ref: '#/components/responses/TooManyRequests'
components:
  schemas:
    Sale:
      type: object
      required:
        - id
        - items
        - customer
      properties:
        id:
          type: string
        type:
          type: string
          description: >-
            Valor livre — DELIVERY, TAKEOUT e INDOOR são os únicos mapeados
            internamente.
        displayId:
          type: string
        sourceAppId:
          type: string
        salesChannel:
          type: string
          description: >-
            Usado para filtro de deduplicação por canal entre integrações da
            mesma empresa.
        storeChannel:
          type: string
        createdAt:
          type: string
          format: date-time
        lastEvent:
          type: string
          description: Aceito mas não processado por esta API.
        preparationStartDateTime:
          type: string
          format: date-time
        items:
          type: array
          items:
            $ref: '#/components/schemas/SaleItem'
        discounts:
          type: array
          items:
            $ref: '#/components/schemas/Discount'
        total:
          type: object
          properties:
            itemsPrice:
              $ref: '#/components/schemas/Money'
            otherFees:
              $ref: '#/components/schemas/Money'
            discount:
              $ref: '#/components/schemas/Money'
            orderAmount:
              $ref: '#/components/schemas/Money'
        delivery:
          $ref: '#/components/schemas/Delivery'
        customer:
          $ref: '#/components/schemas/SaleCustomer'
        otherFees:
          type: array
          items:
            $ref: '#/components/schemas/OtherFee'
        merchant:
          $ref: '#/components/schemas/Merchant'
    StringEnvelope:
      type: object
      properties:
        result:
          type: string
          nullable: true
        error:
          $ref: '#/components/schemas/EnvelopeError'
        timeGenerated:
          type: string
          format: date-time
        success:
          type: boolean
    SaleItem:
      type: object
      required:
        - id
        - index
        - name
        - quantity
        - unitPrice
        - totalPrice
      properties:
        id:
          type: string
        index:
          type: integer
        name:
          type: string
        category:
          type: string
        externalCode:
          type: string
        unit:
          type: string
          default: UN
        ean:
          type: string
        quantity:
          type: number
        specialInstructions:
          type: string
        unitPrice:
          $ref: '#/components/schemas/Money'
        originalPrice:
          $ref: '#/components/schemas/Money'
        optionsPrice:
          type: object
          properties:
            number:
              type: number
            currency:
              type: string
        totalPrice:
          $ref: '#/components/schemas/Money'
        options:
          type: array
          items:
            $ref: '#/components/schemas/SaleOption'
        pizza:
          type: object
          properties:
            crust:
              type: string
            edge:
              type: string
    Discount:
      type: object
      properties:
        amount:
          $ref: '#/components/schemas/Money'
        target:
          type: string
        targetId:
          type: string
        sponsorshipValue:
          type: array
          items:
            type: object
            properties:
              name:
                type: object
                properties:
                  value:
                    type: string
              value:
                type: object
                properties:
                  amount:
                    type: number
              description:
                type: object
                properties:
                  value:
                    type: string
    Money:
      type: object
      properties:
        value:
          type: number
          format: double
        currency:
          type: string
          default: BRL
    Delivery:
      type: object
      properties:
        deliveredBy:
          type: string
          default: MERCHANT
        deliveryAddress:
          $ref: '#/components/schemas/DeliveryAddress'
        estimateDateTime:
          type: string
          format: date-time
    SaleCustomer:
      type: object
      required:
        - id
      properties:
        id:
          type: string
        name:
          type: string
        documentNumber:
          type: string
        phone:
          $ref: '#/components/schemas/PhoneNumberRequest'
        email:
          type: string
        birthDate:
          type: string
          format: date
        loyaltyPoints:
          type: integer
        gender:
          type: integer
        ordersCountOnMerchant:
          type: number
    OtherFee:
      type: object
      properties:
        name:
          type: string
        type:
          type: string
        price:
          $ref: '#/components/schemas/Money'
    Merchant:
      type: object
      description: >-
        Aceito pela API mas não utilizado na resolução do estabelecimento — o
        merchant é resolvido pelo token, não por este campo.
      properties:
        id:
          type: string
        name:
          type: string
    EnvelopeError:
      type: object
      nullable: true
      properties:
        message:
          type: string
        notifications:
          type: array
          nullable: true
          items:
            type: object
            properties:
              key:
                type: string
              message:
                type: string
        errorDetails:
          nullable: true
          description: Formato livre — string, objeto ou array dependendo do erro.
    SaleOption:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        externalCode:
          type: string
        unit:
          type: string
        quantity:
          type: number
        unitPrice:
          $ref: '#/components/schemas/Money'
        totalprice:
          $ref: '#/components/schemas/Money'
        type:
          type: string
        category:
          type: string
    DeliveryAddress:
      type: object
      properties:
        country:
          type: string
        state:
          type: string
        city:
          type: string
        district:
          type: string
        street:
          type: string
        number:
          type: string
        complement:
          type: string
        reference:
          type: string
        formattedAddress:
          type: string
        postalCode:
          type: string
        coordinates:
          type: object
          properties:
            latitude:
              type: number
            longitude:
              type: number
    PhoneNumberRequest:
      type: object
      properties:
        number:
          type: string
        extension:
          type: string
          default: '+55'
  responses:
    TooManyRequests:
      description: >-
        Mais de 60 requisições no último minuto para este token. Sem fila — o
        excedente é rejeitado na hora.
      content:
        application/json:
          schema:
            type: string
          example: To many requests, try again in 1 minutes.
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Token emitido por POST /authentication/users/accessToken. Envie no
        header Authorization como `Bearer <token>`. Válido por 6 horas.

````

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