Upload attachments to an existing operation
curl --request POST \
--url https://api.finsync.ar/api/operations/{id}/attachments \
--header 'Content-Type: multipart/form-data' \
--header 'x-api-key: <api-key>' \
--form file=@example-file \
--form files=@example-fileconst form = new FormData();
form.append('file', '<string>');
form.append('files', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
options.body = form;
fetch('https://api.finsync.ar/api/operations/{id}/attachments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const form = new FormData();
form.append('file', '<string>');
form.append('files', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
options.body = form;
fetch('https://api.finsync.ar/api/operations/{id}/attachments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.finsync.ar/api/operations/{id}/attachments"
files = {
"file": ("example-file", open("example-file", "rb")),
"files": ("example-file", open("example-file", "rb"))
}
headers = {"x-api-key": "<api-key>"}
response = requests.post(url, files=files, headers=headers)
print(response.text){
"attachments": [
{
"id": 501,
"file_name": "factura-proveedor.pdf",
"mime_type": "application/pdf",
"size_bytes": 184320,
"created_at": "2026-04-09T18:30:00.000Z",
"uploaded_by": null,
"signed_url": "https://example.r2.cloudflarestorage.com/..."
}
]
}Operations
Upload attachments to an existing operation
Adds one or more files to an existing operation (the same storage path and OperationAttachment model as the dashboard). Typical flow: create a Pagos a proveedores operation with POST /api/operations, then attach the supplier invoice PDF here.
Limits (aligned with the dashboard / FS-04 upload budget)
- Content-Type:
multipart/form-data - Field name:
fileorfiles(repeat the part for several files, max 10) - Types (same allowlist as the dashboard, detected from magic bytes where they exist — not the filename alone): PDF; JPEG, PNG, GIF, WEBP, BMP, TIFF, SVG; XLSX/XLSM (ZIP +
xl/), XLS (OLE); DOCX (ZIP +word/), DOC (OLE); PPTX (ZIP +ppt/), PPT (OLE); CSV, TSV, TXT, JSON, XML (text, no NUL / low control-char ratio); ZIP; other non-executable files (application/octet-stream). Executables (MZ/ELF/Mach-O) are rejected. - Max request / file size: 25 MiB
- Optional
display_nameapplies when a single file is sent
Completed and adjusted operations accept attachments, matching the dashboard. Soft-deleted operations return 404.
POST
/
api
/
operations
/
{id}
/
attachments
Upload attachments to an existing operation
curl --request POST \
--url https://api.finsync.ar/api/operations/{id}/attachments \
--header 'Content-Type: multipart/form-data' \
--header 'x-api-key: <api-key>' \
--form file=@example-file \
--form files=@example-fileconst form = new FormData();
form.append('file', '<string>');
form.append('files', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
options.body = form;
fetch('https://api.finsync.ar/api/operations/{id}/attachments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const form = new FormData();
form.append('file', '<string>');
form.append('files', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
options.body = form;
fetch('https://api.finsync.ar/api/operations/{id}/attachments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.finsync.ar/api/operations/{id}/attachments"
files = {
"file": ("example-file", open("example-file", "rb")),
"files": ("example-file", open("example-file", "rb"))
}
headers = {"x-api-key": "<api-key>"}
response = requests.post(url, files=files, headers=headers)
print(response.text){
"attachments": [
{
"id": 501,
"file_name": "factura-proveedor.pdf",
"mime_type": "application/pdf",
"size_bytes": 184320,
"created_at": "2026-04-09T18:30:00.000Z",
"uploaded_by": null,
"signed_url": "https://example.r2.cloudflarestorage.com/..."
}
]
}Authorizations
API Key for authentication
Path Parameters
Existing operation ID
Body
multipart/form-data
Response
Uploaded attachments (same shape as GET)
Show child attributes
Show child attributes