We launched the Accounting Sample!Manage invoices, payments, expenses, and more across multiple connectors.

Search docs

Uploading files with the File Storage API

The Apideck File Storage API supports two ways to upload files. The direct file upload API supports files up to 100MB in size and sends all the binary file data in a single API call.

The upload sessions API allows you to upload files of any size in parts. Note that some file storage connectors have their own limits.

Direct upload

To upload a file via direct upload, make an API call to the POST /file-storage/files endpoint with the content of the file, the file name and parent_folder_id.

Request body

The request body should be the raw binary content of the file. Do not use form data.

File metadata

Provide the file's name and parent_folder_id as JSON in the x-apideck-metadata header.

terminal
curl  --request POST \
      --url https://upload.apideck.com/file-storage/files \
      --header 'Authorization: Bearer API_KEY' \
      --header 'Content-Type: video/mp4' \
      --header 'x-apideck-app-id: APP_ID' \
      --header 'x-apideck-consumer-id: CONSUMER_ID' \
      --header 'x-apideck-metadata: {"name": "video.mp4", "parent_folder_id": "root"}' \
      --header 'x-apideck-service-id: google-drive' \
      --data-binary @sample_hd.mp4

Upload sessions

The upload sessions API requires you to make multiple API calls:

  1. Create upload session
  2. Get upload session
  3. Upload parts of file
  4. Finish upload session

1. Create upload session

To create an upload session, make an API call to the POST /file-storage/upload-sessions endpoint with the file name, file size and parent_folder_id.

terminal
curl  --request POST \
      --url https://upload.apideck.com/file-storage/upload-sessions \
      --header 'Authorization: Bearer API_KEY' \
      --header 'Content-Type: application/json' \
      --header 'x-apideck-app-id: APP_ID' \
      --header 'x-apideck-consumer-id: CONSUMER_ID' \
      --header 'x-apideck-service-id: google-drive' \
      --data '{"size":30228718,"name": "video.mp4","parent_folder_id": "root"}'

2. Get upload session

After creating an upload session, make an API call to GET /file-storage/upload-sessions/ID. Use the ID you received after creating the upload session.

terminal
curl  --request GET \
      --url https://upload.apideck.com/file-storage/upload-sessions/ID \
      --header 'Authorization: Bearer API_KEY' \
      --header 'x-apideck-app-id: APP_ID' \
      --header 'x-apideck-consumer-id: CONSUMER_ID' \
      --header 'x-apideck-metadata: {"name": "video.mp4","parent_folder_id": "root"}' \
      --header 'x-apideck-service-id: google-drive'

3. Upload parts of file

Use the part_size from the previous step to split the file to be uploaded into parts. You can use the split command to do this:

terminal
split -b part_size video.mp4 part

Upload the parts in sequence to the PUT /file-storage/upload-sessions/ID endpoint. Send a valid part_number with each request (part_number starts at 0). Always provide valid Content-Type and Content-Length headers. If you are unsure of the content type of the uploaded file, use application/octet-stream.

terminal
curl  --request PUT \
      --url https://upload.apideck.com/file-storage/upload-sessions/ID?part_number=0 \
      --header 'Authorization: Bearer API_KEY' \
      --header 'Content-Type: video/mp4' \
      --header 'x-apideck-app-id: APP_ID' \
      --header 'x-apideck-consumer-id: CONSUMER_ID' \
      --header 'x-apideck-service-id: google-drive' \
      --header 'Digest: sha=pnDkxRveXuqyu1hxTYrO5megpvc=' \
      --data-binary @partaa

4. Finish upload session

The final step is to finish the session using the POST /file-storage/upload-sessions/ID/finish endpoint. The result of the API call is a complete File resource.

terminal
curl  --request POST \
      --url https://upload.apideck.com/file-storage/upload-sessions/ID/finish \
      --header 'Authorization: Bearer API_KEY' \
      --header 'Content-Type: application/json' \
      --header 'x-apideck-app-id: APP_ID' \
      --header 'x-apideck-consumer-id: CONSUMER_ID' \
      --header 'x-apideck-service-id: google-drive' \
      --header 'Digest: sha=pnDkxRveXuqyu1hxTYrO5megpvc=' \
      --data '{}'