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
  1. The first request carries no afterCursorId — it returns the first page.
  2. Pass meta.nextCursor.id from the response as the afterCursorId parameter of the next request. Copy the cursor whole, never assemble it from record fields.
  3. A response whose meta.nextCursor is null marks the end of the listing. The method has no offset parameter and no total count.

Examples

curl — personal key

Terminal
curl "https://vibecode.bitrix24.com/v1/performan/review/manager/questions?campaignId=1" \
  -H "X-Api-Key: YOUR_API_KEY"

curl — OAuth application

Terminal
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

javascript
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

javascript
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 Array of manager-stage questions
data[].id number Question ID. Passed in the answers[].questionId field when writing an answer
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 Bitrix24 account language
data[].required boolean Whether an answer is needed to finalise the review
data[].isRating boolean Whether the answer forms the card's final rating
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

JSON
{
  "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 rating",
      "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:

JSON
{
  "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 portal. The answer is indistinguishable from the answer to any address that does not exist
404 ENTITY_NOT_FOUND The section is enabled, but the portal has no Performance Review module: Bitrix24 answers that the performan.review.* method was not found
403 BITRIX_ACCESS_DENIED Bitrix24 denied access. The permissions the key uses to reach the portal do not include performan
409 PERFORMAN_SCOPE_JUST_GRANTED A Cowork key was granted the performan scope by this very request. Repeat it and it goes through
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

Unknown query parameters are ignored. The method reads campaignId, limit and afterCursorId and drops everything else without an error: a request with a typo in a parameter name returns 200 with an unfiltered listing. For instance, revieweeUserId narrows the listing only on manager review cards — on the other lists it is dropped silently.

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 no way to obtain its ID, so only text questions of type 3 can be answered through the API.

The mandatory rating question blocks finalisation. A question with required: true and isRating: true is of type 1, single choice. Because of the limitation above, it cannot be answered through the API, so finalising the manager review 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.

See also