Candidates (sub-entities): Managing Candidate Companies, Project Experience, Candidate Pools, Dialogue Emails, and CV Parsing via the API

In this article, you can read about how to link and unlink companies on a candidate, manage a candidate's project experience entries, add or remove candidates from candidate pools, bulk actions with candidate attributes, log or queue candidate emails via candidate dialogue, and trigger AI-based CV parsing on an uploaded candidate file.

Candidate Companies

You can link one or more companies to a candidate or remove that link using thecandidateCompany scope. To insert companies, use the POST method. The operation must be set to insert and scope to candidateCompany.

When inserting new companies, the field candidateId and the array of integers companyIds are required.

POST

https://api.recman.io/v2/post/
{
  "key": "{{api_key}}",
  "scope": "candidateCompany",
  "operation": "insert",
  "data": {
    "candidateId": 2030141,
    "companyIds": [423645, 423646]
  }
}

To remove companies, use the same field structure with "operation": "delete".

Note

Both operations accept multiple company IDs in a single request.

PARAMS

candidateId2030141
required – the candidate to link/unlink companies on
companyIds[423645, 423646]
required – array of company IDs to add or remove

Candidate Project Experience

Project experience entries (separate from work experience) can be inserted, updated or deleted individually using the candidateProjectExperience scope.

POST

{
  "key": "{{api_key}}",
  "scope": "candidateProjectExperience",
  "operation": "insert",
  "data": {
    "candidateId": 2856682,
    "name": "Project example",
    "url": "www.recman.no",
    "description": "Project description",
    "fromDate": "2012-05-01",
    "toDate": "2022-11-16"
  }
}

To update/delete an entry, use:"operation": "update" or "operation": "delete". You must provide a projectExperienceId.

PARAMS

candidateId2856682
required on insert
projectExperienceId
required on delete and update
nameProject example
required on insert
urlwww.recman.no
optional
descriptionProject description
optional
fromDate2012-05-01
optional. Format: Y-m-d
toDate2022-11-16
optional. Format: Y-m-d

Candidate Pools

Candidate pools group candidates together (e.g., "New candidates for job post"). 

Use the candidatePool scope to retrieve a pool's contents or manage its members.

Retrieve a Candidate Pool

Retrieving data about candidate pools is done through the GET method.

You can request a list of all candidate pools or retrieve a specific candidate pool.

To get candidate IDs within a pool, specify the candidatePoolId parameter. This means that you can get candidate IDs only within a specific pool, not with a pool list.

GET

https://api.recman.io/v2/get/?key={{api_key}}
&scope=candidatePool&candidatePoolId=436235

PARAMS

key{{api_key}} 
required
scopecandidatePool
required
candidatePoolId436235
optional

Add or Remove Candidates

POST

{
  "key": "{{api_key}}",
  "scope": "candidatePool",
  "operation": "insert",
  "data": {
    "candidatePoolId": 436235,
    "candidateIds": [123456, 321435, 442214]
  }
}

To remove candidates from a pool, use the same structure with "operation": "delete".

PARAMS

candidatePoolId436235
required
candidateIds[123456, 321435, 442214]
required – candidate IDs to add (insert) or remove (delete)

Candidate Attributes

The candidateAttribute scope lets you insert, update, and delete candidate attributes in bulk. Each request operates on a single candidateId and processes up to 50 attributes in one call.

Attribute values are validated dynamically based on the attribute configuration stored in the system settings. The API supports multiple attribute types, including boolean, rating, text, single-line text, dropdown, date, and checkbox (with an optional per-checkbox rating).

Note

Validation is performed per attribute. Invalid attributes do not stop the request – they are skipped and returned as warnings. Critical validation failures (e.g., invalid candidate, missing attributes) stop execution and return errors.

Root Body

FieldTypeRequiredDescription
candidateIdintegeryesCandidate identifier
attributesarrayyesList of attributes

Attributes

