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

# Criar indicação

> Cria a indicação do cliente ou devolve o processo já aberto para o mesmo CPF. A resposta traz o link
seguro da jornada, que você entrega ao cliente.

- **Criou:** 201, `created: true`.
- **Reaproveitou um processo aberto do CPF** (em qualquer hub do parceiro): 200, `created: false`,
  com **link novo** e o `hub_code` do processo existente, que pode ser outro hub do parceiro.
  Do novo pedido, só o CPF é usado: os demais dados do cliente e o valor são validados, mas
  **não alteram** o processo existente. O link anterior continua valendo até o próprio `expires_at`.
- **Repetir é seguro.** Se a chamada sofreu timeout, reenvie com tranquilidade: o mesmo CPF devolve
  o mesmo processo, e por isso a API dispensa um `Idempotency-Key`.
- Um hub inativo (o informado em `hub_code` ou o padrão) recusa a requisição com 403, mesmo que o
  CPF já tenha processo aberto.
- **Limite diário por CPF:** padrão 3 encerramentos sem contrato por CPF por dia (fuso de São Paulo),
  configurável por parceiro. Atingido o limite, novas indicações daquele CPF respondem 429
  `CPF_DAILY_LIMIT_REACHED` até a meia-noite de São Paulo. O reaproveitamento de processo aberto não é afetado pelo limite.

O valor e o prazo enviados em `loan_request` são **um pedido, não um compromisso**: o cliente
pode ajustá-los na jornada. Consulte a faixa permitida em `GET /ping`.

Apenas `customer.cpf` e `customer.name` são obrigatórios. Dos campos opcionais, envie o que você já coletou;
o cliente confirma e complementa os dados na jornada.

O CPF dos exemplos (`000.000.000-00`) é um marcador: a API o recusa com `INVALID_CHECK_DIGIT`. Substitua pelo CPF do cliente.




## OpenAPI

