Get a Routing Form Submission
Get one routing form submission by ID via the Zeeg API, with its answers, the route the answers selected, and the UTM and ad-click values captured at submit.
curl --request GET \
--url https://api.zeeg.me/v2/routing-form-submissions/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zeeg.me/v2/routing-form-submissions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.zeeg.me/v2/routing-form-submissions/{id}', 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.zeeg.me/v2/routing-form-submissions/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zeeg.me/v2/routing-form-submissions/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.zeeg.me/v2/routing-form-submissions/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zeeg.me/v2/routing-form-submissions/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"status": 200,
"submission": {
"id": "71621fb7-30b0-4d91-9f2e-a3e009cc6853",
"createdAt": "2026-04-10T08:30:00+00:00",
"routingForm": {
"id": "f1cbafc4-b646-4cf9-af29-193491b555d9",
"name": "Inbound Lead Qualification",
"slug": "inbound-lead-qual"
},
"route": {
"type": "EVENT_TYPE",
"isFallback": false,
"customUrl": null,
"headline": null,
"eventType": {
"id": "80f46bf5-eb01-4c07-960e-a9a3e18aae5e",
"title": "30-Minute Discovery Call",
"slug": "30min-discovery-call",
"uri": "https://api.zeeg.me/v2/event-types/80f46bf5-eb01-4c07-960e-a9a3e18aae5e"
},
"team": null
},
"answers": [
{
"inputId": "f7c82298-6dd9-43bd-98e4-c437b5c0ae47",
"order": 1,
"question": "What is your company size?",
"type": "object",
"answer": "50-200 employees",
"rawAnswer": "{\"id\":\"size-50-200\",\"value\":\"50-200 employees\",\"color\":\"blue\"}",
"crmAttribute": {
"objectSlug": "companies",
"attributeSlug": "size"
}
}
],
"questionsAndAnswers": {
"What is your company size?": "50-200 employees"
},
"utm": {
"campaign": "spring_launch",
"source": "linkedin"
},
"adAttribution": {
"gclid": "Cj0KCQjw_pO_BhDgARIsAOgg"
}
}
}route holds the destination that the answers selected, as it stood at the time of the submission. utm and adAttribution hold the campaign values that the page carried when the invitee sent the submission.
The two forms of every answer
Each answer ships twice:answeris the display value. Show this value to a person.rawAnsweris the stored value. For a question that maps onto a CRM select attribute it is the canonical{"id","value","color"}JSON that identifies the option. Map into a CRM by this value.
questionsAndAnswers repeats the same answers as a flat map from question text to display value.
rawAnswer to a person. For a CRM select answer it is a JSON blob, not a label.404, not 422. A submission outside your workspace answers 404 as well.Authorizations
Path Parameters
UUID of the submission.
Response
OK
true
200
One set of answers that an invitee sent through a routing form, together with the route that the answers selected.
Hide child attributes
Hide child attributes
"71621fb7-30b0-4d91-9f2e-a3e009cc6853"
Time at which the invitee sent the submission, in UTC.
"2026-04-10T08:30:00+00:00"
The route that the answers selected, as it stood at the time of the submission.
Hide child attributes
Hide child attributes
EVENT_TYPE, URL, CUSTOM_PAGE, TEAM_PAGE "EVENT_TYPE"
True when the answers matched no route and the fallback route took the submission.
false
Destination address of a URL route.
null
The headline that the invitee saw, with the HTML tags removed.
null
The event type that a route or a submission points at. It is null when no event type is set.
Hide child attributes
Hide child attributes
"80f46bf5-eb01-4c07-960e-a9a3e18aae5e"
"30-Minute Discovery Call"
"30min-discovery-call"
Address of the event type in this API.
"https://api.zeeg.me/v2/event-types/80f46bf5-eb01-4c07-960e-a9a3e18aae5e"
The answers of the submission, in the order of the questions.
Hide child attributes
Hide child attributes
Id of the question that the invitee answered.
"f7c82298-6dd9-43bd-98e4-c437b5c0ae47"
Position of the question in the routing form at the time of the submission. The first question carries 1, so this counter starts one higher than order on the question itself.
1
The question text at the time of the submission.
"What is your company size?"
The stored type of the answer, for example text. A question that maps onto a CRM select attribute carries object.
"object"
The display value of the answer. Show this value to a person.
"50-200 employees"
The stored value of the answer. A question that maps onto a CRM select attribute carries the canonical {"id","value","color"} JSON that identifies the option. Map into a CRM by this value.
"{\"id\":\"size-50-200\",\"value\":\"50-200 employees\",\"color\":\"blue\"}"
The CRM attribute that a question maps onto. It is null when the question maps onto no attribute.
The UTM parameters that the page carried when the invitee sent the submission. A parameter that carries no value is absent.
The advertisement click identifiers that the page carried when the invitee sent the submission. It is null when the page carried none.
Hide child attributes
Hide child attributes
Google Ads click identifier.
Meta click identifier.
Meta browser identifier.
Meta click cookie value.
The address at which the visit started.
{ "gclid": "Cj0KCQjw_pO_BhDgARIsAOgg" }
curl --request GET \
--url https://api.zeeg.me/v2/routing-form-submissions/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zeeg.me/v2/routing-form-submissions/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.zeeg.me/v2/routing-form-submissions/{id}', 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.zeeg.me/v2/routing-form-submissions/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.zeeg.me/v2/routing-form-submissions/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.zeeg.me/v2/routing-form-submissions/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zeeg.me/v2/routing-form-submissions/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"status": 200,
"submission": {
"id": "71621fb7-30b0-4d91-9f2e-a3e009cc6853",
"createdAt": "2026-04-10T08:30:00+00:00",
"routingForm": {
"id": "f1cbafc4-b646-4cf9-af29-193491b555d9",
"name": "Inbound Lead Qualification",
"slug": "inbound-lead-qual"
},
"route": {
"type": "EVENT_TYPE",
"isFallback": false,
"customUrl": null,
"headline": null,
"eventType": {
"id": "80f46bf5-eb01-4c07-960e-a9a3e18aae5e",
"title": "30-Minute Discovery Call",
"slug": "30min-discovery-call",
"uri": "https://api.zeeg.me/v2/event-types/80f46bf5-eb01-4c07-960e-a9a3e18aae5e"
},
"team": null
},
"answers": [
{
"inputId": "f7c82298-6dd9-43bd-98e4-c437b5c0ae47",
"order": 1,
"question": "What is your company size?",
"type": "object",
"answer": "50-200 employees",
"rawAnswer": "{\"id\":\"size-50-200\",\"value\":\"50-200 employees\",\"color\":\"blue\"}",
"crmAttribute": {
"objectSlug": "companies",
"attributeSlug": "size"
}
}
],
"questionsAndAnswers": {
"What is your company size?": "50-200 employees"
},
"utm": {
"campaign": "spring_launch",
"source": "linkedin"
},
"adAttribution": {
"gclid": "Cj0KCQjw_pO_BhDgARIsAOgg"
}
}
}