Upload AI Builder Content to a Proposal
POST /public/proposals//ai/content — Uploads a file as AI source content for a proposal. Multipart upload with single-file and multi-chunk modes. Returns the new content item record.
multipart/form-data and must include at least one file part. Accepted and Completed proposals cannot accept new content; templates can be edited only by their template owner.
Each uploaded file part is limited by the server’s configurable MaxProposalAttachmentSizeInMB setting (20 MB in the repository defaults). Multi-chunk mode does not bypass this per-part limit; the implementation does not enforce a separate 1 GB total-size limit. For multi-chunk uploads, set ?isMultiChunkUpload=true and send each chunk as its own multipart file part — see Multi-chunk upload below.
Request
POST /public/proposals/{ProposalId}/ai/content
Headers
application/json.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.Path parameters
Form fields
The body is amultipart/form-data payload containing the following parts.
false (or omit) for a normal single-file upload. Send true only when also using ?isMultiChunkUpload=true on the URL — see Multi-chunk upload.filename= value.File part naming (important)
The multipart field name must include the file extension. Validation checks that field name, while the upload logic derives the stored source-file type from thefilename= value. Use the same filename and extension in both places; the part’s Content-Type is not used for extension validation.
Set the field name equal to the filename:
name="file" will fail with:
.txt, .pdf, .mp3, .wav, .aac, .flac, .ogg, .wma, .aiff, .alac, .midi, .mp4, .avi, .mkv, .mov, .wmv, .flv, .webm, .mpeg, .3gp, .m4v, .ogv.
Response
Success
A200 response returns the created content item.
null and may remain null until processing completes or if transcription fails.Uploaded; background processing may later change it to Processing, Transcribed, or Invalid.Text, Audio, or Video.Error codes
Example
Each example uploads a single text file namedspec-bom.txt. Substitute the credentials, the proposal ID, and the file path as appropriate.
Multi-chunk upload
For a file that exceeds the configured per-part limit, switch to multi-chunk mode. The same per-part limit applies to every chunk. There is no separate initiate or complete call — every chunk is sent as a multipart file part in a single request.URL
?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
ProposalId remains a path parameter. The service does not require a duplicate proposalId form field or a totalChunks field.
Chunk file parts
Include each chunk as a separate multipart file part. Use the original filename plus a.partN suffix for both the field name and the filename= value. The service removes the suffix when determining the original source extension:
Chunk sizes
Choose a chunk size that stays below the server’s configured per-part limit. The same limit applies to every chunk. The implementation does not define a separate total upload-size limit.Authorizations
Portal application identifier used as part of HMAC-authenticated API requests.
Portal user API key used together with the HMAC signature headers.
Timestamp header included in the signed request to prevent replay attacks.
HMAC-SHA256 signature for the request, calculated over the canonical string defined in the authentication docs.
Headers
Accept Header
Path Parameters
Numeric identifier of the proposal to which the AI-generated content will be attached. Must be a positive integer. The proposal typically must be in Draft status to accept new content.
Body
Multipart form-data containing the content name, optional multi-chunk flag, and at least one file part.
Multipart form fields. The file part property name must equal the filename, including its extension.
Human-readable name or title for the content being uploaded.
"site-survey.pdf"
Set true when the request contains multiple parts of one file; otherwise omit or set false.
false
A required file part. Its property name must equal the filename, including its extension; add .partN to each multi-chunk part.
Response
Success
PublicAiProposalContentPostResponse
Unique identifier assigned to the created AI content item. Use this id for subsequent operations (update, delete, fetch).
Human-readable name/title of the created content item. Matches the 'Name' value provided in the request.
Timestamp (UTC) when the content item was created. ISO 8601 format.
Optional short summary or snippet of the content generated by the AI. Useful for preview and search.
Uploaded, Processing, Transcribed, Invalid Text, Audio, Video SimpleUserModel