Overview
This guide is on how to create documents and upload files over the Lexful REST API (reference: https://developer.lexful.ai) and is useful for customers/integrations that are looking to load files from other products (e.g Sharepoint, Google Drive, Dropbox, etc) into Lexful.
How Files Work
This guide covers file attachments uploaded to an existing asset through the API. Attachments can belong to Documents (system.document) or other supported asset types. The Files release also adds standalone file records (system.file), which use a separate file-property upload flow. You do not need to create a blank native document to upload a standalone file through the Documents screen. Availability depends on the Files rollout for your account.
Uploading a File
To upload a file, we must:
Identify the Document asset that we can attach the file to. If none exists, we will need to create the Document asset first (capture the
idfrom the response as it'll be required for the next step):
bash
curl -X POST 'https://api.us.lexful.app/v1/assets/system.document' \ --header 'X-Account-Id: {ACCOUNT_ID}' \ --header 'Authorization: Bearer {JWT}' \ --header 'Content-Type: application/json' \ --data '{ "organization_id": "{ORGANIZATION_ID}", "name": "Name of document or file", "content": "Content of document or preamble of file" // this is optional }' Response:{ "id": "019983a9-xxxx, ...}Under the Document asset, create a file attachment and capture the file
idandpresignedUploadUrlfrom the response as it'll be needed for uploading the file (max 100MB):
bash
curl -X POST 'https://api.us.lexful.app/v1/assets/system.document/{ASSET_ID}/files' \ --header 'X-Account-Id: {ACCOUNT_ID}' \ --header 'Authorization: Bearer {JWT}' \ --header 'Content-Type: application/json' \ --data '{ "name": "Network Diagram", "original_name": "network-diagram.pdf", "file_extension": "pdf", "mime_type": "application/pdf", "size": 248413 // bytes }' Response:{ "file": { "id": "0199a1c4-xxxx", ... }, "presignedUploadUrl": "https://s3.amazonaws.com/...&X-Amz-Signature=..."}Use the
presignedUploadUrlto upload the file, note that theContent-Typemust match themime_typein the previous step:
bash
// NOTE: do not send Lexful API creds, PRESIGNED_UPLOAD_URL is already pre-authorized curl -X PUT '{PRESIGNED_UPLOAD_URL}' \ --header 'Content-Type: application/pdf' \ --data-binary '{file_content}'Update the file as upload completed using the file
idfrom the previous step
bash
curl -X POST 'https://api.us.lexful.app/v1/assets/system.document/{ASSET_ID}/files/{FILE_ID}/complete' \ --header 'X-Account-Id: {ACCOUNT_ID}' \ --header 'Authorization: Bearer {JWT}'
Updating a File
There is no endpoint that swaps the bytes behind an existing file attachment. To replace it with a new version, follow steps above to create a new file attachment against the same asset, and delete the old file attachment (note that this step is unrecoverable):
bash
curl -X DELETE 'https://api.us.lexful.app/v1/assets/system.document/{ASSET_ID}/files/{OLD_FILE_ID}' \ --header 'X-Account-Id: {ACCOUNT_ID}' \ --header 'Authorization: Bearer {JWT}'
Best Practices
To do a clean integration, you will need the following as part of your solution:
Store and track the Document asset id, file id, and last upload date for each file uploaded to Lexful
Only upload files that have changed since last upload
Avoid repeatedly uploading files that have not changed
Do not upload files more than 100MB in size