Submit an embed form
curl --request POST \
--url https://api.craftkit.dev/v1/embed/form-submit/{sessionId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"customer.name": "Acme Corp"
}
}
'import requests
url = "https://api.craftkit.dev/v1/embed/form-submit/{sessionId}"
payload = { "data": { "customer.name": "Acme Corp" } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({data: {'customer.name': 'Acme Corp'}})
};
fetch('https://api.craftkit.dev/v1/embed/form-submit/{sessionId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.craftkit.dev/v1/embed/form-submit/{sessionId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'customer.name' => 'Acme Corp'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.craftkit.dev/v1/embed/form-submit/{sessionId}"
payload := strings.NewReader("{\n \"data\": {\n \"customer.name\": \"Acme Corp\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.craftkit.dev/v1/embed/form-submit/{sessionId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"customer.name\": \"Acme Corp\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.craftkit.dev/v1/embed/form-submit/{sessionId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"customer.name\": \"Acme Corp\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3f2a1b4c-5d6e-7f80-9a1b-2c3d4e5f6071",
"status": "queued",
"pollUrl": "https://api.craftkit.dev/v1/embed/renders/3f2a1b4c-5d6e-7f80-9a1b-2c3d4e5f6071",
"downloadUrl": null,
"errorMessage": null,
"createdAt": "2026-06-21T10:00:00.000Z"
}Embed
Submit an embed form
Submit form-fill data for a fill-mode embed session. Authenticated by
the embed session JWT (which must match the path sessionId and carry
the submitForm permission). Validates against the template manifest,
merges JWT prefill under user data, and enqueues a render. The returned
pollUrl points at the embed-scoped render wrapper, not /v1/renders/:id.
POST
/
v1
/
embed
/
form-submit
/
{sessionId}
Submit an embed form
curl --request POST \
--url https://api.craftkit.dev/v1/embed/form-submit/{sessionId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"customer.name": "Acme Corp"
}
}
'import requests
url = "https://api.craftkit.dev/v1/embed/form-submit/{sessionId}"
payload = { "data": { "customer.name": "Acme Corp" } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({data: {'customer.name': 'Acme Corp'}})
};
fetch('https://api.craftkit.dev/v1/embed/form-submit/{sessionId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.craftkit.dev/v1/embed/form-submit/{sessionId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'customer.name' => 'Acme Corp'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.craftkit.dev/v1/embed/form-submit/{sessionId}"
payload := strings.NewReader("{\n \"data\": {\n \"customer.name\": \"Acme Corp\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.craftkit.dev/v1/embed/form-submit/{sessionId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"customer.name\": \"Acme Corp\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.craftkit.dev/v1/embed/form-submit/{sessionId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"customer.name\": \"Acme Corp\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3f2a1b4c-5d6e-7f80-9a1b-2c3d4e5f6071",
"status": "queued",
"pollUrl": "https://api.craftkit.dev/v1/embed/renders/3f2a1b4c-5d6e-7f80-9a1b-2c3d4e5f6071",
"downloadUrl": null,
"errorMessage": null,
"createdAt": "2026-06-21T10:00:00.000Z"
}Authorizations
Short-lived embed session JWT minted by POST /v1/embed/sessions. Used by
the iframe form-submit / upload-image endpoints and accepted (alongside a
partner key) by builder template creation.
Path Parameters
The embed session id (must match the JWT subject).
Body
application/json
Response
Render queued.
Render shape returned by render/idempotent-replay and embed form-submit.