FieldTypeRequiredDescription
attributeIdintegeryesAttribute ID
booleaninteger (0/1)noBoolean value
ratinginteger (1–5)noRating value
textstringnoMulti-line text
singleLineTextstringnoSingle-line text
dropdownIdintegernoDropdown option ID
datestring (YYYY-MM-DD)noDate value
checkboxIdsarraynoCheckbox values

Rating Checkbox

FieldTypeRequiredDescription
idintegeryesCheckbox option ID
ratinginteger (0–5)noCheckbox rating

POST Bulk Insert

{
  "key": "{{api_key}}",
  "scope": "candidateAttribute",
  "operation": "insert",
  "data": {
    "candidateId": 2053160,
    "attributes": [
      {
        "attributeId": 6174,
        "checkboxIds": [
          {"id": 7421, "rating": 1},
          {"id": 7420, "rating": 1}
        ]
      },
      {
        "attributeId": 6358,
        "boolean": 1,
        "rating": 5,
        "checkboxIds": [7821, 7822],
        "text": "test data",
        "singleLineText": "test to single line",
        "date": "2025-01-01"
      }
    ]
  }
}

POST Bulk Update/Delete

Use "operation": "update" or "operation": "delete" with the same body structure as insert. 

Candidate Dialogue (Logging Candidate Emails)

The candidateDialogue scope lets you insert one or more candidate email records in a single request – either just storing them for record-keeping or queuing them to be sent. Each row is validated independently: valid rows are inserted, invalid rows are skipped and reported back with per-field errors.

POST

{
  "key": "{{api_key}}",
  "scope": "candidateDialogue",
  "operation": "insert",
  "dialogueType": "candidateEmail",
  "data": [
    {
      "candidateId": 2061435,
      "fromEmail": "recruiter@example.com",
      "toEmail": "candidate@example.com",
      "ccEmail": "audit@example.com",
      "send": 0,
      "emailSubject": "Interview confirmation",
      "emailMessage": "<p>Looking forward to speaking with you.</p>",
      "created": "2026-05-11 18:30:00"
    }
  ]
}

Top-level fields

FieldTypeRequiredDescription
keystringyesYour API key.
scopestringyesMust be candidateDialogue.
operationstringyesMust be insert.
dialogueTypestringyesMust be candidateEmail.
dataarrayyesArray of candidate email objects. See below.
FieldTypeRequiredDescription
candidateIdintegeryesThe candidate the email belongs to. Must exist in your subscription and be active.
fromEmailstringyesSender email address. Must be a valid email.
toEmailstringyesRecipient email address. Must be a valid email.
ccEmailstringnoCC recipient. If present, must be a valid email.
emailSubjectstringyesSubject line of the email.
emailMessagestringyesBody of the email. HTML is allowed.
sendintegerno0 = store without sending, 1 = queue for sending. Defaults to 0.
createddateyesDate and time the email was created. Format: Y-m-d H:i:s (2026-05-11 18:30:00). Should be in UTC format.

CV Parsing

You can send an already-uploaded candidate file to the AI CV parser for asynchronous processing using the candidateCvParse scope. The parsed results are written back to the candidate's profile once processing completes; the endpoint itself only confirms that parsing has started.

POST

{
  "key": "{{api_key}}",
  "scope": "candidateCvParse",
  "operation": "insert",
  "data": {
    "fileId": 2606675
  }
}

Note

  • The endpoint responds immediately with HTTP 200 – it does not wait for parsing to complete.
  • Parsing requires the subscription to have CV Parsing enabled in the Marketplace.
  • Supported file types depend on the file extension stored in CandidateFile.

PARAMS

FieldTypeRequiredDescription
operationstringyesMust be insert
fileIdintegeryesID of the candidate file to parse. Must be a positive integer.

What's next

Continue with Candidates: Creating Candidates and Nested Data via the API to see how these sub-objects fit into the full candidate record, or Candidates: Updating, Deleting, and Managing Files via the API to modify or remove existing candidate data.

Was this article helpful?
0 out of 0 found this helpful