Clio Documents API

Clio Documents are files uploaded to Clio. Files uploaded to Clio’s document integrations (e.g. Google Drive and Office365) are inaccessible through the API. [Support Link](https://help.clio.com/hc/en-us/articles/9290308200091-Generate-Manage-and-Share-Documents#create-upload-and-share-documents-in-clio-manage-0-3) ## Uploading a new document [Create a document](#operation/Document%23create) to a parent that can refer to a `Matter` or a `Folder`. Ensure to ask for the fields, `id` and `latest_document_version{uuid,put_url,put_headers}`. The `put_url` is a signed URL with security credentials for uploading the document. The `put_headers` are required request headers for uploading the document. Check out the example to upload a new document to the matter folder of `Matter` with id `1`: ```json Request POST api/v4/documents?fields=id,latest_document_version{uuid,put_url,put_headers} "data": { "name": "file.jpg", "parent": { "id": 1, "type": "Matter" } } Response { "data": { "id": 1234, "latest_document_version": { "uuid": "a51faa2c-859e-4c08-a996-2d0bb385df90", "put_url": "https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/a51faa2c-859e-4c08-a996-2d0bb385df90/file.jpg?X-Amz-Expires=28800&X-Amz-Date=20171024T214532Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_key}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-server-side-encryption&X-Amz-Signature=afe5000df0972d02884a2219f913bfa62fe2531c75b4fcd1edbcb84d267d2b8e", "put_headers": [ { "name": "x-amz-server-side-encryption", "value": "AES256" }, { "name": "Content-Type", "value": "image/jpeg" } ] } } } ``` If the extension is listed in the [IANA Media Types registry](https://www.iana.org/assignments/media-types/media-types.xhtml) Clio will apply the corresponding content type as determined by the file extension when `content_type` is blank. One of the nine possible content types `content_type` = “text” / “image” / “audio” / “video” / “application” / “font” / “model” / “message” / “multipart” must be submitted if the file type is uncommon, not listed in the [IANA Media Types registry](https://www.iana.org/assignments/media-types/media-types.xhtml) or not obvious from the extension. ### Upload the document Upload the document to the `put_url` with the headers from `puts_headers` given in the response of the previous step. Typically the headers include `Content-Type` and `x-amz-server-side-encryption` to match with the signature in the `put_url`. Check out the example to upload the file content using curl: ```bash curl -X PUT -T file.jpg -H "Content-Type: image/jpeg" -H "x-amz-server-side-encryption: AES256" "https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/a51faa2c-859e-4c08-a996-2d0bb385df90/file.jpg?X-Amz-Expires=28800&X-Amz-Date=20171024T214532Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_key}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-server-side-encryption&X-Amz-Signature=afe5000df0972d02884a2219f913bfa62fe2531c75b4fcd1edbcb84d267d2b8e" ``` If you need MD5 checksum, you should use multipart upload. ### Mark the document as fully-uploaded After successfully completing the upload, [mark the document fully uploaded](#operation/Document%23update) with `fully_uploaded` as `true`, and `uuid` given in the first step. Clio will verify if the file is uploaded successfully. If not, it raises `UploadNotFoundError` error. It is possible for the verification to time out, which will return an `UploadTimeoutError` error. When that happens, you will need to retry the request. ```json Request PATCH api/v4/documents/1234?fields=id,latest_document_version{fully_uploaded} "data": { "uuid": "a51faa2c-859e-4c08-a996-2d0bb385df90", "fully_uploaded": "true" } } Response (success) { "data": { "id": 12345, "latest_document_version": { "fully_uploaded": true } } } Response (error) { "error": { "type": "UploadNotFoundError", "message": "A matching remote file was not found for the file named file.jpg with UUID a51faa2c-859e-4c08-a996-2d0bb385df90" } } Response (timeout) { "error": { "type": "UploadTimeoutError", "message": "A timeout occurred verifying the remote file. Please try the request again." } } ``` The file is now visible in Clio documents and is available to the user for download. ## Uploading a new document version It is same as uploading a new document to Clio except setting the `parent` to an existing `Document`. Check out the example to upload a new document version for the document with id `1234`: ```json Request POST api/v4/documents?fields=id,latest_document_version{uuid,put_url,put_headers} "data": { "name": "file.jpg", "parent": { "id": 1234, "type": "Document" } } } ``` The remaining steps are same as uploading a new document to Clio. ## Uploading a document using multipart upload In general, when a file reaches 100 MB, you should consider using multipart upload instead of uploading in a single operation. Except the last part, each part should be at least 5 MB. Determine the number of file parts and split the file. Optionally, you may compute the base64-encoded 128-bit MD5 mechanism as an end-to-end integrity check for each file part. To determine the base64 MD5 checksum for a file part, you may use `openssl`. Check out the example to split a big pdf and get the checksums of the file parts: ```bash split -b 31457280 big.pdf big.pdf. # break the file to max. 30MB size openssl md5 -binary big.pdf.aa | base64 # F16pda4G0h4lzH7d2/Jbdw== openssl md5 -binary big.pdf.ab | base64 # cRbxEG//GK9rIze5tdYzcg== openssl md5 -binary big.pdf.ac | base64 # Tck0KKU4SrmSp8hsSCuSYg== openssl md5 -binary big.pdf.ad | base64 # CrIt7lbZzVhMV7JzVTkUvw== ``` ### Create the document [Create a document](#operation/Document%23create), specify `multiparts` for multipart upload, and ensure to ask for the fields, `id`, and `latest_document_version{uuid,multiparts}`. A `multipart` consists of `part_number`, `content_length`, and optional `content_md5`. In the response, a `put_url` is appended to the `multipart`. A `put_url` is a signed URL with security credentials for uploading a file part. The signed URL expires in 8 hours. The API can handle maximum 50 `multiparts` in one request. If the upload is split to more than 50 parts, [make a PUT request](#operation/Document%23update) with `uuid`, `fully_uploaded` as `false`, and another set of `multiparts`. It returns a set of `put_url` for the specified `multiparts`. Check out the example to upload a new document to the matter folder of `Matter` with id `1`: ```json Request POST api/v4/documents?fields=id,latest_document_version{uuid,put_headers,multiparts} "data": { "name": "big.pdf", "parent": { "id": 1, "type": "Matter" } "multiparts": [ { "part_number": 1, "content_length": 31457280, "content_md5": "F16pda4G0h4lzH7d2/Jbdw==" }, { "part_number": 2, "content_length": 31457280, "content_md5": "cRbxEG//GK9rIze5tdYzcg==" }, { "part_number": 3, "content_length": 31457280, "content_md5": "Tck0KKU4SrmSp8hsSCuSYg==" }, { "part_number": 4, "content_length": 7316647, "content_md5": "CrIt7lbZzVhMV7JzVTkUvw==" } ] } Response { "data": { "id": 1234, "latest_document_version": { "uuid": "eba78724-31e8-4529-b6e2-0f2eef6feeec", "put_headers": [ { "name": "x-amz-server-side-encryption", "value": "AES256" }, { "name": "Content-Type", "value": "application/pdf" } ], "multiparts": [ { "part_number": 1, "put_url": "https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=1&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=f7b3f29e4aee3abfa93fb42a7969557a2a0d305d223dde641c78421b5a6d62e0", "put_headers": [ { "name": "Content-Length", "value": "31457280" }, { "name": "Content-MD5", "value": "F16pda4G0h4lzH7d2/Jbdw==" } ] }, { "part_number": 2, "put_url": "https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=2&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=47dc30f90202654c13030ccce87e43622bb47e0ad155ae61f6b41e8097803950", "put_headers": [ { "name": "Content-Length", "value": "31457280" }, { "name": "Content-MD5", "value": "cRbxEG//GK9rIze5tdYzcg==" } ] }, { "part_number": 3, "put_url": "https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=3&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=13ca827a73fb2c50e8062ef7e437cfe9158944d998e2770a2ffcd034be6c2fc7", "put_headers": [ { "name": "Content-Length", "value": "31457280" }, { "name": "Content-MD5", "value": "Tck0KKU4SrmSp8hsSCuSYg==" } ] }, { "part_number": 4, "put_url": "https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=4&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=25773f971c4c663b3a87f4d35c5b4c5192c3c999c7efdd69a49bc5bc40677078", "put_headers": [ { "name": "Content-Length", "value": "7316647" }, { "name": "Content-MD5", "value": "CrIt7lbZzVhMV7JzVTkUvw==" } ] } ] } } } ``` ### Upload the document Upload each multipart to the corresponding `put_url`. You can upload the parts independently and in any order. If transmission of any part fails, you can re-transmit that part without affecting other parts. Make sure to include the headers from `puts_headers`. Typically the headers include `Content-Length`, to match with the signature in the `put_url`. Check out the example using curl: ```bash curl -X PUT -T big.pdf.part1 -H "Content-Length: 31457280" "https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=1&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=f7b3f29e4aee3abfa93fb42a7969557a2a0d305d223dde641c78421b5a6d62e0" ``` If you use MD5 checksum to validate the integrity of upload, include `Content-MD5` in the header: ```bash curl -X PUT -T big.pdf.part1 -H "Content-Length: 31457280" -H "Content-MD5: F16pda4G0h4lzH7d2/Jbdw==" "https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=1&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=f7b3f29e4aee3abfa93fb42a7969557a2a0d305d223dde641c78421b5a6d62e0" ``` If the file is invalid or the MD5 is invalid, you may get the following response: ```bash BadDigest The Content-MD5 you specified did not match what we received. F16pda4G0h4lzH7d2/Jbdw== Tck0KKU4SrmSp8hsSCuSYg== 85918626116672DD AbAoiqYqn8tKwS6gxwI3pc4u02B6u6ORa6MPEJH7IYljBweZp0M8L7Lg2AFOvHxdHz5TwlQpkVs= ``` After the issue is corrected, try to upload to the file part to the `put_url` again. ### Mark the document as fully-uploaded After successfully completing the upload of all the file parts, [mark the document fully uploaded](#operation/Document%23update) with `fully_uploaded` as `true`, and `uuid` given in the first step. Clio will verify if the file is uploaded successfully. If not, it raises `UploadNotFoundError` error. It is possible for the verification to time out, which will return an `UploadTimeoutError` error. When that happens, you will need to retry the request. ```json Request PATCH api/v4/documents/1234?fields=id,latest_document_version{fully_uploaded} "data": { "uuid": "eba78724-31e8-4529-b6e2-0f2eef6feeec", "fully_uploaded": "true" } } Response (success) { "data": { "id": 12345, "latest_document_version": { "fully_uploaded": true } } } Response (error) { "error": { "type": "UploadNotFoundError", "message": "A matching remote file was not found for the file named file.jpg with UUID a51faa2c-859e-4c08-a996-2d0bb385df90" } } Response (timeout) { "error": { "type": "UploadTimeoutError", "message": "A timeout occurred verifying the remote file. Please try the request again." } } ``` The file is now visible in Clio documents and is available to the user for download. ## Uploading a new document version using multipart upload It is same as splitting and uploading a new document using multipart upload, except setting the `parent` to an existing `Document`. Check out the example to upload a new document version for the document with id `1234`: ```bash Request POST api/v4/documents?fields=id,latest_document_version{uuid,put_headers,multiparts} "data": { "name": "big.pdf", "parent": { "id": 1234, "type": "Document" } "multiparts": [ { "part_number": 1, "content_length": 31457280, "content_md5": "F16pda4G0h4lzH7d2/Jbdw==" }, { "part_number": 2, "content_length": 31457280, "content_md5": "cRbxEG//GK9rIze5tdYzcg==" }, { "part_number": 3, "content_length": 31457280, "content_md5": "Tck0KKU4SrmSp8hsSCuSYg==" }, { "part_number": 4, "content_length": 7316647, "content_md5": "CrIt7lbZzVhMV7JzVTkUvw==" } ] } ``` The remaining steps are same as uploading a new document to Clio.

OpenAPI Specification

clio-documents-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: Clio API Documentation Activities Documents API
  contact:
    name: Clio API Support
    email: api@clio.com
  description: "# Developer Support and Feedback\n* Clio takes the availability and stability of our API seriously; please report any **degradations** or **breakages** to Clio's API Support team at [api@clio.com](mailto:api@clio.com).\n* For business and partnership inquiries, contact our API Partnerships team at [api.partnerships@clio.com](mailto:api.partnerships@clio.com).\n* For best practices and tips from the Clio development community, join the conversation in the [Clio Developer Slack Channel](https://join.slack.com/t/clio-public/shared_invite/zt-36i0eqgo1-7POORPtMJpp2N0~_auL2IQ).\n\nA community-driven [Clio Developers Stack Overflow Group](https://stackoverflow.com/questions/tagged/clio-api) also exists where you can connect and ask questions from other Clio API users.\n# Getting Started\n> **Note:** The API is available in four distinct data regions: Australia (au.app.clio.com), Canada (ca.app.clio.com), EU (eu.app.clio.com) and US (app.clio.com).\n>\n> Likewise, the developer portal is available at region-specific links for the [Australia](https://au.developers.clio.com), [Canada](https://ca.developers.clio.com), [EU](https://eu.developers.clio.com), and [US](https://developers.clio.com) regions.\n>\n> This document assumes the US region is being used (app.clio.com). If you're building in one of the other regions, you should adapt the links and examples as necessary.\n\nTo start building on the Clio API, you’ll need a Clio account – you can review our [Developer Handbook](https://docs.developers.clio.com/) and follow the steps to sign up for an account.\n\nOnce you have an account, you can [create a developer application](https://docs.developers.clio.com/api-docs/applications) from the [Developer Portal](https://developers.clio.com) and start building!\n# Authorization with OAuth 2.0\nSee our [Authorization documentation →](https://docs.developers.clio.com/api-docs/authorization)\n# Permissions\nSee our [Permissions documentation →](https://docs.developers.clio.com/api-docs/permissions)\n# Fields\nSee our [Fields documentation →](https://docs.developers.clio.com/api-docs/fields)\n# Rate Limiting\nSee our [Rate Limits documentation →](https://docs.developers.clio.com/api-docs/rate-limits)\n# Paging\nSee our [Pagination documentation →](https://docs.developers.clio.com/api-docs/paging)\n# ETags\nSee our [ETags documentation →](https://docs.developers.clio.com/api-docs/etags)\n# Minor Versions\nAPI v4 supports multiple minor versions. Versions are of the form '4.X.Y'. To request a specific version, you can use an `X-API-VERSION` header in your request, with the header value set to the API version you're requesting. If this header is omitted, it will be treated as a request for the default API version. If the header is present but invalid, it will return a `410 Gone` response. If the header is present and valid, but it is no longer supported, it will return a `410 Gone` response.\n\nAn `X-API-VERSION` will be included in all successful responses, with the value being set to the API version used.\n\nYou can find our [API Versioning Policy and Guidelines](https://docs.developers.clio.com/api-docs/api-versioning-policy) in our documentation hub.\n\nThe [API Changelog](https://docs.developers.clio.com/api-docs/api-changelog) explains each version's changes in further detail.\n### [4.0.4](https://docs.developers.clio.com/api-docs/api-changelog#404)\n\n  * Update `quantity` field to return values in seconds rather than hours for Activities\n\n### [4.0.5](https://docs.developers.clio.com/api-docs/api-changelog#405)\n\n  * Remove `matter_balances` field from Bills\n* Standardize status/state enum values\n* Add a Document association to completed DocumentAutomations\n* Add rate visibility handling for Activity's price and total\n\n### [4.0.6](https://docs.developers.clio.com/api-docs/api-changelog#406)\n\n  * Remove `document_versions` collection field from Documents\n\n### [4.0.7](https://docs.developers.clio.com/api-docs/api-changelog#407)\n\n  * Change secure link format\n\n### [4.0.8](https://docs.developers.clio.com/api-docs/api-changelog#408)\n\n  * `Activity` hours are redacted in the response based on the activity hours visibility setting for the user\n  * Add `quantity_redacted` field to activities\n\n### [4.0.9](https://docs.developers.clio.com/api-docs/api-changelog#409)\n\n  * Contacts are filtered and redacted in the response based on the new 'Contacts Visibility' user permission setting.\n\n### [4.0.10](https://docs.developers.clio.com/api-docs/api-changelog#4010)\n\n  * Fixed validation of `type` query parameter when querying Notes\n\n### [4.0.12](https://docs.developers.clio.com/api-docs/api-changelog#4012)\n\n  * Restrict fields for CalendarEntry that should only be visible to event owners, editors, and viewers\n\n### [4.0.13](https://docs.developers.clio.com/api-docs/api-changelog#4013)\n\n  **This is the default version**\n\n  * Add association limits to Contacts\n* Returns 422 Unprocessable Entity when association limits are exceeded\n\n\n"
  version: v4
  x-logo:
    url: https://www.clio.com/wp-content/uploads/2015/05/Container-5-Logo.png
servers:
- url: https://app.clio.com/api/v4
  description: US region Production Server
- url: https://eu.app.clio.com/api/v4
  description: Europe region Production Server
- url: https://ca.app.clio.com/api/v4
  description: Canada region Production Server
- url: https://au.app.clio.com/api/v4
  description: Australia region Production Server
tags:
- name: Documents
  description: "Clio Documents are files uploaded to Clio. Files uploaded to Clio’s document integrations (e.g. Google Drive and Office365) are inaccessible through the API.\n\n[Support Link](https://help.clio.com/hc/en-us/articles/9290308200091-Generate-Manage-and-Share-Documents#create-upload-and-share-documents-in-clio-manage-0-3)\n\n## Uploading a new document\n[Create a document](#operation/Document%23create) to a parent that can refer to a `Matter` or a `Folder`. Ensure to ask for the fields, `id` and `latest_document_version{uuid,put_url,put_headers}`. The `put_url` is a signed URL with security credentials for uploading the document. The `put_headers` are required request headers for uploading the document. Check out the example to upload a new document to the matter folder of `Matter` with id `1`:\n```json\nRequest\n  POST api/v4/documents?fields=id,latest_document_version{uuid,put_url,put_headers}\n    \"data\": {\n      \"name\": \"file.jpg\",\n      \"parent\": {\n        \"id\": 1,\n        \"type\": \"Matter\"\n      }\n    }\n\nResponse\n  {\n    \"data\": {\n      \"id\": 1234,\n      \"latest_document_version\": {\n        \"uuid\": \"a51faa2c-859e-4c08-a996-2d0bb385df90\",\n        \"put_url\": \"https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/a51faa2c-859e-4c08-a996-2d0bb385df90/file.jpg?X-Amz-Expires=28800&X-Amz-Date=20171024T214532Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_key}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-server-side-encryption&X-Amz-Signature=afe5000df0972d02884a2219f913bfa62fe2531c75b4fcd1edbcb84d267d2b8e\",\n        \"put_headers\": [\n          {\n            \"name\": \"x-amz-server-side-encryption\",\n            \"value\": \"AES256\"\n          },\n          {\n            \"name\": \"Content-Type\",\n            \"value\": \"image/jpeg\"\n          }\n        ]\n      }\n    }\n  }\n```\nIf the extension is listed in the [IANA Media Types registry](https://www.iana.org/assignments/media-types/media-types.xhtml) Clio will apply the corresponding content type as determined by the file extension when `content_type` is blank. One of the nine possible content types  `content_type` = “text” / “image” / “audio” / “video” / “application” / “font” / “model” / “message” / “multipart” must be submitted if the file type is uncommon, not listed in the [IANA Media Types registry](https://www.iana.org/assignments/media-types/media-types.xhtml) or not obvious from the extension.\n\n### Upload the document\nUpload the document to the `put_url` with the headers from `puts_headers` given in the response of the previous step. Typically the headers include `Content-Type` and `x-amz-server-side-encryption` to match with the signature in the `put_url`. Check out the example to upload the file content using curl:\n```bash\ncurl -X PUT -T file.jpg\n  -H \"Content-Type: image/jpeg\"\n  -H \"x-amz-server-side-encryption: AES256\"\n  \"https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/a51faa2c-859e-4c08-a996-2d0bb385df90/file.jpg?X-Amz-Expires=28800&X-Amz-Date=20171024T214532Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_key}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-server-side-encryption&X-Amz-Signature=afe5000df0972d02884a2219f913bfa62fe2531c75b4fcd1edbcb84d267d2b8e\"\n```\nIf you need MD5 checksum, you should use multipart upload.\n\n### Mark the document as fully-uploaded\nAfter successfully completing the upload, [mark the document fully uploaded](#operation/Document%23update) with `fully_uploaded` as `true`, and `uuid` given in the first step. Clio will verify if the file is uploaded successfully. If not, it raises `UploadNotFoundError` error. It is possible for the verification to time out, which will return an `UploadTimeoutError` error. When that happens, you will need to retry the request.\n```json\nRequest\n  PATCH api/v4/documents/1234?fields=id,latest_document_version{fully_uploaded}\n    \"data\": {\n      \"uuid\": \"a51faa2c-859e-4c08-a996-2d0bb385df90\",\n      \"fully_uploaded\": \"true\"\n    }\n  }\n\nResponse (success)\n  {\n    \"data\": {\n      \"id\": 12345,\n      \"latest_document_version\": {\n          \"fully_uploaded\": true\n      }\n    }\n  }\nResponse (error)\n  {\n    \"error\": {\n      \"type\": \"UploadNotFoundError\",\n      \"message\": \"A matching remote file was not found for the file named file.jpg with UUID a51faa2c-859e-4c08-a996-2d0bb385df90\"\n    }\n  }\nResponse (timeout)\n  {\n    \"error\": {\n      \"type\": \"UploadTimeoutError\",\n      \"message\": \"A timeout occurred verifying the remote file. Please try the request again.\"\n    }\n  }\n```\nThe file is now visible in Clio documents and is available to the user for download.\n\n## Uploading a new document version\nIt is same as uploading a new document to Clio except setting the `parent` to an existing `Document`. Check out the example to upload a new document version for the document with id `1234`:\n```json\nRequest\n  POST api/v4/documents?fields=id,latest_document_version{uuid,put_url,put_headers}\n    \"data\": {\n      \"name\": \"file.jpg\",\n      \"parent\": {\n        \"id\": 1234,\n        \"type\": \"Document\"\n      }\n    }\n  }\n```\nThe remaining steps are same as uploading a new document to Clio.\n\n## Uploading a document using multipart upload\nIn general, when a file reaches 100 MB, you should consider using multipart upload instead of uploading in a single operation. Except the last part, each part should be at least 5 MB. Determine the number of file parts and split the file. Optionally, you may compute the base64-encoded 128-bit MD5 mechanism as an end-to-end integrity check for each file part. To determine the base64 MD5 checksum for a file part, you may use `openssl`. Check out the example to split a big pdf and get the checksums of the file parts:\n```bash\nsplit -b 31457280 big.pdf big.pdf.        # break the file to max. 30MB size\nopenssl md5 -binary big.pdf.aa | base64   # F16pda4G0h4lzH7d2/Jbdw==\nopenssl md5 -binary big.pdf.ab | base64   # cRbxEG//GK9rIze5tdYzcg==\nopenssl md5 -binary big.pdf.ac | base64   # Tck0KKU4SrmSp8hsSCuSYg==\nopenssl md5 -binary big.pdf.ad | base64   # CrIt7lbZzVhMV7JzVTkUvw==\n```\n### Create the document\n[Create a document](#operation/Document%23create), specify `multiparts` for multipart upload, and ensure to ask for the fields, `id`, and `latest_document_version{uuid,multiparts}`. A `multipart` consists of `part_number`, `content_length`, and optional `content_md5`. In the response, a `put_url` is appended to the `multipart`. A `put_url` is a signed URL with security credentials for uploading a file part. The signed URL expires in 8 hours. The API can handle maximum 50 `multiparts` in one request. If the upload is split to more than 50 parts, [make a PUT request](#operation/Document%23update) with `uuid`, `fully_uploaded` as `false`, and another set of `multiparts`. It returns a set of `put_url` for the specified `multiparts`. Check out the example to upload a new document to the matter folder of `Matter` with id `1`:\n```json\nRequest\n  POST api/v4/documents?fields=id,latest_document_version{uuid,put_headers,multiparts}\n    \"data\": {\n      \"name\": \"big.pdf\",\n      \"parent\": {\n        \"id\": 1,\n        \"type\": \"Matter\"\n      }\n      \"multiparts\": [\n        {\n          \"part_number\": 1,\n          \"content_length\": 31457280,\n          \"content_md5\": \"F16pda4G0h4lzH7d2/Jbdw==\"\n        },\n        {\n          \"part_number\": 2,\n          \"content_length\": 31457280,\n          \"content_md5\": \"cRbxEG//GK9rIze5tdYzcg==\"\n        },\n        {\n          \"part_number\": 3,\n          \"content_length\": 31457280,\n          \"content_md5\": \"Tck0KKU4SrmSp8hsSCuSYg==\"\n        },\n        {\n          \"part_number\": 4,\n          \"content_length\": 7316647,\n          \"content_md5\": \"CrIt7lbZzVhMV7JzVTkUvw==\"\n        }\n      ]\n    }\n\nResponse\n  {\n    \"data\": {\n      \"id\": 1234,\n      \"latest_document_version\": {\n        \"uuid\": \"eba78724-31e8-4529-b6e2-0f2eef6feeec\",\n        \"put_headers\": [\n            {\n                \"name\": \"x-amz-server-side-encryption\",\n                \"value\": \"AES256\"\n            },\n            {\n                \"name\": \"Content-Type\",\n                \"value\": \"application/pdf\"\n            }\n          ],\n        \"multiparts\": [\n          {\n            \"part_number\": 1,\n            \"put_url\": \"https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=1&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=f7b3f29e4aee3abfa93fb42a7969557a2a0d305d223dde641c78421b5a6d62e0\",\n            \"put_headers\": [\n              {\n                  \"name\": \"Content-Length\",\n                  \"value\": \"31457280\"\n              },\n              {\n                  \"name\": \"Content-MD5\",\n                  \"value\": \"F16pda4G0h4lzH7d2/Jbdw==\"\n              }\n            ]\n          },\n          {\n            \"part_number\": 2,\n            \"put_url\": \"https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=2&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=47dc30f90202654c13030ccce87e43622bb47e0ad155ae61f6b41e8097803950\",\n            \"put_headers\": [\n              {\n                  \"name\": \"Content-Length\",\n                  \"value\": \"31457280\"\n              },\n              {\n                  \"name\": \"Content-MD5\",\n                  \"value\": \"cRbxEG//GK9rIze5tdYzcg==\"\n              }\n            ]\n          },\n          {\n            \"part_number\": 3,\n            \"put_url\": \"https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=3&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=13ca827a73fb2c50e8062ef7e437cfe9158944d998e2770a2ffcd034be6c2fc7\",\n            \"put_headers\": [\n              {\n                  \"name\": \"Content-Length\",\n                  \"value\": \"31457280\"\n              },\n              {\n                  \"name\": \"Content-MD5\",\n                  \"value\": \"Tck0KKU4SrmSp8hsSCuSYg==\"\n              }\n            ]\n          },\n          {\n            \"part_number\": 4,\n            \"put_url\": \"https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=4&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=25773f971c4c663b3a87f4d35c5b4c5192c3c999c7efdd69a49bc5bc40677078\",\n            \"put_headers\": [\n              {\n                  \"name\": \"Content-Length\",\n                  \"value\": \"7316647\"\n              },\n              {\n                  \"name\": \"Content-MD5\",\n                  \"value\": \"CrIt7lbZzVhMV7JzVTkUvw==\"\n              }\n            ]\n          }\n        ]\n      }\n    }\n  }\n```\n\n### Upload the document\nUpload each multipart to the corresponding `put_url`. You can upload the parts independently and in any order. If transmission of any part fails, you can re-transmit that part without affecting other parts. Make sure to include the headers from `puts_headers`. Typically the headers include `Content-Length`, to match with the signature in the `put_url`. Check out the example using curl:\n```bash\ncurl -X PUT -T big.pdf.part1\n  -H \"Content-Length: 31457280\"\n  \"https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=1&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=f7b3f29e4aee3abfa93fb42a7969557a2a0d305d223dde641c78421b5a6d62e0\"\n```\nIf you use MD5 checksum to validate the integrity of upload, include `Content-MD5` in the header:\n```bash\ncurl -X PUT -T big.pdf.part1\n  -H \"Content-Length: 31457280\"\n  -H \"Content-MD5: F16pda4G0h4lzH7d2/Jbdw==\"\n  \"https://s3.us-west-2.amazonaws.com/iris-production/uploads/document_version/file/eba78724-31e8-4529-b6e2-0f2eef6feeec/big.pdf?uploadId=XG9arnSRfpXVFj4NYCoj66e.iUtET050CFds7GGwb4_J6J26Ysgn_fLCK7pI5KRzJRmBOB_Oa.dle.nn4JLKos_cdRXN6f6Hb0IACkgiN6Wa2XGNv9fZQwgfqmMey1DN&partNumber=1&X-Amz-Expires=28800&X-Amz-Date=20171024T231538Z&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential={aws_access_token}/20171024/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=content-length%3Bcontent-md5%3Bhost&X-Amz-Signature=f7b3f29e4aee3abfa93fb42a7969557a2a0d305d223dde641c78421b5a6d62e0\"\n```\nIf the file is invalid or the MD5 is invalid, you may get the following response:\n```bash\n<Error>\n  <Code>BadDigest</Code>\n  <Message>The Content-MD5 you specified did not match what we received.</Message>\n  <ExpectedDigest>F16pda4G0h4lzH7d2/Jbdw==</ExpectedDigest>\n  <CalculatedDigest>Tck0KKU4SrmSp8hsSCuSYg==</CalculatedDigest>\n  <RequestId>85918626116672DD</RequestId>\n  <HostId>AbAoiqYqn8tKwS6gxwI3pc4u02B6u6ORa6MPEJH7IYljBweZp0M8L7Lg2AFOvHxdHz5TwlQpkVs=</HostId>\n</Error>\n```\nAfter the issue is corrected, try to upload to the file part to the `put_url` again.\n\n### Mark the document as fully-uploaded\nAfter successfully completing the upload of all the file parts, [mark the document fully uploaded](#operation/Document%23update) with `fully_uploaded` as `true`, and `uuid` given in the first step. Clio will verify if the file is uploaded successfully. If not, it raises `UploadNotFoundError` error. It is possible for the verification to time out, which will return an `UploadTimeoutError` error. When that happens, you will need to retry the request.\n```json\nRequest\n  PATCH api/v4/documents/1234?fields=id,latest_document_version{fully_uploaded}\n    \"data\": {\n      \"uuid\": \"eba78724-31e8-4529-b6e2-0f2eef6feeec\",\n      \"fully_uploaded\": \"true\"\n    }\n  }\n\nResponse (success)\n  {\n    \"data\": {\n      \"id\": 12345,\n      \"latest_document_version\": {\n          \"fully_uploaded\": true\n      }\n    }\n  }\nResponse (error)\n  {\n    \"error\": {\n      \"type\": \"UploadNotFoundError\",\n      \"message\": \"A matching remote file was not found for the file named file.jpg with UUID a51faa2c-859e-4c08-a996-2d0bb385df90\"\n    }\n  }\nResponse (timeout)\n  {\n    \"error\": {\n      \"type\": \"UploadTimeoutError\",\n      \"message\": \"A timeout occurred verifying the remote file. Please try the request again.\"\n    }\n  }\n```\nThe file is now visible in Clio documents and is available to the user for download.\n\n## Uploading a new document version using multipart upload\nIt is same as splitting and uploading a new document using multipart upload, except setting the `parent` to an existing `Document`. Check out the example to upload a new document version for the document with id `1234`:\n```bash\nRequest\n  POST api/v4/documents?fields=id,latest_document_version{uuid,put_headers,multiparts}\n    \"data\": {\n      \"name\": \"big.pdf\",\n      \"parent\": {\n        \"id\": 1234,\n        \"type\": \"Document\"\n      }\n      \"multiparts\": [\n        {\n          \"part_number\": 1,\n          \"content_length\": 31457280,\n          \"content_md5\": \"F16pda4G0h4lzH7d2/Jbdw==\"\n        },\n        {\n          \"part_number\": 2,\n          \"content_length\": 31457280,\n          \"content_md5\": \"cRbxEG//GK9rIze5tdYzcg==\"\n        },\n        {\n          \"part_number\": 3,\n          \"content_length\": 31457280,\n          \"content_md5\": \"Tck0KKU4SrmSp8hsSCuSYg==\"\n        },\n        {\n          \"part_number\": 4,\n          \"content_length\": 7316647,\n          \"content_md5\": \"CrIt7lbZzVhMV7JzVTkUvw==\"\n        }\n      ]\n    }\n```\nThe remaining steps are same as uploading a new document to Clio.\n"
paths:
  /documents/{id}/download.json:
    get:
      tags:
      - Documents
      summary: Download the Document. Will return a 303 See Other redirecting to the download URL for the Document
      operationId: Document#download
      description: Download the Document. Will return a 303 See Other redirecting to the download URL for the Document
      parameters:
      - name: document_version_id
        in: query
        description: The unique identifier for a DocumentVersion to be downloaded. Defaults to the latest.
        required: false
        schema:
          type: integer
          format: int64
      - name: id
        in: path
        description: The unique identifier for the Document.
        required: true
        schema:
          type: integer
          format: int64
      responses:
        '303':
          description: See Other
        '404':
          description: Not Found
        '400':
          description: Bad Request
  /documents/{id}/copy.json:
    post:
      tags:
      - Documents
      summary: Copy a Document
      operationId: Document#copy
      description: 'Copies the latest document version of a Document into a new Document. The parameters `filename` and `name` will be copied from the source Document if none are provided.

        '
      parameters:
      - name: fields
        in: query
        description: The fields to be returned. See response samples for what fields are available. For more information see the [fields section](#section/Fields).
        required: false
        schema:
          type: string
      - name: id
        in: path
        description: The unique identifier for the Document.
        required: true
        schema:
          type: integer
          format: int64
      responses:
        '404':
          description: Not Found
          content:
            application/json; charset=utf-8:
              schema:
                $ref: '#/components/schemas/Error'
        '400':
          description: Bad Request
          content:
            application/json; charset=utf-8:
              schema:
                $ref: '#/components/schemas/Error'
        '201':
          description: Created
          content:
            application/json; charset=utf-8:
              schema:
                $ref: '#/components/schemas/Document_Show'
      requestBody:
        description: Request Body for Documents
        content:
          application/json:
            schema:
              type: object
              required:
              - data
              properties:
                data:
                  type: object
                  properties:
                    communication_id:
                      type: integer
                      format: int64
                      description: Related communication record.
                    document_category:
                      type: object
                      properties:
                        id:
                          type: integer
                          format: int64
                          description: The unique identifier for a single DocumentCategory associated with the Document. Use the keyword `null` to specify no association.
                    external_properties:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: integer
                            format: int64
                            description: The unique identifier for a single ExternalProperty associated with the Document. The keyword `null` is not valid for this field.
                          name:
                            type: string
                            description: 'The ExternalProperty name. Note: **there is a limit of 5 external_properties per Document**'
                          value:
                            type: string
                            description: The ExternalProperty value.
                          _destroy:
                            type: boolean
                            description: The destroy flag. If the flag is set to `true` and the unique identifier of the associated ExternalProperty is present, the ExternalProperty is deleted from the Document.
                    filename:
                      type: string
                      default: name
                      description: Name of the original file.
                    name:
                      type: string
                      description: Document name.
                    parent:
                      type: object
                      properties:
                        id:
                          type: integer
                          format: int64
                          description: The unique identifier of the parent object.
                        type:
                          type: string
                          enum:
                          - Document
                          - Folder
                          - Contact
                          - Matter
                          description: 'Type of parent object:

                            * "Document" represents an existing Clio document. It is specified when you provide a new revision (or document version) to an existing document.

                            * "Folder" represents a specified folder on Clio by folder id. It if specified when you add / move an item to a folder.

                            * "Contact" represents a contact folder on Clio identified by contact id. It is specified when you add / move an item to a contact folder. A contact folder will be created for the specified contact if none exists already.

                            * "Matter" represents a matter folder on Clio identified by matter id. It is specified when you add / move an item to a matter folder.

                            '
                      required:
                      - id
                      - type
                    received_at:
                      type: string
                      format: date-time
                      description: Date and time the document was received (Expects an ISO-8601 timestamp).
                  required:
                  - parent
          application/x-www-form-urlencoded:
            schema:
              type: object
              required:
              - data
              properties:
                data:
                  type: object
                  properties:
                    communication_id:
                      type: integer
                      format: int64
                      description: Related communication record.
                    document_category:
                      type: object
                      properties:
                        id:
                          type: integer
                          format: int64
                          description: The unique identifier for a single DocumentCategory associated with the Document. Use the keyword `null` to specify no association.
                    external_properties:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: integer
                            format: int64
                            description: The unique identifier for a single ExternalProperty associated with the Document. The keyword `null` is not valid for this field.
                          name:
                            type: string
                            description: 'The ExternalProperty name. Note: **there is a limit of 5 external_properties per Document**'
                          value:
                            type: string
                            description: The ExternalProperty value.
                          _destroy:
                            type: boolean
                            description: The destroy flag. If the flag is set to `true` and the unique identifier of the associated ExternalProperty is present, the ExternalProperty is deleted from the Document.
                    filename:
                      type: string
                      default: name
                      description: Name of the original file.
                    name:
                      type: string
                      description: Document name.
                    parent:
                      type: object
                      properties:
                        id:
                          type: integer
                          format: int64
                          description: The unique identifier of the parent object.
                        type:
                          type: string
                          enum:
                          - Document
                          - Folder
                          - Contact
                          - Matter
                          description: 'Type of parent object:

                            * "Document" represents an existing Clio document. It is specified when you provide a new revision (or document version) to an existing document.

                            * "Folder" represents a specified folder on Clio by folder id. It if specified when you add / move an item to a folder.

                            * "Contact" represen

# --- truncated at 32 KB (109 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/clio/refs/heads/main/openapi/clio-documents-api-openapi.yml