Contract attachments
Attachments are supplementary files of the contract, such as the commercial proposal or the signed termination agreement. They do not go through automated reading. The contract must be in pending_submission, active or expired.
To add an attachment:
- Create the attachment.
- Get the attachment upload URL.
- Upload the file straight to that URL.
To download the file, use attachments[].download_url in the contract retrieval.
Create attachment
| Profile | Host | Required permission |
|---|---|---|
| Manager | manager-api | Write |
| Consultant | consultant-api | Create Expense Contracts |
Base URL for each host: Environments (Hosts).
Path parameters
| Parameter | Type | Description |
|---|---|---|
fund_class_key | string | Fund class key (UUID). |
contract_key | string | Contract key (UUID). |
This call has no body.
Response
{
"attachment_key": "d4e5f6a7-b8c9-4d0e-8f1a-2b3c4d5e6f7a",
"status": "active",
"created_at": "2026-11-09T14:20:11.004512"
}
| Field | Type | Description |
|---|---|---|
attachment_key | string | Attachment key (UUID). |
status | string | active from creation; canceled after cancellation. |
created_at | string | Creation, ISO 8601 without a time zone. |
Get attachment upload URL
Permission: Manager (manager-api): Write. Consultant (consultant-api): Create Expense Contracts.
Path parameters
| Parameter | Type | Description |
|---|---|---|
fund_class_key | string | Fund class key (UUID). |
contract_key | string | Contract key (UUID). |
attachment_key | string | Attachment key (UUID). |
Response
{
"attachment_key": "d4e5f6a7-b8c9-4d0e-8f1a-2b3c4d5e6f7a",
"status": "active",
"created_at": "2026-11-09T14:20:11.004512",
"upload_url": {
"url": "https://<link-temporario-de-envio>",
"fields": {
"key": "3f2b8c1e-7d4a-4e9b-9a61-0c5d2e8f4b17/d4e5f6a7-b8c9-4d0e-8f1a-2b3c4d5e6f7a",
"policy": "<policy>",
"x-amz-algorithm": "AWS4-HMAC-SHA256",
"x-amz-credential": "<credential>",
"x-amz-date": "20261109T142100Z",
"x-amz-signature": "<signature>"
}
}
}
Upload the file as for the contract document: POST multipart/form-data to upload_url.url, with all the fields from upload_url.fields and the file in the file field. The URL expires in 3 minutes and accepts files up to 50 MB.
A new upload replaces the attachment's file. There is no confirmation call.
Cancel attachment
Marks the attachment as canceled. Canceling an already canceled attachment has no effect.
Permission: Manager (manager-api): Write. Consultant (consultant-api): Update Expense Contracts.
Path parameters
| Parameter | Type | Description |
|---|---|---|
fund_class_key | string | Fund class key (UUID). |
contract_key | string | Contract key (UUID). |
attachment_key | string | Attachment key (UUID). |
Response
No response body.
Errors
| Status | code | When it happens |
|---|---|---|
| 404 | ECT000005 | The fund class does not exist or you do not have access to it. |
| 404 | ECT000009 | The contract does not exist in this fund class. |
| 404 | ECT000050 | The attachment does not exist in this contract. |
| 409 | ECT000048 | The contract is not in pending_submission, active or expired. |
{
"title": "Attachment not allowed",
"description": "Attachments are not handled on a contract in status canceled.",
"translation": "Anexos nao sao tratados num contrato com status canceled.",
"code": "ECT000048"
}
Authentication, permission and host errors: see API Errors.