Skip to main content
Uploads a file as AI source content for the specified proposal. The request body must be multipart/form-data and must include at least one file part. The proposal must be in Draft status to accept new content. Files up to 25 MB can be sent in a single request. Files larger than 25 MB must use multi-chunk mode. The maximum supported file size is 1 GB. For multi-chunk uploads, set ?isMultiChunkUpload=true and send each chunk as its own multipart file part — see Multi-chunk upload below.
This endpoint requires multipart/form-data, not application/x-www-form-urlencoded. Sending a URL-encoded body returns No file was provided in the request.

Request

POST /public/api/proposals/{ProposalId}/ai/content

Headers

string
required
Must be application/json.
string
required
Must be multipart/form-data; boundary=<generated-boundary>. The full value, including the boundary parameter, must also be used in the HMAC canonical message. See Sign multipart requests.
string
required
Your API Application Key.
string
required
Your User API Key.
string
required
Current UTC timestamp in RFC 7231 format.
string
required
HMAC-SHA256 signature, Base64-encoded.

Path parameters

integer
required
Numeric identifier of the proposal to which the AI content will be attached. The proposal must be in Draft status to accept new content.

Form fields

The body is a multipart/form-data payload containing the following parts.
string
required
Human-readable name or title for the content being uploaded. Used for display and search. Provide a concise, descriptive name.
boolean
Send false (or omit) for a normal single-file upload. Send true only when also using ?isMultiChunkUpload=true on the URL — see Multi-chunk upload.
file
required
The actual file to upload, sent as a multipart file part. See the file part naming rule below — the field name must equal the filename, including its extension.

File part naming (important)

The form field name of the file part must include the file extension. The server reads the file type from the field name, not from the filename= parameter or the part’s Content-Type header. Set the field name equal to the filename:
Common defaults like name="file" will fail with:
The field name has no extension, so the server sees an empty file type. Supported file extensions: .txt, .mp3, .mp4, .mp2, .aac, .wav, .flac, .pcm, .m4a, .ogg, .opus, .webm, .mov, .mpeg, .mpg.

Response

Success

A 200 response returns the created content item.
integer
required
Unique identifier assigned to the new content item. Use this ID for subsequent operations such as deleting the item.
string
required
Display name for the content item, as provided in the request.
string
required
AI-generated summary of the content. May be empty until processing completes.
string
required
Initial processing status. Typically Uploaded immediately after creation.
string
required
Detected type of the uploaded content (e.g., Text, Audio, Video).
string
required
ISO 8601 timestamp of when the content item was created.
object
required
The user who performed the upload.

Error codes

Example

Each example uploads a single text file named spec-bom.txt. Substitute the credentials, the proposal ID, and the file path as appropriate.
Response

Multi-chunk upload

For files larger than 25 MB, switch to multi-chunk mode. The maximum supported file size is 1 GB. There is no separate initiate or complete call — every chunk is sent as a multipart file part in a single request.

URL

As with all Portal.io endpoints, the HMAC canonical message uses the base URL without the query string. The ?isMultiChunkUpload=true is sent on the wire but not included in the signing input. See Sign Portal.io API requests for the canonical rules.

Required form fields

Chunk file parts

Include each chunk as a separate multipart file part. Use the original filename plus a .partN suffix as the field name so the extension is preserved:
Non-final chunks must be at least 5 MB. This is an S3 multipart upload constraint — chunks smaller than 5 MB (other than the last one) will be rejected.