This document describes how to use standard questions and custom questions when posting jobs to XING, either via JSON API or XML feed.
It covers:
There are two question categories:
A form may contain:
Important rules:
id
field in every question is used as the key when submitting the applicant’s answers to the ATS.
id
is unique and meaningful for downstream processing.
id
of the question.
Custom questions allow the client to define their own questions that will be shown to the applicant during the application process.
These questions are displayed after the default XING Instant Apply questions and the standardized questions.
The order they are shown to the applicant is determined by the order they are defined in the
custom_questions
array.
Each custom question object must include the following fields:
| Field | Type | Required | Description |
|---|---|---|---|
type
|
String | Yes | The type of the question. Must be one of the supported custom question types below. |
id
|
String | Yes | Unique identifier for the question. |
question
|
String | Yes | The question text shown to the applicant. |
required
|
Boolean | No |
Whether answering is mandatory. Defaults to
false.
|
Additional options can or must be provided based on the question type, as described below.
In order to have some data integrity, we enforce the following limits:
type: "text"
Free text input for applicants to provide their answers. It can be used for single-line or multiline text input, decided via the
multiline
option.
Additional options for text inputs:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
multiline
|
Boolean | No |
false
|
Allows multiline input. |
Returned value:
The value returned for text inputs is a plain string containing the applicant’s response.
type: "date"
A date input allows the applicant to select a date.
Returned value:
The value returned for date inputs is the selected date as a string formatted as
YYYY-MM-DD
.
type: "boolean"
Simple true/false question. It will likely be rendered as a checkbox, switch, or similar.
If the field is not required, the answer can be
null
.
Returned value:
The value returned is a simple boolean
true
or
false
.
type: "numeric"
Free numeric input for applicants to provide a number. Currently, only integer values are supported.
Default allowed range is
0
to
100000000
. Limits can be adjusted via options.
Additional options for numeric inputs:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
min
|
Integer | No |
0
|
Minimum allowed value. Cannot be lower than
-100000000.
|
max
|
Integer | No |
100000000
|
Maximum allowed value. Cannot be higher than
100000000.
|
Returned value:
The value returned for numeric inputs is an integer representing the applicant’s response.
type: "select"
The applicant is presented with a list of options to choose from. They are able to select one or multiple choices.
Additional attributes for select inputs:
| Field | Type | Required | Description |
|---|---|---|---|
options
|
Array | Yes | List of selectable options. See below. |
maximum_choices_allowed
|
Integer |
No, default:
1
|
If set to
1
(default), it is a single-select field.
If set to a value greater than
1
, it uses a multi-select interface.
It can be set to a number equal to or higher than the given options to allow selecting all.
|
Each option in the
options
array should have the following structure:
| Field | Type | Required | Description |
|---|---|---|---|
label
|
String | Yes | Display text for the option. |
value
|
String | Yes | Value submitted when this option is selected. |
We enforce the following limits for select questions:
label
can be at maximum 255 characters long.
Returned value:
maximum_choices_allowed
is not given or
maximum_choices_allowed == 1
, the value returned is the selected option value as a string.
maximum_choices_allowed > 1
, the value returned is an array with the values of the selected options.
type: "file"
A file upload option allows applicants to upload files. Currently, no custom limitation of file types is supported. Files are checked for viruses on our side.
Returned value:
This returns an object containing the uploaded file’s information.
| Field | Type | Description |
|---|---|---|
content_type
|
String | The MIME type of the uploaded file. |
data
|
String | The base64-encoded content of the file. |
file_name
|
String | The original name of the uploaded file. |
Standard question IDs use the reserved namespace
xing.standard.*
.
xing.standard.*
for custom question IDs.
| Question | Question Type | Supported Answer Values | Supported Screening Rule | Notes |
|---|---|---|---|---|
Notice period
xing.standard.notice_period
|
Single-select |
immediately
,
2_weeks
,
1_month
,
2_months
,
3_months
,
6_months
,
other
|
None | |
English level
xing.standard.language_skills.english
|
Single-select |
0
,
1
,
2
,
3
,
4
|
must_be_at_least
|
0
= none,
1
= basic,
2
= good,
3
= fluent,
4
= first language
|
German level
xing.standard.language_skills.german
|
Single-select |
0
,
1
,
2
,
3
,
4
|
must_be_at_least
|
0
= none,
1
= basic,
2
= good,
3
= fluent,
4
= first language
|
Salary expectation
xing.standard.salary_expectation
|
Numeric | Integer >= 0 |
must_be_below
|
Salary is yearly in EUR |
Eligibility to work in the EU
xing.standard.eu_work_eligibility
|
Boolean |
true
or
false
|
must_be_true
|
|
Country of residence
xing.standard.country_of_residence
|
Country |
ISO 3166-1 alpha-2 country code, for example
DE
,
ES
,
CH
|
None | Must not be used as a screen-out criterion |
City of residence
xing.standard.city_of_residence
|
Text | String, max 500 characters | None | |
Driving license
xing.standard.driving_license
|
Boolean |
true
or
false
|
must_be_true
|
|
Gender
xing.standard.gender
|
Single-select |
m
,
f
,
o
,
na
|
None | Always optional. This is phrased as “how should we address you?” |
Cover letter
xing.standard.cover_letter
|
File | Uploaded file key | None | |
Work certificate
xing.standard.work_certificate
|
File | Uploaded file key | None | Arbeitszeugnis |
Education certificate
xing.standard.education_certificate
|
File | Uploaded file key | None | Abschlusszeugnis |
Additional comments
xing.standard.additional_comments
|
Text | String, max 500 characters | None | Multiline text. Always optional. Rendered at the end of the application form. |
| Rule | Meaning | Example |
|---|---|---|
must_be_at_least
|
The applicant answer must be greater than or equal to the configured value. | If the configured threshold is 3, then 3 and 4 pass, while 0, 1, and 2 fail. |
must_be_below
|
The applicant answer must be strictly lower than the configured value. | If the configured threshold is 90000, then 85000 passes, while 90000 and 95000 fail. |
must_be_true
|
The applicant answer must be
true.
|
If
must_be_true
is configured, then
true
passes and
false fails.
|
If a screening rule is configured and the applicant does not provide an answer, the application does not satisfy the screening rule.
xing.standard.gender
is always optional, even if you send it as required.
xing.standard.gender,
the
required
flag is ignored.
xing.standard.gender
must not be used as a screen-out criterion.
xing.standard.country_of_residence
must not be used as a screen-out criterion.
This section describes how the questions should be included in the JSON payload when creating job postings via our E-Recruiting JSON API.
| Field | Required | Type | Description |
|---|---|---|---|
standard_questions
|
Yes | Array | List of configured standard questions |
custom_questions
|
Yes | Array | List of configured custom questions |
Notes:
standard_questions
and
custom_questions
can be used together.
"custom_questions": [].
"standard_questions": [].
Canonical JSON example
{
"standard_questions": [
{
"id": "xing.standard.notice_period",
"required": true
},
{
"id": "xing.standard.language_skills.english",
"required": true,
"must_be_at_least": 3
},
{
"id": "xing.standard.salary_expectation",
"required": true,
"must_be_below": 90000
},
{
"id": "xing.standard.eu_work_eligibility",
"required": true,
"must_be_true": true
},
{
"id": "xing.standard.country_of_residence",
"required": true
},
{
"id": "xing.standard.gender",
"required": false
},
{
"id": "xing.standard.cover_letter",
"required": false
}
],
"custom_questions": []
}
Supported JSON fields for standard questions
| Field | Required | Type | Applies To | Notes |
|---|---|---|---|---|
id
|
Yes | String | All standard questions | Must be one of the supported IDs |
required
|
No | Boolean | All standard questions |
For
xing.standard.gender
, this flag is ignored and the question remains optional.
|
must_be_at_least
|
No | Integer | English and German language skills | Inclusive minimum threshold |
must_be_below
|
No | Integer | Salary expectation | Strict maximum threshold for yearly salary in EUR |
must_be_true
|
No | Boolean | EU work eligibility and driving license |
If set, only
true
passes screening
|
Canonical JSON example
{
"standard_questions": [
{
"id": "xing.standard.city_of_residence",
"required": true
}
],
"custom_questions": [
{
"type": "text",
"id": "motivation",
"question": "Why do you want to work with us?",
"multiline": true,
"required": false
},
{
"type": "date",
"id": "starting_date",
"question": "When could you start?",
"required": true
},
{
"type": "select",
"id": "preferred_location",
"question": "Which location do you prefer?",
"required": true,
"options": [
{ "label": "Berlin", "value": "berlin" },
{ "label": "Hamburg", "value": "hamburg" },
{ "label": "Remote", "value": "remote" }
]
},
{
"type": "select",
"id": "preferred_locations",
"question": "Which locations would you accept?",
"required": false,
"maximum_choices_allowed": 2,
"options": [
{ "label": "Berlin", "value": "berlin" },
{ "label": "Hamburg", "value": "hamburg" },
{ "label": "Remote", "value": "remote" }
]
},
{
"type": "numeric",
"id": "years_of_experience",
"question": "How many years of experience do you have?",
"required": false,
"min": 0,
"max": 50
},
{
"type": "boolean",
"id": "willing_to_relocate",
"question": "Are you willing to relocate?",
"required": false
},
{
"type": "file",
"id": "portfolio",
"question": "Upload your portfolio",
"required": false
}
]
}
Single-value answers
{ "id": "motivation", "value": "I want to join because..." }
{ "id": "starting_date", "value": "2026-05-01" }
{ "id": "preferred_location", "value": "remote" }
{ "id": "years_of_experience", "value": "7" }
{ "id": "willing_to_relocate", "value": "true" }
{ "id": "portfolio", "value": "uploaded-file-key-123" }
{ "id": "xing.standard.country_of_residence", "value": "DE" }
Multi-select answers
{ "id": "preferred_locations", "values": ["berlin", "remote"] }
This section describes how to include standard and custom questions via our E-Recruiting feed.
In XML, field names use
snake_case
.
apply_questions
standard_questions
standard_question
custom_questions
question
If a section is empty, you can send an empty container.
Canonical XML example
<apply_questions>
<standard_questions>
<standard_question>
<id>xing.standard.notice_period</id>
<required>true</required>
</standard_question>
<standard_question>
<id>xing.standard.language_skills.english</id>
<required>true</required>
<must_be_at_least>3</must_be_at_least>
</standard_question>
<standard_question>
<id>xing.standard.salary_expectation</id>
<required>true</required>
<must_be_below>90000</must_be_below>
</standard_question>
<standard_question>
<id>xing.standard.eu_work_eligibility</id>
<required>true</required>
<must_be_true>true</must_be_true>
</standard_question>
<standard_question>
<id>xing.standard.country_of_residence</id>
<required>true</required>
</standard_question>
<standard_question>
<id>xing.standard.gender</id>
<required>false</required>
</standard_question>
<standard_question>
<id>xing.standard.cover_letter</id>
<required>false</required>
</standard_question>
</standard_questions>
<custom_questions />
</apply_questions>
Supported XML fields for standard questions
| Field | Required | Applies To | Notes |
|---|---|---|---|
<id>
|
Yes | All standard questions | Must be one of the supported IDs |
<required>
|
No | All standard questions |
For
xing.standard.gender
, this field is ignored and the question remains optional.
|
<must_be_at_least>
|
No | English and German language skills | Inclusive minimum threshold |
<must_be_below>
|
No | Salary expectation | Strict maximum threshold for yearly salary in EUR |
<must_be_true>
|
No | EU work eligibility and driving license |
If set, only
true
passes screening
|
Canonical XML example
<apply_questions>
<standard_questions>
<standard_question>
<id>xing.standard.city_of_residence</id>
<required>true</required>
</standard_question>
</standard_questions>
<custom_questions>
<question type="text" id="motivation" multiline="true" required="false">
<text>Why do you want to work with us?</text>
</question>
<question type="date" id="starting_date" required="true">
<text>When could you start?</text>
</question>
<question type="select" id="preferred_location" required="true">
<text>Which location do you prefer?</text>
<options>
<option label="Berlin" value="berlin" />
<option label="Hamburg" value="hamburg" />
<option label="Remote" value="remote" />
</options>
</question>
<question type="select" id="preferred_locations" required="false" maximum_choices_allowed="2">
<text>Which locations would you accept?</text>
<options>
<option label="Berlin" value="berlin" />
<option label="Hamburg" value="hamburg" />
<option label="Remote" value="remote" />
</options>
</question>
<question type="numeric" id="years_of_experience" required="false" min="0" max="50">
<text>How many years of experience do you have?</text>
</question>
<question type="boolean" id="willing_to_relocate" required="false">
<text>Are you willing to relocate?</text>
</question>
<question type="file" id="portfolio" required="false">
<text>Upload your portfolio</text>
</question>
</custom_questions>
</apply_questions>
| Field | Usage / Meaning |
|---|---|
type
|
Use the
type
attribute to define the question type.
|
id
|
Use the
id
attribute for the unique question ID.
|
<text>
|
Use the
element for the candidate-facing question text.
|
<options>
|
Use
for select questions.
|
required
|
Use the
required
attribute where applicable.
|
multiline
|
Use the
multiline
attribute for text questions.
|
maximum_choices_allowed
|
For multi-select questions, use
type="select"
together with
maximum_choices_allowed
greater than
1
.
|
min
and
max
|
Use the
min
and
max attributes
for numeric questions.
|
label
|
Display text only |
value
|
The contract value that will be returned in the answer |