Skip to main content
POST
The first step of the two-step upload flow described in File Uploads — the SDK’s client.form(id).upload() (or automatic File/FileList detection inside submit()) does this for you; call it directly only if you’re building a fully custom upload UI.
string
required
The form’s public ID.
string
required
The schema field this file belongs to — must be a file/image/signature/video/audio type field that actually exists on the form.
string
required
Original filename, stored alongside the upload for later display/download.
string
required
Declared MIME type. Checked against the field’s allowedTypes at this step — but not trusted blindly; the actual uploaded bytes are re-verified after the PUT completes.
number
required
Declared file size. Checked against the field’s maxSizeMB and your plan’s per-file/total storage limits.

Response

string
Internal storage path — pass this (wrapped in a file reference object) as the field’s value on Submit a Form.
string
A signed URL, valid for a short window — PUT the raw file bytes here directly. This request never touches your server or Raykoi’s API.
string
Internal bookkeeping ID — not needed for the upload itself.
string
If present, include as Authorization: Bearer <supabaseToken> on the PUT to uploadUrl.
This endpoint alone doesn’t attach the file to a submission — the returned path still has to be included in the actual POST to Submit a Form. An upload URL that’s never followed by a matching submission is swept up by a cleanup job and never becomes a permanent file.