Documento do contrato
O PDF do contrato é enviado em duas etapas:
- Obtenha a URL de envio pela API.
- Envie o arquivo direto para essa URL.
Regras do documento:
- Envie um PDF sem senha, como exige a leitura automática.
- Com
signature_method: external, envie o contrato já assinado. - Enquanto o contrato está em
pending_submission, um novo envio substitui o anterior. - No envio para análise, o documento é congelado e não pode mais ser trocado.
Obter URL de envio
Disponível em
| Perfil | Host | Permissão exigida |
|---|---|---|
| Gestora | manager-api | Escrita |
| Consultoria | consultant-api | Criar Contratos de Despesa |
URL base de cada host: Ambientes (Hosts).
ENDPOINT
/expense_contract/fund_class/{fund_class_key}/contract/{contract_key}/document/upload_urlMÉTODO
GETParâmetros de caminho
| Parâmetro | Tipo | Descrição |
|---|---|---|
fund_class_key | string | Chave da classe de fundo (UUID). |
contract_key | string | Chave do contrato (UUID). |
Resposta
STATUS
200O contrato, na estrutura descrita em atributos do contrato, com o campo adicional upload_url.
Trecho da resposta
{
"contract_key": "3f2b8c1e-7d4a-4e9b-9a61-0c5d2e8f4b17",
"status": "pending_submission",
"upload_url": {
"url": "https://<link-temporario-de-envio>",
"fields": {
"key": "3f2b8c1e-7d4a-4e9b-9a61-0c5d2e8f4b17_draft",
"x-amz-algorithm": "AWS4-HMAC-SHA256",
"x-amz-credential": "<credential>",
"x-amz-date": "20261109T141000Z",
"x-amz-security-token": "<token>",
"policy": "<policy>",
"x-amz-signature": "<signature>"
}
}
}
| Campo | Tipo | Descrição |
|---|---|---|
upload_url.url | string | Endereço para onde o arquivo deve ser enviado. |
upload_url.fields | object | Campos que acompanham o arquivo. Envie todos, sem alterar nomes nem valores. Não fixe a lista de campos no seu código: o conjunto exato pode variar. |
Enviar o arquivo
Faça um POST multipart/form-data para upload_url.url:
- Inclua todos os campos de
upload_url.fields. - Coloque o arquivo no campo
file, o último do formulário. - Não envie os cabeçalhos de autenticação da QI Tech: essa chamada vai direto para o armazenamento.
A URL expira em 3 minutos e aceita arquivos de até 50 MB.
import requests
upload = response_body["upload_url"]
with open("contrato_auditoria_2027.pdf", "rb") as arquivo:
resposta = requests.post(
upload["url"],
data=upload["fields"],
files={"file": arquivo},
)
resposta.raise_for_status()
Uma resposta 204 indica envio concluído. Não há chamada de confirmação: a API só verifica o documento no envio para análise. Se a URL expirar, peça outra.
Para conferir o arquivo enviado, baixe-o por download_url na consulta do contrato.
Erros
| Status | code | Quando acontece |
|---|---|---|
| 404 | ECT000005 | A classe de fundo não existe ou você não tem acesso a ela. |
| 404 | ECT000009 | O contrato não existe nessa classe de fundo. |
| 409 | ECT000017 | O contrato não está em pending_submission: o documento já foi congelado e não pode ser trocado. |
| 409 | ECT000046 | O contrato foi criado pela QI Tech na estruturação do fundo e não aceita esta chamada. |
Erros de autenticação, permissão e host: veja Erros da API.
Próximo passo
Envio para análise: envie o contrato para a análise da QI Tech.