curl --request POST \
--url https://clientapi.woku.app/v1/forms/{id}/responses \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"anonymous": true,
"answers": {},
"responseChannel": "<string>",
"email": "jsmith@example.com",
"phone": "<string>"
}
'import requests
url = "https://clientapi.woku.app/v1/forms/{id}/responses"
payload = {
"anonymous": True,
"answers": {},
"responseChannel": "<string>",
"email": "jsmith@example.com",
"phone": "<string>"
}
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({
anonymous: true,
answers: {},
responseChannel: '<string>',
email: 'jsmith@example.com',
phone: '<string>'
})
};
fetch('https://clientapi.woku.app/v1/forms/{id}/responses', 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://clientapi.woku.app/v1/forms/{id}/responses",
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([
'anonymous' => true,
'answers' => [
],
'responseChannel' => '<string>',
'email' => 'jsmith@example.com',
'phone' => '<string>'
]),
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://clientapi.woku.app/v1/forms/{id}/responses"
payload := strings.NewReader("{\n \"anonymous\": true,\n \"answers\": {},\n \"responseChannel\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone\": \"<string>\"\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://clientapi.woku.app/v1/forms/{id}/responses")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"anonymous\": true,\n \"answers\": {},\n \"responseChannel\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://clientapi.woku.app/v1/forms/{id}/responses")
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 \"anonymous\": true,\n \"answers\": {},\n \"responseChannel\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"statusCode": 400,
"message": "<string>",
"error": "Bad Request"
}{
"statusCode": 403,
"message": "Authentication required",
"error": "Forbidden"
}{
"statusCode": 404,
"message": "External tracker not found",
"error": "Not Found"
}Submit a form response
Records a response for the form. Answers are validated against the form definition before being stored; quarantined respondents are rejected with 429. Accepts the publishable capture key or the secret key.
curl --request POST \
--url https://clientapi.woku.app/v1/forms/{id}/responses \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"anonymous": true,
"answers": {},
"responseChannel": "<string>",
"email": "jsmith@example.com",
"phone": "<string>"
}
'import requests
url = "https://clientapi.woku.app/v1/forms/{id}/responses"
payload = {
"anonymous": True,
"answers": {},
"responseChannel": "<string>",
"email": "jsmith@example.com",
"phone": "<string>"
}
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({
anonymous: true,
answers: {},
responseChannel: '<string>',
email: 'jsmith@example.com',
phone: '<string>'
})
};
fetch('https://clientapi.woku.app/v1/forms/{id}/responses', 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://clientapi.woku.app/v1/forms/{id}/responses",
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([
'anonymous' => true,
'answers' => [
],
'responseChannel' => '<string>',
'email' => 'jsmith@example.com',
'phone' => '<string>'
]),
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://clientapi.woku.app/v1/forms/{id}/responses"
payload := strings.NewReader("{\n \"anonymous\": true,\n \"answers\": {},\n \"responseChannel\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone\": \"<string>\"\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://clientapi.woku.app/v1/forms/{id}/responses")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"anonymous\": true,\n \"answers\": {},\n \"responseChannel\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://clientapi.woku.app/v1/forms/{id}/responses")
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 \"anonymous\": true,\n \"answers\": {},\n \"responseChannel\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"statusCode": 400,
"message": "<string>",
"error": "Bad Request"
}{
"statusCode": 403,
"message": "Authentication required",
"error": "Forbidden"
}{
"statusCode": 404,
"message": "External tracker not found",
"error": "Not Found"
}Authorizations
Company API key. Obtain this from your Woku dashboard under Settings > API Keys. The same key used for the v0 endpoints.
Path Parameters
Form id
Body
Whether this response is anonymous.
Answers keyed by field id, e.g. { "field-uuid-1": "John", "field-uuid-2": 5 }.
Optional inbound response channel. Defaults to 'api'; a value provided here REPLACES it (user-defined channel).
48Respondent email (required when the form identifies clients by email and the response is not anonymous).
Respondent phone (required when the form identifies clients by phone and the response is not anonymous).
Response
Form response created