Skip to main content

Overview

Kombo’s parsing process extracts the screening questions and additional form metadata for a job posting. This page describes the API response structure and provides advice on displaying the form in your product.

Block structure

The application form is composed of an array of blocks. Each block’s block_type tells you how to render it: Every job’s application form is different and dynamically parsed by Kombo. Ensure you handle the block structure by rendering all blocks in the order provided, including nested sections.

Sections

A section has a label and a children array. Its children can be questions, information blocks, or further sections.
Questions and information blocks can also appear at the top level without a section.
Increase the heading level for each nested section, up to h6. For example, if your page title uses h1, start the form’s sections at h2 and increment by one per nested heading. Sections have no display_when property of their own. Display a section and its heading only when at least one question or information block within it is visible, including through nested sections. See Conditional rendering.

Questions

Every question includes question_id, label, description, required, category, question_type, unified_key, options, and display_when. Use question_type to choose how to render the input and question_id to identify its answer. Show the label, mark required questions, and display the description as helper text when it is not null. The options array is present for SINGLE_SELECT and MULTI_SELECT questions and is null for other types. Each option has an id, a label, and a nullable unified_key.

Information blocks

An information block contains instructions or other content in its text property. It has no question_id and does not collect an answer.
Render the text where it appears in the form. Information blocks follow the same display_when rules as questions, so explanations can appear alongside the questions they relate to.

HTML within labels, descriptions, and information block text

Question labels, descriptions, and information block text can contain HTML links, such as a link to a privacy policy.
This content comes from external career sites. Treat it as untrusted HTML and sanitize it before rendering.
Example

Categories

Questions and information blocks include a category value. "EEO" identifies Equal Employment Opportunity content, and null means uncategorized. The category describes the content. required and display_when still determine whether an answer is required.
Example

Question type details

The examples below pair each question type with a matching answer.
A TEXT question accepts a non-empty string.
Question
Answer
A NUMBER question accepts a number.
Question
Answer
A BOOLEAN question accepts true or false.
Question
Answer
Let candidates answer consent questions themselves. Do not pre-fill consent answers.
A DATE question accepts an ISO 8601 date string.
Question
Answer
A SINGLE_SELECT question accepts the id of one option from its options array.
Question
Answer
A MULTI_SELECT question accepts an array of option IDs from its options array.
Question
Answer
A FILE question accepts one file as an object containing:
  • name: the filename, including its extension.
  • content_type: the file’s MIME type.
  • data: the base64-encoded file contents.
Question
Answer

Storing candidate answers

Your application can reuse the same answer format to drive the whole apply flow. Keep a map of question_id to answer for each candidate’s application session. Using the same values when evaluating display_when conditions and building the application payload ensures these steps stay consistent. When building screening_question_answers, turn the map into an array of { question_id, answer } entries using those stored values. Omit unanswered optional questions from the submission.

Conditional rendering

Questions and information blocks have a nullable display_when property. When it is null, the block is always visible. Otherwise, display the block only when the referenced question’s current answer matches answer_equals. The condition refers to a question through question_id. Match against the answer you store for that question: If the referenced question has no answer yet, the condition is not met. For multi-selects, the arrays do not need to be identical: a condition containing English and German is met if the candidate selects either language, or both. Re-evaluate conditions whenever an answer changes. A conditional question can reveal further questions, so follow the chain of conditions recursively. When a question’s condition is no longer met, remove its answer from storage. This prevents an old answer from keeping further questions visible or being included in the submission.
A required question needs an answer only when its condition is met. Do not submit answers to questions whose conditions are not met. Hide a section and its heading when none of its questions or information blocks remain visible, including within nested sections.

Complete application form example

Below you’ll find a sample application form to use as test data for your form renderer. This example combines all block types and all question types. It includes nested sections, required and optional questions, HTML links, EEO content, and unified keys on questions and options.
Check these behaviors:
  • Initial state (no answers): hide all conditional blocks and empty sections.
  • Select Remote as the working location: show the Remote Work section.
  • Try both computer answers: show the matching conditional equipment questions.
  • Deselect Remote as the working location: hide its sections and clear their answers.
  • Select Hybrid: show its information block and heading.
  • Languages: show Language Experience only for English or German.
  • Gender: show the follow-up only for Prefer to self-describe.