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

> ## Agent Instructions
> A GYRA+ tem um servidor MCP oficial: https://mcp.gyramais.com.br/mcp. A autenticação é o login do próprio usuário na plataforma, não uma credencial separada. Instalação em https://developers.gyramais.com.br/mcp/instalacao.
> Prefira as tools do MCP a montar chamadas HTTP na mão quando o usuário já tem o conector ligado.
> Para analisar crédito de um CNPJ ou CPF, use create_report_v2 e assine um webhook em vez de fazer polling.
> Para ler um documento (contrato social, comprovante de residência, imposto de renda, balanço), use validate_document: a entrada é um arquivo só e a plataforma reconhece o tipo sozinha.
> Para pedir documentos ao cliente final, use create_collection com o slug de um modelo obtido em list_collection_templates.
> Documento (CNPJ/CPF) é dado pessoal: não o repita em log nem o envie a serviços de terceiros.

# Preparar Upload de Documento

> Arquivo acima de 15 MB, ou quando você não quer segurar a conexão esperando o parecer.

### Quando usar

Arquivo acima de 15 MB, ou quando você não quer segurar a conexão esperando o parecer. Primeiro passo do envio assíncrono.

### Como continuar

Suba o arquivo direto na `uploadUrl` com um `PUT`, usando o mesmo `Content-Type` e o mesmo tamanho declarados. Depois chame [Confirmar upload](/api-reference/registry/post-registry-id-documents) com a `key` que veio aqui.

<Warning>
  Use a `key` exatamente como ela voltou. Montar a chave no cliente não funciona.
</Warning>

<Note>
  Contexto e vocabulário em [Análise documental](/onboarding/analise-documental). Autenticação, versionamento e capacidades em [Visão geral da API](/api-reference/onboarding/visao-geral).
</Note>


## OpenAPI

````yaml post /v1/registry/{id}/documents/presign
openapi: 3.0.0
info:
  title: GYRA+ API - MCP Server
  description: >-
    API da Gyra+ para analise de credito. Spec curada para uso com agentes AI
    via MCP.
  version: '1.0'
  contact: {}
servers:
  - url: https://gyra-core.gyramais.com.br
    description: Producao
security: []
paths:
  /v1/registry/{id}/documents/presign:
    post:
      tags:
        - registry
      summary: Preparar o envio de um documento (URL assinada)
      description: >
        Primeiro passo do envio assincrono, para arquivos de ate 50MB (acima do
        teto de 15MB

        do validate_document).


        Devolve a URL assinada para o PUT e a `key` do arquivo. Suba o arquivo
        direto nessa URL, com o

        mesmo Content-Type e o mesmo tamanho declarados, e depois chame
        confirm_registry_document com a

        key que veio aqui. Nunca monte a key voce mesmo.
      operationId: RegistryController_presignDocument
      parameters:
        - name: id
          required: true
          in: path
          schema:
            type: string
          description: Id do cadastro.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PresignRegistryDocumentDto'
            example:
              fileName: contrato-social.pdf
              size: 1843200
              mimeType: application/pdf
      responses:
        '201':
          description: URL assinada para o PUT e a key a usar na confirmacao.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RegistryPresignResponse'
              example:
                key: >-
                  presigned/contrato-social-3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40.pdf
                uploadUrl: >-
                  https://<bucket>.s3.amazonaws.com/presigned/contrato-social-3f6c2a9e-8b1d-4c7a-9e2f-5a1b7c3d9e40.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Signature=...
                expiresInSeconds: 900
        '400':
          description: >-
            Corpo invalido: nome ausente, tamanho acima de 50MB (52.428.800
            bytes) ou tipo fora de PDF, JPG e PNG. A mensagem concatena todas as
            falhas por virgula.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
              example:
                code: 400
                message: Arquivo maior que 50MB.
        '401':
          description: >-
            Token ausente, expirado ou invalido. Gere outro em POST
            /auth/authenticate.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
              example:
                code: 401
                message: Token de acesso inválido.
        '403':
          description: O usuario autenticado nao tem a permissao exigida pela rota.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
              example:
                code: 403
                message: Você não tem permissão para acessar este recurso.
        '404':
          description: >-
            Recurso inexistente OU capacidade nao liberada para a organizacao.
            As duas coisas respondem 404 de proposito: para quem nao tem o
            modulo, a rota nao existe.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
              example:
                code: 404
                message: Recurso não encontrado.
        '500':
          description: >-
            Falha nossa. Tente de novo; se persistir, acione o suporte com o
            horario da chamada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
              example:
                code: 500
                message: Internal server error
        '502':
          description: O armazenamento nao respondeu. Tente de novo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
              example:
                code: 502
                message: Não foi possível preparar o upload do documento.
      security:
        - authorization: []
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: >
            curl --request POST
            'https://gyra-core.gyramais.com.br/v1/registry/6612a7f30000000000000001/documents/presign'
            \
              --header 'Authorization: Bearer <token>' \
              --header 'Content-Type: application/json' \
              --data '{"fileName":"contrato-social.pdf","size":1843200,"mimeType":"application/pdf"}'
        - lang: JavaScript
          label: Node
          source: >
            const resposta = await
            fetch("https://gyra-core.gyramais.com.br/v1/registry/6612a7f30000000000000001/documents/presign",
            {
              method: "POST",
              headers: {
                Authorization: `Bearer ${token}`,
                "Content-Type": "application/json",
              },
              body: JSON.stringify({
                "fileName": "contrato-social.pdf",
                "size": 1843200,
                "mimeType": "application/pdf"
              }),
            });


            const dados = await resposta.json();
        - lang: Python
          label: Python
          source: |
            import requests

            resposta = requests.post(
                "https://gyra-core.gyramais.com.br/v1/registry/6612a7f30000000000000001/documents/presign",
                headers={"Authorization": f"Bearer {token}"},
                json={
                    "fileName": "contrato-social.pdf",
                    "size": 1843200,
                    "mimeType": "application/pdf"
                },
            )

            dados = resposta.json()
components:
  schemas:
    PresignRegistryDocumentDto:
      type: object
      properties:
        fileName:
          type: string
          description: Nome do arquivo.
        size:
          type: integer
          minimum: 1
          maximum: 52428800
          description: >-
            Tamanho em bytes, ate 50MB. O PUT tem de mandar exatamente este
            tamanho.
        mimeType:
          type: string
          enum:
            - application/pdf
            - image/jpeg
            - image/png
          description: O PUT tem de mandar este mesmo Content-Type.
      required:
        - fileName
        - size
        - mimeType
    RegistryPresignResponse:
      type: object
      properties:
        key:
          type: string
          description: >-
            Use exatamente esta chave na confirmacao. Nunca monte a chave no
            cliente.
        uploadUrl:
          type: string
          description: >-
            URL para o PUT do arquivo, com o mesmo Content-Type e tamanho
            declarados.
        expiresInSeconds:
          type: integer
    ApiError:
      type: object
      description: >-
        Formato unico de erro da API. Nao faca match exato da mensagem: use o
        code.
      properties:
        code:
          type: integer
          description: Codigo HTTP.
        message:
          type: string
          description: >-
            Mensagem em portugues. Em erro de validacao, traz TODAS as falhas
            concatenadas por virgula.
  securitySchemes:
    authorization:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Enter JWT token

````

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