Skip to main content
POST
/
v1
/
file_uploads
/
{file_upload_id}
/
send
TypeScript SDK
import { Client } from "@notionhq/client"

const notion = new Client({ auth: process.env.NOTION_API_KEY })

import { readFile } from "fs/promises"
import { basename } from "path"

const filePath = "./document.pdf"

const response = await notion.fileUploads.send({
  file_upload_id: "a02fc1d3-db8b-45c5-a222-27595b15aea7",
  file: {
    filename: basename(filePath),
    data: new Blob([await readFile(filePath)], {
      type: "application/pdf"
    })
  }
})
{
  "object": "<string>",
  "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "created_time": "2023-12-25",
  "created_by": {
    "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "type": "person"
  },
  "last_edited_time": "2023-12-25",
  "archived": true,
  "expiry_time": "2023-12-25",
  "status": "pending",
  "filename": "<string>",
  "content_type": "<string>",
  "content_length": 1,
  "upload_url": "<string>",
  "complete_url": "<string>",
  "file_import_result": {
    "imported_time": "2023-12-25",
    "type": "<string>",
    "success": {}
  },
  "number_of_parts": {
    "total": 1,
    "sent": 1
  }
}
For this endpoint, use a Content-Type of multipart/form-data, and provide your file contents under the file key.
The use of multipart form data is unique to this endpoint. Other Notion APIs, including Create a file upload and Complete a file upload, use JSON parameters.Include a boundary with the Content-Type header of your request as per RFC 2388. Most request libraries (e.g. fetch, ky) automatically handle this as long as you provide a form data object but don’t overwrite the Content-Type explicitly.For more tips and examples, view the file upload guide.
When mode=multi_part, each part must include a form field part_number to indicate which part is being sent. Parts may be sent concurrently up to standard Notion API rate limits, and may be sent out of order as long as all parts (1, …, part_number) are successfully sent before calling the complete file upload API. The maximum allowed length of a file name is 900 bytes, including any file extension included in the file name or inferred based on the content_type. However, we recommend using shorter names for performance and easier file management and lookup using the List file uploads API.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Headers

Notion-Version
enum<string>
required

The API version to use for this request. The latest version is 2025-09-03.

Available options:
2025-09-03

Path Parameters

file_upload_id
string
required

Identifier for a Notion file upload object.

Body

multipart/form-data
file
object
required

The raw binary file contents to upload.

part_number
string

When uploading files greater than 20MB in parts, this is the current part number. Must be an integer between 1 and 1,000.

Response

object
string
required

Always file_upload

Allowed value: "file_upload"
id
string<uuid>
required
created_time
string<date>
required
created_by
object
required
last_edited_time
string<date>
required
archived
boolean
required
expiry_time
string<date> | null
required
status
enum<string>
required

One of: pending, uploaded, expired, failed

Available options:
pending,
uploaded,
expired,
failed
filename
string | null
required
content_type
string | null
required
content_length
integer | null
required
Required range: x >= 0
upload_url
string
complete_url
string
file_import_result
Success · object
number_of_parts
object