{ "opencollection": "1.0.0", "info": { "name": "Opply Activity Feed Files API", "version": "0.0.0" }, "items": [ { "info": { "name": "Files", "type": "folder" }, "items": [ { "info": { "name": "Get file metadata", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v1/files/:uuid/", "params": [ { "name": "uuid", "value": "", "type": "path" } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Unified read access to any tenant file.\n\nA single ``/api/v1/files//`` rail backs every file source the user\ncan already reach via the REST API (task attachments, order docs, PO\nPDFs, financial documents, …) — resolution and auth go through the\nregistry at ``apps/files/services/file_registry.py``.\n\nThe MCP ``get_file`` tool is a thin wrapper over this viewset; the\nperimeter lives here." }, { "info": { "name": "Download file bytes", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v1/files/:uuid/content/", "params": [ { "name": "uuid", "value": "", "type": "path" } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Unified read access to any tenant file.\n\nA single ``/api/v1/files//`` rail backs every file source the user\ncan already reach via the REST API (task attachments, order docs, PO\nPDFs, financial documents, …) — resolution and auth go through the\nregistry at ``apps/files/services/file_registry.py``.\n\nThe MCP ``get_file`` tool is a thin wrapper over this viewset; the\nperimeter lives here." }, { "info": { "name": "Get a short-lived signed download URL", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v1/files/:uuid/url/", "params": [ { "name": "uuid", "value": "", "type": "path" } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Unified read access to any tenant file.\n\nA single ``/api/v1/files//`` rail backs every file source the user\ncan already reach via the REST API (task attachments, order docs, PO\nPDFs, financial documents, …) — resolution and auth go through the\nregistry at ``apps/files/services/file_registry.py``.\n\nThe MCP ``get_file`` tool is a thin wrapper over this viewset; the\nperimeter lives here." }, { "info": { "name": "[staff] Mint a pending attachment + presigned upload", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v1/files/attachments/", "body": { "type": "json", "data": "{}" }, "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Staff-only test harness for the generic attachments flow." }, { "info": { "name": "[staff] Get an attachment's scan status", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v1/files/attachments/:uuid/", "params": [ { "name": "uuid", "value": "", "type": "path" } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Staff-only test harness for the generic attachments flow." }, { "info": { "name": "[staff] Confirm upload (drives the scan-disabled promotion)", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v1/files/attachments/:uuid/confirm/", "params": [ { "name": "uuid", "value": "", "type": "path" } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Staff-only test harness for the generic attachments flow." }, { "info": { "name": "[staff] Get a presigned download URL", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v1/files/attachments/:uuid/url/", "params": [ { "name": "disposition", "value": "", "type": "query", "description": "Content-Disposition of the signed URL: 'attachment' (default, browser downloads the file) or 'inline' (browser renders it in place, e.g. a PDF preview opened in a new tab)." }, { "name": "uuid", "value": "", "type": "path" }, { "name": "variant", "value": "", "type": "query", "description": "Which object to sign: 'original' (default, full-size) or 'thumbnail' (downscaled image preview). A 409 is returned for 'thumbnail' when none has been generated — fall back to 'original'." } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Staff-only test harness for the generic attachments flow." }, { "info": { "name": "Mint a pending message attachment + presigned upload", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v1/files/message-attachments/", "body": { "type": "json", "data": "{}" }, "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Create an unbound, PENDING message attachment scoped to the caller's company and return a presigned POST for the browser to upload the bytes directly to S3." }, { "info": { "name": "Get a message attachment's scan status", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v1/files/message-attachments/:uuid/", "params": [ { "name": "uuid", "value": "", "type": "path" } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Return the malware-scan lifecycle state of one of the caller's own message attachments." }, { "info": { "name": "Confirm upload (drives the scan-disabled promotion)", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v1/files/message-attachments/:uuid/confirm/", "params": [ { "name": "uuid", "value": "", "type": "path" } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Signal that the client finished uploading the bytes; backfills the size and, when malware scanning is disabled, promotes the object and marks it SKIPPED." }, { "info": { "name": "Get a presigned download URL", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v1/files/message-attachments/:uuid/url/", "params": [ { "name": "disposition", "value": "", "type": "query", "description": "Content-Disposition of the signed URL: 'attachment' (default, browser downloads the file) or 'inline' (browser renders it in place, e.g. a PDF preview opened in a new tab)." }, { "name": "uuid", "value": "", "type": "path" }, { "name": "variant", "value": "", "type": "query", "description": "Which object to sign: 'original' (default, full-size) or 'thumbnail' (downscaled image preview). A 409 is returned for 'thumbnail' when none has been generated — fall back to 'original'." } ], "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Return a short-lived presigned GET URL for a downloadable (CLEAN/SKIPPED) attachment." }, { "info": { "name": "api_v1_files_upload_create", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v1/files/upload/", "body": { "type": "json", "data": "{}" }, "auth": { "type": "apikey", "key": "Authorization", "value": "{{Authorization}}", "placement": "header" } }, "docs": "Handle file upload requests.\nfile_name = Name of the file being uploaded\nmodel_name = Name of the model related to this file. eg. for chats it would be 'Message'\nfield_name = Name of the field on the model where file is stored. eg. for chats it would be 'attachment'" } ] } ], "bundled": true }