````yaml /api-do-parceiro/openapi.yaml post /referrals
openapi: 3.1.0
info:
  title: API do Parceiro Wincred
  version: 1.0.0
  summary: Indique clientes, acompanhe a contratação e receba notificações por webhook.
  description: >
    API REST para parceiros comerciais indicarem clientes para o crédito
    consignado CLT

    da Wincred e acompanharem a contratação. A integração é de servidor para
    servidor e tem

    baixo acoplamento: o seu sistema indica o cliente e, a partir daí, atua como
    um ouvinte

    do que acontece na Wincred, por webhooks e por consulta, enquanto o cliente
    conduz a

    simulação e a contratação no link seguro da Wincred.


    O servidor publicado aqui é o **ambiente de dev**, o ambiente de testes do
    parceiro. O host

    de produção é enviado por e-mail na ativação. Antes da primeira indicação,
    siga o passo a passo

    de teste: `GET /ping`, `POST /webhooks/test` e uma indicação com dados
    sintéticos. O onboarding é

    assistido de ponta a ponta pelo time de integrações da Wincred.


    ## Convenções


    - **Base:** `<host>/partners/v1`. Só HTTPS. Corpo sempre JSON em UTF-8.

    - **Autenticação:** `Authorization: Bearer <chave do parceiro>`, com a chave
    entregue pela Wincred.

    - **Identificador de requisição:** envie `X-Request-Id` (até 64 caracteres,
    `[A-Za-z0-9_-]`);
      se faltar ou for inválido, geramos um. Ele volta no header `X-Request-Id` de toda resposta e no
      campo `request_id` de todo erro. Informe-o ao suporte: ele nos permite localizar a requisição rapidamente.
    - **Dinheiro:** string decimal com ponto, por exemplo `"5000.00"`. Nunca
    número JSON, para preservar a precisão.

    - **Datas e horas:** RFC 3339 com o fuso de São Paulo, por exemplo
    `2026-10-05T10:12:00-03:00`.
      Data de nascimento: `AAAA-MM-DD`.
    - **Enums:** minúsculas com sublinhado (`awaiting_client`).

    - **Evolução:** campo novo em resposta ou webhook não é quebra de contrato:
    ignore o que não conhece.
      Uma quebra de contrato dá origem a `/partners/v2`.
    - **Campo desconhecido na requisição é recusado** (400). Os nomes dos campos
    diferenciam maiúsculas de minúsculas.


    ## Ordem em que a API avalia a requisição


    Saber a ordem das verificações ajuda a interpretar o erro recebido.


    1. API desligada: 503 `SERVICE_UNAVAILABLE`, antes mesmo da autenticação.

    2. Corpo com `Content-Length` acima de 16 KB: 413 `PAYLOAD_TOO_LARGE`, antes
    da autenticação.

    3. Chave de API: 401 `UNAUTHENTICATED`.

    4. Limite de requisições por minuto: 429 `RATE_LIMITED`. Uma requisição
    inválida também consome o limite.

    5. Formato do corpo: 400 `INVALID_REQUEST` ou 422 `VALIDATION_FAILED`, sem
    criar processo.

    6. Regras que dependem do cadastro do parceiro (hub, faixa de valor, limite
    diário): 403, 422 ou 429.


    ## Limites


    | Limite | Valor |

    |--------|-------|

    | Corpo da requisição | 16 KB (16384 bytes) |

    | Tempo máximo de processamento | 10 s; depois disso, 503
    `SERVICE_UNAVAILABLE` |

    | Requisições por minuto | Por parceiro, contado separadamente para `POST
    /referrals`, `GET /referrals/{process_external_id}`, `GET /ping` e `POST
    /webhooks/test`. Ao exceder: 429 com `Retry-After` |

    | Encerramentos sem contrato por CPF | Padrão 3 por CPF por dia,
    configurável por parceiro. Ao exceder: 429 `CPF_DAILY_LIMIT_REACHED` |


    ## Respostas fora do envelope


    Por segurança, a API aceita chamadas apenas dos IPs que o parceiro informou
    à Wincred (allowlist de entrada).

    Uma chamada de um IP fora da lista é bloqueada na camada de gateway/WAF,
    antes de chegar à API, e por isso

    recebe 403 **sem** o envelope de erro. Fale com o time de integrações para
    liberar o IP.
  contact:
    name: Integrações Wincred
servers:
  - url: https://orchestrator-partner.dev.wincred.digital/partners/v1
    description: >-
      Dev, o ambiente de testes do parceiro. O host de produção é enviado por
      e-mail na ativação.
security:
  - bearerAuth: []
tags:
  - name: Webhooks
    description: >-
      Notificações que a Wincred envia para a webhook_url do parceiro a cada
      etapa da indicação.
  - name: Indicações
    description: Criar a indicação de um cliente e consultar o andamento do processo.
  - name: Teste de integração
    description: Rotas para validar a chave e o webhook antes da primeira indicação real.
