Get forms

Reads one form of the caller's org, by its id or its slug.

GET /v1/form/forms/{id}

Addresshttps://api.hanzo.ai/v1/form/forms/{id}
MethodGET
Operationget_form
AuthAuthorization: Bearer $HANZO_API_KEY

Reads one form of the caller's org, by its id or its slug. An org admin only.

Request

1 field.

FieldInTypeRequiredDescription
idpathstringyesID is the form's id or its slug, from the path.

Response

StatusBodyMeaning
200form.Formok
defaultproblem-detailsrefused

200 body — 61 fields.

FieldInTypeAlwaysDescription
createdbodystring—Created is when the form was made, RFC 3339.
fieldsbodyform.Field[]—Fields are the questions, in the order they are asked.
fields[].choicesbodyform.Choice[]—Choices are what a multiple_choice or dropdown field offers, in order.
fields[].choices[].idbodystring—ID is the choice's id, assigned when empty.
fields[].choices[].labelbodystring—Label is the choice as shown.
fields[].choices[].refbodystring—Ref is how an answer names the choice; unique in the field, defaults to the id.
fields[].descriptionbodystring—Description is the line under the question.
fields[].idbodystring—ID is the field's id: assigned when a write leaves it empty, and kept across edits by sending it back.
fields[].labelsbodyform.Labels—
fields[].labels.centerbodystring—
fields[].labels.leftbodystring—
fields[].labels.rightbodystring—
fields[].multiplebodyboolean—Multiple is whether a multiple_choice field takes several choices.
fields[].refbodystring—Ref is the field's stable name, how an answer and a sink name it: lowercase letters, digits, dash and underscore, at most 64, unique in the form.
fields[].requiredbodyboolean—Required is whether a completed response must answer it.
fields[].startbodyinteger (int64)—Start is where an opinion_scale begins: 0 (the default) or 1.
fields[].stepsbodyinteger (int64)—Steps is how many points a rating (3 to 10, default 5) or an opinion_scale (5 to 11, default 11) has.
fields[].titlebodystring—Title is the question as asked.
fields[].typebodystring—Type is one of short_text, long_text, email, phone, url, number, rating, opinion_scale, yes_no, multiple_choice, dropdown, date and statement.
fields[].validationsbodyform.Validations—
fields[].validations.max_lengthbodyinteger (int64)—MaxLength is the most characters a text answer holds, at most the platform's bound for the type.
fields[].validations.max_valuebodynumber (double)—MaxValue is the most a number answer may be.
fields[].validations.min_valuebodynumber (double)—MinValue is the least a number answer may be.
hiddenbodystring[]—Hidden names the values a page passes in when it embeds the form (a video id, a plan): lowercase letters, digits and underscores, at most 32 each.
idbodystring—ID is the form's id: 15 lowercase hex characters, derived from the slug when the form has one, so a slug names one form for good.
kindbodystring—Kind is form (every submission is a response, the default) or subscribe (a mailing list: an email field is required and one address is one response).
public_idbodystring—PublicID is the address the form is answered at: "<org>.<slug or id>", as GET /v1/form/public/{id} and POST /v1/form/public/{id}/responses take it.
settingsbodyform.Options—
settings.identitybodystring—Identity is who a response is from when nobody is signed in.
settings.languagebodystring—Language is the form's language, a tag like en or pt-BR.
settings.modebodystring—Mode is one (a question at a time, the default) or all (every question at once).
settings.progressbodyboolean—Progress is whether the renderer shows a progress bar.
settings.visibilitybodystring—Visibility is public (answerable at its public address by anyone) or private (not served there).
sinksbodyform.Sinks—
sinks.crmbodyform.CRM—
sinks.crm.companybodystring—Company is the ref of the field whose answer is the person's company.
sinks.crm.emailbodystring—Email is the ref of the field whose answer is the person's address.
sinks.crm.listbodystring—List is the CRM list the person joins, by name (a subscribe form's mailing list).
sinks.crm.namebodystring—Name is the ref of the field whose answer is the person's name.
sinks.eventsbodyboolean—Events states form_viewed, form_started and form_submitted on the deployment's event stream: the form's ids and the refs of the fields answered, never an answer's text.
sinks.forwardbodyform.Forward—
sinks.forward.emailbodystring—Email is the address.
sinks.forward.namebodystring—Name is who it is, for the greeting.
sinks.welcomebodyform.Welcome—
sinks.welcome.bodybodystring—Body is the mail's text: plain text, a blank line a new paragraph.
sinks.welcome.subjectbodystring—Subject is the mail's subject.
slugbodystring—Slug is the form's own name within its org: lowercase letters, digits and dashes, at most 64.
tagsbodystring[]—Tags label the form for its org: at most 20, each at most 64 characters.
thanksbodyform.Screen—
thanks.buttonbodystring—Button is the button's label.
thanks.descriptionbodystring—Description is the text under it.
thanks.redirectbodystring—Redirect is where a thank-you screen sends the respondent instead of showing itself: an https address.
thanks.titlebodystring—Title is the screen's heading.
themebodystring—Theme is the id of the theme the form is drawn in.
titlebodystring—Title is the form's name, as a respondent and the CRM timeline read it.
updatedbodystring—Updated is when it last changed, RFC 3339.
welcomebodyform.Screen—
welcome.buttonbodystring—Button is the button's label.
welcome.descriptionbodystring—Description is the text under it.
welcome.redirectbodystring—Redirect is where a thank-you screen sends the respondent instead of showing itself: an https address.
welcome.titlebodystring—Title is the screen's heading.

Failure carries the platform error shape — see Errors.

Examples

hanzo form forms get <id>
import { Configuration, FormApi } from 'hanzoai';

const api = new FormApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getForm({ id: 'id' });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import FormApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = FormApi(client).get_form(id='id')
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.FormAPI.GetForm(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, form_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = form_api::get_form(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.FormApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new FormApi(client).getForm();

The method above is the one at the current release of the document. [email protected] (npm) and [email protected] (PyPI) were generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →

curl https://api.hanzo.ai/v1/form/forms/<id> \
  -H "Authorization: Bearer $HANZO_API_KEY"

Tool form, op get_form — POST the JSON-RPC envelope to https://api.hanzo.ai/v1/mcp.

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "form",
         "arguments": {
           "op": "get_form",
           "input": {
             "id": "<id>"
           }
         }
       }
     }'

Form API · All Hanzo APIs · Interactive reference

Was this page useful?
Broken link or missing step? Drop it in #docs on Discord or open a PR.