Get a Routing Form
Get one routing form by ID via the Zeeg API, including its questions in inputs and its routes with the rules that select each destination.
curl --request GET \
--url https://api.zeeg.me/v2/routing-forms/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zeeg.me/v2/routing-forms/{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-forms/{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-forms/{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-forms/{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-forms/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zeeg.me/v2/routing-forms/{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,
"routingForm": {
"id": "f1cbafc4-b646-4cf9-af29-193491b555d9",
"name": "Inbound Lead Qualification",
"slug": "inbound-lead-qual",
"url": "https://zeeg.me/RF/inbound-lead-qual",
"isActive": true,
"headline": "Tell us about your team",
"body": null,
"submitBtnText": "Continue",
"styleSettings": {
"bgColor": "#ffffff",
"buttonBgColor": "#1f2937",
"buttonTextColor": "#ffffff"
},
"createdAt": "2026-04-01T09:12:44+00:00",
"updatedAt": "2026-04-10T08:30:00+00:00",
"inputs": [
{
"id": "f7c82298-6dd9-43bd-98e4-c437b5c0ae47",
"label": "What is your company size?",
"type": "SELECT",
"order": 0,
"isRequired": true,
"isActive": true,
"options": [
"1-10 employees",
"50-200 employees"
],
"crmAttribute": null
}
],
"routes": [
{
"id": "c4a1e0d2-5f39-4a7b-8f11-2b6d0c9e7a84",
"type": "EVENT_TYPE",
"isFallback": false,
"order": 0,
"customUrl": null,
"headline": null,
"body": 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,
"rules": {
"all": [
{
"inputId": "f7c82298-6dd9-43bd-98e4-c437b5c0ae47",
"operator": "is_any_of",
"values": [
"50-200 employees"
]
}
]
}
},
{
"id": "2e7f4b90-8a13-4c6d-b5e2-7f0a9c3d1e64",
"type": "CUSTOM_PAGE",
"isFallback": true,
"order": 1,
"customUrl": null,
"headline": "Thank you",
"body": "A member of the team contacts you within one working day.",
"eventType": null,
"team": null,
"rules": []
}
]
}
}inputs and its routes in routes.
A question carries its type, its options, and the CRM attribute it maps onto. A question that takes no options carries an empty options array.
A route carries its destination and the rules that select it. Exactly one route is the fallback, which takes every submission that matches no other route. The fallback carries an empty rules array.
404, not 422. A routing form outside your workspace answers 404 as well.Authorizations
Path Parameters
UUID of the routing form.
Response
OK
true
200
A routing form with its questions and its routes, as returned when you fetch one routing form.
Hide child attributes
Hide child attributes
"f1cbafc4-b646-4cf9-af29-193491b555d9"
The internal name of the routing form.
"Inbound Lead Qualification"
The slug that addresses the routing form in its public URL.
"inbound-lead-qual"
The public address at which an invitee opens the routing form.
"https://zeeg.me/RF/inbound-lead-qual"
An inactive routing form accepts no submission.
true
The headline that the routing form shows above the questions.
"Tell us about your team"
The body text that the routing form shows below the headline.
null
The label on the submit button of the routing form.
"Continue"
The colours of the public routing form page. Each value is a CSS colour of at most 20 characters, or null when the routing form sets no colour. A response always carries the object with all three keys. The write endpoints accept the same shape, so a routing form that you read goes straight back to PATCH /routing-forms/{id} without reshaping.
Hide child attributes
Hide child attributes
Background colour of the page.
20"#ffffff"
Background colour of the submit button.
20"#1f2937"
Text colour of the submit button.
20"#ffffff"
Time at which the routing form was created, in UTC.
"2026-04-01T09:12:44+00:00"
Time of the last change to the routing form, in UTC.
"2026-04-10T08:30:00+00:00"
The questions of the routing form, which the invitee answers in the given order.
Hide child attributes
Hide child attributes
"f7c82298-6dd9-43bd-98e4-c437b5c0ae47"
The question text that the invitee reads.
"What is your company size?"
The answer control that the routing form shows for this question.
TEXT_INPUT, TEXTAREA, SELECT, RADIO_INPUT, EMAIL, PHONE_NUMBER, NUMBER_INPUT, CRM_ATTRIBUTE "SELECT"
Position of the question in the routing form. The first question carries 0.
0
True when the invitee must answer the question.
true
The routing form hides the question when this is false.
true
The selectable values of the question. A SELECT or RADIO_INPUT question carries plain strings. A CRM_ATTRIBUTE question carries the option objects of the CRM attribute. Every other type carries an empty array.
["1-10 employees", "50-200 employees"]
The CRM attribute that a question maps onto. It is null when the question maps onto no attribute.
The routes of the routing form. Exactly one route is the fallback.
Hide child attributes
Hide child attributes
"c4a1e0d2-5f39-4a7b-8f11-2b6d0c9e7a84"
The kind of destination. EVENT_TYPE opens a scheduling page, TEAM_PAGE opens the page of a team, URL redirects to an external address, and CUSTOM_PAGE shows a message inside the routing form.
EVENT_TYPE, URL, CUSTOM_PAGE, TEAM_PAGE "EVENT_TYPE"
The fallback route takes every submission that matches no other route.
false
Position of the route in the routing form. The first route carries 0. The routing form takes the first route whose conditions hold.
0
Destination address of a URL route. It is null for every other type.
null
Headline of a CUSTOM_PAGE route.
"Thank you"
Body text of a CUSTOM_PAGE route.
"A member of the team contacts you within one working day."
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 condition tree that selects this route. A node is either a group or a condition. A group holds child nodes under any for OR, or under all for AND. A condition holds inputId, operator and values. The operator is one of equals, does_not_equal, is_any_of, is_not_any_of, contains, does_not_contain, starts_with, ends_with, greater_than, greater_than_or_equal, less_than, less_than_or_equal, is_empty or is_not_empty. The fallback route carries an empty array, because it needs no condition.
{
"all": [
{
"inputId": "f7c82298-6dd9-43bd-98e4-c437b5c0ae47",
"operator": "is_any_of",
"values": ["50-200 employees"]
}
]
}
curl --request GET \
--url https://api.zeeg.me/v2/routing-forms/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.zeeg.me/v2/routing-forms/{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-forms/{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-forms/{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-forms/{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-forms/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.zeeg.me/v2/routing-forms/{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,
"routingForm": {
"id": "f1cbafc4-b646-4cf9-af29-193491b555d9",
"name": "Inbound Lead Qualification",
"slug": "inbound-lead-qual",
"url": "https://zeeg.me/RF/inbound-lead-qual",
"isActive": true,
"headline": "Tell us about your team",
"body": null,
"submitBtnText": "Continue",
"styleSettings": {
"bgColor": "#ffffff",
"buttonBgColor": "#1f2937",
"buttonTextColor": "#ffffff"
},
"createdAt": "2026-04-01T09:12:44+00:00",
"updatedAt": "2026-04-10T08:30:00+00:00",
"inputs": [
{
"id": "f7c82298-6dd9-43bd-98e4-c437b5c0ae47",
"label": "What is your company size?",
"type": "SELECT",
"order": 0,
"isRequired": true,
"isActive": true,
"options": [
"1-10 employees",
"50-200 employees"
],
"crmAttribute": null
}
],
"routes": [
{
"id": "c4a1e0d2-5f39-4a7b-8f11-2b6d0c9e7a84",
"type": "EVENT_TYPE",
"isFallback": false,
"order": 0,
"customUrl": null,
"headline": null,
"body": 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,
"rules": {
"all": [
{
"inputId": "f7c82298-6dd9-43bd-98e4-c437b5c0ae47",
"operator": "is_any_of",
"values": [
"50-200 employees"
]
}
]
}
},
{
"id": "2e7f4b90-8a13-4c6d-b5e2-7f0a9c3d1e64",
"type": "CUSTOM_PAGE",
"isFallback": true,
"order": 1,
"customUrl": null,
"headline": "Thank you",
"body": "A member of the team contacts you within one working day.",
"eventType": null,
"team": null,
"rules": []
}
]
}
}