paths:
  /referrals:
    post:
      tags:
        - Indicações
      summary: Criar indicação
      description: >
        Cria a indicação do cliente ou devolve o processo já aberto para o mesmo
        CPF. A resposta traz o link

        seguro da jornada, que você entrega ao cliente.


        - **Criou:** 201, `created: true`.

        - **Reaproveitou um processo aberto do CPF** (em qualquer hub do
        parceiro): 200, `created: false`,
          com **link novo** e o `hub_code` do processo existente, que pode ser outro hub do parceiro.
          Do novo pedido, só o CPF é usado: os demais dados do cliente e o valor são validados, mas
          **não alteram** o processo existente. O link anterior continua valendo até o próprio `expires_at`.
        - **Repetir é seguro.** Se a chamada sofreu timeout, reenvie com
        tranquilidade: o mesmo CPF devolve
          o mesmo processo, e por isso a API dispensa um `Idempotency-Key`.
        - Um hub inativo (o informado em `hub_code` ou o padrão) recusa a
        requisição com 403, mesmo que o
          CPF já tenha processo aberto.
        - **Limite diário por CPF:** padrão 3 encerramentos sem contrato por CPF
        por dia (fuso de São Paulo),
          configurável por parceiro. Atingido o limite, novas indicações daquele CPF respondem 429
          `CPF_DAILY_LIMIT_REACHED` até a meia-noite de São Paulo. O reaproveitamento de processo aberto não é afetado pelo limite.

        O valor e o prazo enviados em `loan_request` são **um pedido, não um
        compromisso**: o cliente

        pode ajustá-los na jornada. Consulte a faixa permitida em `GET /ping`.


        Apenas `customer.cpf` e `customer.name` são obrigatórios. Dos campos
        opcionais, envie o que você já coletou;

        o cliente confirma e complementa os dados na jornada.


        O CPF dos exemplos (`000.000.000-00`) é um marcador: a API o recusa com
        `INVALID_CHECK_DIGIT`. Substitua pelo CPF do cliente.
      operationId: createReferral
      parameters:
        - $ref: '#/components/parameters/XRequestId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateReferralRequest'
            examples:
              minimo:
                summary: Só os campos obrigatórios
                value:
                  customer:
                    cpf: 000.000.000-00
                    name: Ana
              completo:
                summary: Todos os campos
                value:
                  hub_code: padrao
                  customer:
                    cpf: 000.000.000-00
                    name: CLIENTE SINTETICO DO TESTE
                    phone:
                      country_code: '55'
                      area_code: '11'
                      number: '987654321'
                    email: cliente.sintetico@example.com
                    birth_date: '1988-04-17'
                    address:
                      street: Rua Sintetica do Teste
                      number: '77'
                      complement: apto sintetico
                      neighborhood: Bairro Sintetico
                      city: Cidade Sintetica
                      state: SP
                      zip_code: 01001-000
                  loan_request:
                    amount: '5000.00'
                    installments: 24
      responses:
        '200':
          description: >-
            Já existia processo aberto para o CPF. A API devolveu o mesmo
            processo, com um link novo.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateReferralResponse'
              examples:
                reaproveitada:
                  value:
                    process_external_id: 55555555-5555-4555-8555-555555555555
                    hub_code: padrao
                    created: false
                    url: https://origination.example/sessao/parceiro/signed-token
                    expires_at: '2026-11-14T10:12:00-03:00'
        '201':
          description: Indicação criada.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateReferralResponse'
              examples:
                criada:
                  value:
                    process_external_id: 55555555-5555-4555-8555-555555555555
                    hub_code: padrao
                    created: true
                    url: https://origination.example/sessao/parceiro/signed-token
                    expires_at: '2026-11-14T10:12:00-03:00'
        '400':
          description: >
            Requisição malformada: JSON inválido ou truncado, corpo vazio, corpo
            que não é objeto,

            campo duplicado, tipo errado (por exemplo `amount` como número),
            campo desconhecido

            ou `Content-Type` diferente de `application/json` (só
            `charset=utf-8` é aceito).

            Corrija a requisição antes de repetir. Quando o problema pode ser
            atribuído a um campo, `details` o aponta.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                campo-desconhecido:
                  summary: Campo desconhecido
                  value:
                    error:
                      code: INVALID_REQUEST
                      message: Requisição inválida.
                      request_id: req-rest
                      details:
                        - field: customer.mother_name
                          reason: UNKNOWN_FIELD
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          description: >-
            O hub está inativo e não aceita novas indicações. Repetir a mesma
            requisição produz o mesmo resultado.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                hub-inativo:
                  value:
                    error:
                      code: HUB_INACTIVE
                      message: Hub inativo.
                      request_id: req-rest
        '413':
          $ref: '#/components/responses/PayloadTooLarge'
        '422':
          description: >
            A requisição está bem formada, mas foi recusada por uma regra de
            validação:


            - `VALIDATION_FAILED`: formato de algum dado do cliente, do valor ou
            do prazo, ou campo obrigatório
              ausente. `details` lista cada campo.
            - `LOAN_REQUEST_INVALID`: valor ou prazo bem formados, mas fora da
            faixa do hub. Ajuste pela faixa de `GET /ping`.

            - `HUB_NOT_FOUND`: `hub_code` inexistente ou de outro parceiro.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                validacao:
                  summary: VALIDATION_FAILED, com os campos em details
                  value:
                    error:
                      code: VALIDATION_FAILED
                      message: Dados inválidos. Veja os detalhes.
                      request_id: req-rest
                      details:
                        - field: customer.cpf
                          reason: INVALID_CHECK_DIGIT
                        - field: customer.name
                          reason: OUT_OF_RANGE
                faixa:
                  summary: LOAN_REQUEST_INVALID
                  value:
                    error:
                      code: LOAN_REQUEST_INVALID
                      message: Valor ou prazo fora da faixa do hub.
                      request_id: req-rest
                hub-inexistente:
                  summary: HUB_NOT_FOUND
                  value:
                    error:
                      code: HUB_NOT_FOUND
                      message: Hub não encontrado.
                      request_id: req-rest
        '429':
          description: >
            - `RATE_LIMITED`: excedeu o limite por minuto. Aguarde o
            `Retry-After` (segundos).

            - `CPF_DAILY_LIMIT_REACHED`: limite diário de encerramentos sem
            contrato do CPF. Aguarde o
              `retry_after` (próxima meia-noite de São Paulo) antes de tentar novamente. `Retry-After` também vem em segundos.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              examples:
                limite-por-minuto:
                  summary: RATE_LIMITED (Retry-After de 43 s)
                  value:
                    error:
                      code: RATE_LIMITED
                      message: Limite de requisições excedido.
                      request_id: req-rate
                limite-diario-do-cpf:
                  summary: CPF_DAILY_LIMIT_REACHED (Retry-After de 54000 s)
                  value:
                    error:
                      code: CPF_DAILY_LIMIT_REACHED
                      message: Limite diário de tentativas sem sucesso do CPF atingido.
                      request_id: req-rest
                      retry_after: '2026-10-16T00:00:00-03:00'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  parameters:
    XRequestId:
      name: X-Request-Id
      in: header
      required: false
      description: >
        Identificador da requisição, até 64 caracteres `[A-Za-z0-9_-]`. Se
        faltar ou for inválido, a Wincred gera um.

        Volta no header `X-Request-Id` da resposta e no `request_id` de todo
        erro.
      schema:
        type: string
        pattern: ^[A-Za-z0-9_-]{1,64}$
      example: meu-teste-001
  schemas:
    CreateReferralRequest:
      type: object
      additionalProperties: false
      required:
        - customer
      properties:
        hub_code:
          type: string
          maxLength: 32
          description: >
            Código de um hub do parceiro. Sem ele, vale o hub padrão. Vazio ou
            só espaços equivale a ausente.

            Hub inexistente ou de outro parceiro: 422 `HUB_NOT_FOUND`. Mais de
            32 caracteres: 422 `OUT_OF_RANGE`.
          example: padrao
        customer:
          $ref: '#/components/schemas/Customer'
        loan_request:
          $ref: '#/components/schemas/LoanRequest'
    CreateReferralResponse:
      type: object
      required:
        - process_external_id
        - hub_code
        - created
        - url
        - expires_at
      properties:
        process_external_id:
          type: string
          format: uuid
          description: >-
            Identificador do processo. Persista-o: é a chave do `GET` e de todo
            webhook.
        hub_code:
          type: string
          description: >-
            Hub do processo. No reaproveitamento, pode ser outro hub do
            parceiro.
        created:
          type: boolean
          description: '`false` quando devolveu o processo aberto do CPF em vez de criar um.'
        url:
          type: string
          format: uri
          description: Link da jornada do cliente. Gerado a cada pedido.
        expires_at:
          type: string
          format: date-time
          description: >-
            Validade do link, RFC 3339 com fuso de São Paulo. Link vencido sem
            termo assinado não muda o `status` (continua `awaiting_client`);
            reenvie o CPF para receber um link novo.
    ErrorEnvelope:
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/Error'
    Customer:
      type: object
      additionalProperties: false
      required:
        - cpf
        - name
      description: >
        Dados do cliente. Textos são aparados (trim); texto opcional vazio ou só
        com espaços vale como ausente.
      properties:
        cpf:
          type: string
          pattern: ^[0-9]{3}\.?[0-9]{3}\.?[0-9]{3}-?[0-9]{2}$
          description: >
            11 dígitos, com ou sem a máscara (`.` e `-`). Dígito verificador
            válido; dígitos todos iguais são recusados

            (`INVALID_CHECK_DIGIT`). Formato fora disso: `INVALID_FORMAT`.
            Normalizado para só dígitos.

            O CPF só trafega no corpo do POST; nunca vai em URL.
          example: 000.000.000-00
        name:
          type: string
          minLength: 3
          maxLength: 120
          description: >-
            De 3 a 120 caracteres depois do trim, sem caractere de controle
            (`INVALID_FORMAT`). Fora do tamanho: `OUT_OF_RANGE`.
          example: Ana
        phone:
          $ref: '#/components/schemas/Phone'
        email:
          type: string
          format: email
          maxLength: 254
          description: >-
            Um endereço só, sem nome de exibição (`Nome <a@b.com>` é recusado).
            Convertido para minúsculas. Mais de 254 caracteres: `OUT_OF_RANGE`.
          example: cliente.sintetico@example.com
        birth_date:
          type: string
          format: date
          description: >-
            `AAAA-MM-DD`, data existente, depois de 1900-01-01 e antes de hoje
            (fuso de São Paulo). Fora da faixa: `OUT_OF_RANGE`. A elegibilidade
            por idade não é checada aqui.
          example: '1988-04-17'
        address:
          $ref: '#/components/schemas/Address'
    LoanRequest:
      type: object
      additionalProperties: false
      required:
        - amount
        - installments
      description: >
        Valor e prazo pedidos. Se o objeto vier, os dois campos são
        obrigatórios. É um pedido: o cliente pode trocar

        valor e prazo na jornada. Fora da faixa do hub: 422
        `LOAN_REQUEST_INVALID` (faixa em `GET /ping`).
      properties:
        amount:
          type: string
          pattern: ^[0-9]+(\.[0-9]{1,2})?$
          description: >
            String decimal com ponto e até 2 casas, maior que zero e no máximo
            `999999999999.99`

            (formato inválido, como vírgula, expoente ou mais de 2 casas:
            `INVALID_FORMAT`; zero ou acima do teto: `OUT_OF_RANGE`).

            Enviar número JSON em vez de string é recusado com 400. Dentro da
            faixa do hub.
          example: '5000.00'
        installments:
          type: integer
          format: int32
          minimum: 1
          description: >-
            Inteiro maior que zero, dentro das opções de parcela do hub. Número
            fracionário é recusado com 400.
          example: 24
    Error:
      type: object
      required:
        - code
        - message
        - request_id
      description: >-
        Envelope de erro. Programe contra `code`; a `message` é um texto fixo
        por código e pode mudar de redação.
      properties:
        code:
          $ref: '#/components/schemas/ErrorCode'
        message:
          type: string
          description: Texto fixo em português para cada `code`.
        request_id:
          type: string
          description: O mesmo valor do header `X-Request-Id`. Informe-o ao suporte.
        details:
          type: array
          description: >
            Presente só quando o erro aponta campos: 422 `VALIDATION_FAILED`
            gerado na borda e 400 `INVALID_REQUEST`

            quando o campo é localizável (tipo errado, campo desconhecido, campo
            duplicado).
          items:
            $ref: '#/components/schemas/ErrorDetail'
        retry_after:
          type: string
          format: date-time
          description: >-
            Só em `CPF_DAILY_LIMIT_REACHED`: a próxima meia-noite de São Paulo,
            RFC 3339. O `Retry-After` (segundos) vem no header.
    Phone:
      type: object
      additionalProperties: false
      required:
        - country_code
        - area_code
        - number
      description: Se o objeto vier, os três campos são obrigatórios.
      properties:
        country_code:
          type: string
          pattern: ^55$
          description: 'Só dígitos, sem `+`. Na v1, só `55` (outro código: `NOT_ALLOWED`).'
          example: '55'
        area_code:
          type: string
          pattern: ^(1[1-9]|[2-9][0-9])$
          description: 'DDD com 2 dígitos, de 11 a 99 (abaixo de 11: `OUT_OF_RANGE`).'
          example: '11'
        number:
          type: string
          pattern: ^[0-9]{8,9}$
          description: 8 ou 9 dígitos, sem máscara.
          example: '987654321'
    Address:
      type: object
      additionalProperties: false
      required:
        - street
        - number
        - neighborhood
        - city
        - state
        - zip_code
      description: Se o objeto vier, todos os campos são obrigatórios, menos `complement`.
      properties:
        street:
          type: string
          minLength: 1
          maxLength: 120
          example: Rua Sintetica do Teste
        number:
          type: string
          minLength: 1
          maxLength: 10
          description: Aceita `S/N`.
          example: '77'
        complement:
          type: string
          maxLength: 60
          example: apto sintetico
        neighborhood:
          type: string
          minLength: 1
          maxLength: 50
          description: Limite de 50 caracteres, o do bairro no banco liquidante.
          example: Bairro Sintetico
        city:
          type: string
          minLength: 1
          maxLength: 60
          example: Cidade Sintetica
        state:
          type: string
          description: >-
            Sigla da UF em maiúsculas. Minúscula ou sigla inexistente:
            `INVALID_FORMAT`.
          enum:
            - AC
            - AL
            - AP
            - AM
            - BA
            - CE
            - DF
            - ES
            - GO
            - MA
            - MT
            - MS
            - MG
            - PA
            - PB
            - PR
            - PE
            - PI
            - RJ
            - RN
            - RS
            - RO
            - RR
            - SC
            - SE
            - SP
            - TO
          example: SP
        zip_code:
          type: string
          pattern: ^[0-9]{5}-?[0-9]{3}$
          description: >-
            8 dígitos, com ou sem o hífen. Ponto é recusado. Normalizado para só
            dígitos.
          example: 01001-000
    ErrorCode:
      type: string
      description: >
        | HTTP | `code` | Quando | O que fazer |

        |------|--------|--------|-------------|

        | 400 | `INVALID_REQUEST` | JSON malformado, tipo errado, campo
        desconhecido, `Content-Type` errado, id que não é UUID | Corrija; não
        repita igual |

        | 401 | `UNAUTHENTICATED` | Chave ausente, malformada, inválida ou
        revogada | Confira a chave |

        | 403 | `HUB_INACTIVE` | Hub desligado | Não repita |

        | 404 | `REFERRAL_NOT_FOUND` | Processo inexistente ou de outro parceiro
        | Confira o id |

        | 413 | `PAYLOAD_TOO_LARGE` | Corpo acima de 16 KB | Corrija |

        | 422 | `VALIDATION_FAILED` | Formato de dado do cliente, valor ou
        prazo, ou campo obrigatório ausente | Corrija pelos `details` |

        | 422 | `LOAN_REQUEST_INVALID` | Valor ou prazo fora da faixa do hub |
        Ajuste pela faixa de `GET /ping` |

        | 422 | `HUB_NOT_FOUND` | `hub_code` inexistente ou de outro parceiro |
        Corrija |

        | 422 | `WEBHOOK_NOT_CONFIGURED` | `POST /webhooks/test` sem
        `webhook_url` cadastrada | Fale com a Wincred |

        | 429 | `RATE_LIMITED` | Limite por minuto do parceiro | Espere o
        `Retry-After` |

        | 429 | `CPF_DAILY_LIMIT_REACHED` | Limite diário de indicações sem
        sucesso do CPF | Não repita antes de `retry_after` |

        | 500 | `INTERNAL_ERROR` | Erro nosso | Repita com espera |

        | 503 | `SERVICE_UNAVAILABLE` | API desligada, serviço fora do ar ou
        tempo máximo de 10 s | Repita com espera |
      enum:
        - INVALID_REQUEST
        - UNAUTHENTICATED
        - HUB_INACTIVE
        - REFERRAL_NOT_FOUND
        - PAYLOAD_TOO_LARGE
        - VALIDATION_FAILED
        - LOAN_REQUEST_INVALID
        - HUB_NOT_FOUND
        - WEBHOOK_NOT_CONFIGURED
        - RATE_LIMITED
        - CPF_DAILY_LIMIT_REACHED
        - INTERNAL_ERROR
        - SERVICE_UNAVAILABLE
    ErrorDetail:
      type: object
      required:
        - field
        - reason
      properties:
        field:
          type: string
          description: >-
            Caminho do campo com pontos, por exemplo
            `customer.address.zip_code`.
          example: customer.cpf
        reason:
          type: string
          description: >
            | `reason` | Significado |

            |----------|-------------|

            | `REQUIRED` | Campo obrigatório ausente ou vazio |

            | `INVALID_FORMAT` | Formato ou tipo inválido |

            | `INVALID_CHECK_DIGIT` | CPF com dígito verificador inválido ou
            dígitos repetidos |

            | `OUT_OF_RANGE` | Fora do tamanho ou da faixa permitida |

            | `NOT_ALLOWED` | Valor bem formado, mas não aceito (por exemplo,
            código de país diferente de 55) |

            | `UNKNOWN_FIELD` | Campo que a API não conhece |
          enum:
            - REQUIRED
            - INVALID_FORMAT
            - INVALID_CHECK_DIGIT
            - OUT_OF_RANGE
            - NOT_ALLOWED
            - UNKNOWN_FIELD
  headers:
    XRequestId:
      description: >-
        O `X-Request-Id` que você enviou (se válido) ou o que a Wincred gerou.
        Informe-o ao suporte.
      schema:
        type: string
        pattern: ^[A-Za-z0-9_-]{1,64}$
    RetryAfter:
      description: Segundos de espera antes de tentar novamente.
      schema:
        type: integer
        minimum: 1
  responses:
    Unauthenticated:
      description: Chave de API ausente, malformada, inválida ou revogada. Confira a chave.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            sem-chave:
              value:
                error:
                  code: UNAUTHENTICATED
                  message: Chave de API ausente, inválida ou revogada.
                  request_id: 0b9f3c2e-6d1a-4e8b-9c7d-2a4f6e8b0c1d
    PayloadTooLarge:
      description: Corpo acima de 16 KB. Reduza o corpo da requisição.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            corpo-grande:
              value:
                error:
                  code: PAYLOAD_TOO_LARGE
                  message: Corpo da requisição acima de 16 KB.
                  request_id: 0b9f3c2e-6d1a-4e8b-9c7d-2a4f6e8b0c1d
    InternalError:
      description: >-
        Erro interno da Wincred. Repita com espera; `POST /referrals` é seguro
        de repetir. Se persistir, informe o `request_id` ao time de integrações.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            erro-interno:
              value:
                error:
                  code: INTERNAL_ERROR
                  message: Erro interno.
                  request_id: req-rest
    ServiceUnavailable:
      description: >
        API desligada, serviço da Wincred fora do ar ou tempo máximo de 10 s
        excedido.

        Repita com espera.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/XRequestId'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            indisponivel:
              value:
                error:
                  code: SERVICE_UNAVAILABLE
                  message: Serviço indisponível.
                  request_id: 0b9f3c2e-6d1a-4e8b-9c7d-2a4f6e8b0c1d
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >
        Chave de API do parceiro, entregue pelo time de integrações da Wincred.
        Header:

        `Authorization: Bearer <chave do parceiro>` (o esquema `Bearer` não
        diferencia maiúsculas).

        Por segurança, chave ausente, malformada, inválida ou revogada recebem a
        mesma resposta: 401 `UNAUTHENTICATED`.

        Guarde a chave apenas no servidor e solicite a rotação ao time de
        integrações quando precisar trocá-la.

````

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