For AI agents: markdown of this page — /docs-content-en/performan/manager-questions.md documentation index — /llms.txt
Manager-stage questions
GET /v1/performan/review/manager/questions
Returns the manager-stage questions of a campaign: wording, type, whether an answer is mandatory, and the ordering. The campaign id parameter is required, and the listing is cursor based.
Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
campaignId (query) |
number | yes | — | Campaign id. The campaign list — GET /v1/performan/review/campaigns |
limit (query) |
number | no | 50 | Records per page, 200 at most |
afterCursorId (query) |
number | no | — | The next-page cursor. The value comes from meta.nextCursor.id of the previous response. The first request omits it |
Examples
curl — personal key
curl "https://vibecode.bitrix24.com/v1/performan/review/manager/questions?campaignId=1" \
-H "X-Api-Key: YOUR_API_KEY"
curl — OAuth application
curl "https://vibecode.bitrix24.com/v1/performan/review/manager/questions?campaignId=1" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN"
JavaScript — personal key
const res = await fetch('https://vibecode.bitrix24.com/v1/performan/review/manager/questions?campaignId=1', {
headers: { 'X-Api-Key': 'YOUR_API_KEY' },
})
const body = await res.json()
if (!body.success) {
throw new Error(`${body.error.code}: ${body.error.message}`)
}
// Text questions can be answered through the API, choice questions cannot
const answerable = body.data.filter((q) => q.type === '3')
console.log(answerable.map((q) => [q.id, q.title, q.required]))
JavaScript — OAuth application
const res = await fetch('https://vibecode.bitrix24.com/v1/performan/review/manager/questions?campaignId=1', {
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
},
})
const body = await res.json()
if (!body.success) {
throw new Error(`${body.error.code}: ${body.error.message}`)
}
console.log(body.data, body.meta.nextCursor)
Response fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Always true on success |
data |
array | The manager-stage question array |
data[].id |
number | Question id. Goes into the answers[].questionId field of a write |
data[].campaignId |
number | The question's campaign. The list — GET /v1/performan/review/campaigns |
data[].campaignStageId |
number | The campaign stage the question belongs to |
data[].title |
string | Question wording |
data[].description |
string | Question note |
data[].type |
string | Question type as a string: 1 — single choice, 2 — multiple choice, 3 — text answer |
data[].typeLabel |
string | Question type name in the portal language |
data[].required |
boolean | Whether an answer is needed to finalise the review |
data[].isRating |
boolean | Whether the answer forms the card's final rate |
data[].sort |
number | The question's position on the stage |
meta.nextCursor |
object | null | The next-page cursor. null — no more records |
meta.nextCursor.id |
number | The value for the afterCursorId parameter of the next request |
Response example
{
"success": true,
"data": [
{
"id": 23,
"campaignId": 1,
"campaignStageId": 5,
"title": "Comment",
"description": "",
"type": "3",
"typeLabel": "Text answer",
"required": false,
"isRating": false,
"sort": 90
},
{
"id": 22,
"campaignId": 1,
"campaignStageId": 5,
"title": "Final decisions",
"description": "Tick the applicable items — input fields will appear.",
"type": "2",
"typeLabel": "Multiple choice",
"required": false,
"isRating": false,
"sort": 80
},
{
"id": 21,
"campaignId": 1,
"campaignStageId": 5,
"title": "Final rate",
"description": "",
"type": "1",
"typeLabel": "Single choice",
"required": true,
"isRating": true,
"sort": 70
}
],
"meta": { "nextCursor": { "id": 21 } }
}
Error response example
400 — a required parameter was not sent:
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "campaignId is required and must be a positive integer"
}
}
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | INVALID_PARAMS |
campaignId was not sent, or the value of campaignId or afterCursorId is not a positive integer, or limit is outside the 1–200 range |
| 401 | MISSING_API_KEY |
The X-Api-Key header was not sent |
| 401 | TOKEN_MISSING |
The key has no portal tokens. An OAuth application key requires the Authorization: Bearer header |
| 403 | SCOPE_DENIED |
The key has no performan scope |
| 404 | ROUTE_NOT_FOUND |
The Performance Review section is not enabled for the account. The answer is indistinguishable from the answer to any address that does not exist |
| 404 | ENTITY_NOT_FOUND |
The section is enabled, but the account has no Performance Review module: Bitrix24 answers that the performan.review.* method was not found |
| 409 | PERFORMAN_SCOPE_JUST_GRANTED |
A Cowork key was granted the performan scope by this very request. Repeat it and it goes through |
| 403 | BITRIX_ACCESS_DENIED |
Bitrix24 denied access. The permissions the key uses to reach the portal do not include performan |
| 422 | BITRIX_ERROR |
Bitrix24 rejected the request. The cause is in error.message, the machine code from Bitrix24 in error.b24Code |
| 429 | RATE_LIMITED |
The request rate on the Bitrix24 side was exceeded |
| 429 | QUEUE_OVERFLOW, QUEUE_TIMEOUT |
The portal request queue is full or the request did not get through the queue in time. The Retry-After header suggests the delay |
| 503 | BITRIX_TIMEOUT |
Bitrix24 accepted the request but did not answer in time. A read is safe to retry |
| 502 | BITRIX_UNAVAILABLE |
Bitrix24 is unavailable |
The full list of common API errors — Errors.
Known specifics
The method does not return answer options. A question of type 1 or 2 has a list of options, but their ids come neither from this method nor from a review card: the answers[].selectedOptions field carries only the options already chosen. Until an option is selected in the Bitrix24 interface there is nowhere to take its id from, so the API can fill only text questions of type 3.
The mandatory rating question blocks finalisation. A question with required: true and isRating: true is of type 1, single choice. Because of the limit above it cannot be answered through the API, so finalising with POST /v1/performan/review/manager/answers and isAutosave: false returns 422 BITRIX_ERROR with a message about unanswered mandatory fields.
The listing order is descending id, not the sort field. The sort field defines the order the questions have on the stage in the Bitrix24 interface and does not affect the order of records in the response. To show the questions the way an employee sees them, collect the whole list and sort it by ascending sort on your side.