Docs
API reference

Send candidate feedback to several candidates

POST
/api/v1/jobs/{jobId}/candidate-kits/release

Emails the drafted feedback of up to 25 of the job's candidates, each as a single release with channel: email would (same sender, subject and 90-day link), and answers with one outcome per report and the totals. A bulk send only ever emails: it never copies a link and never returns one. A candidate is skipped, with a reason, when there is no draft (no_draft), the link was revoked (revoked), there is no usable email address (no_email), the same feedback was already emailed (already_sent), every section is off or every item removed (nothing_to_send), or its wording has a warning and you did not set acknowledgeWarnings (needs_review; show a person the warnings from GET /v1/reports/{id}/candidate-kit first). A report that is not part of the job is skipped as report_not_found. A send that was tried and did not work is failed (rate_limited after five emails a day for one feedback, send_failed). Skipped candidates never stop the others. Releasing is allowed before a hiring decision is recorded. Send an Idempotency-Key: a retry returns the first result and emails nothing twice. The key's owner must be a member or admin and the job must be open. Answers candidate_feedback_disabled while an admin has turned candidate feedback off in the organization settings.

Required scope: candidate_feedback:write.

Errors

  • 400: invalid_content_type, invalid_idempotency_key, invalid_json, invalid_request, request_body_too_large, unknown_field
  • 401: authentication_required, invalid_api_key
  • 403: api_access_disabled, candidate_feedback_disabled, insufficient_scope, permission_denied
  • 404: job_not_found
  • 409: idempotency_key_reused, idempotency_request_in_progress, job_closed
  • 422: invalid_parameter
  • 429: rate_limit_exceeded
  • 500: api_error
  • 503: maintenance_mode, service_unavailable

Authorization

ApiKey
headerAuthorizationBearer <probb_live_<id>_<secret>>

Path Parameters

jobId*string

The job's ID.

Length1 <= length <= 200

Header Parameters

Idempotency-Key?string

Makes retries safe. Repeating a request with the same key and body within 24 hours returns the original response with Idempotent-Replayed: true. The same key with a different body, or from a different API key, returns idempotency_key_reused.

Length1 <= length <= 255

Request Body

application/json
  1. body
reportIds*array<>

The job's reports to email feedback to, at most 25. A report sent twice counts once. A report that is not part of the job is skipped, never revealed.

Items1 <= items <= 25
acknowledgeWarnings?boolean

Set to true once a person has seen the wording warnings and wants to send anyway. Without it, a candidate whose wording has a warning is skipped as needs_review.

Response Body

Success.

application/json
  1. response
object*string
jobId*string

The job.

totals*
outcomes*array<>

One outcome per report, in the order requested.

Example Request
# Set PROBB_URL and PROBB_API_KEY. Replace any *_VALUE placeholder and any example ID (such as job_example) with a real one.# Idempotency-Key is optional. Reuse the same key and body when retrying one logical write.curl --fail-with-body -X POST "$PROBB_URL/api/v1/jobs/JOB_ID_VALUE/candidate-kits/release" \  -H "Authorization: Bearer $PROBB_API_KEY" \  -H "Idempotency-Key: $REQUEST_KEY" \  -H 'Content-Type: application/json' \  --data-binary '{  "reportIds": [    "rep_example_1",    "rep_example_2",    "rep_example_3"  ],  "acknowledgeWarnings": false}'
Example Response
{  "object": "candidate_kit_bulk_release",  "jobId": "string",  "totals": {    "sent": -9007199254740991,    "skipped": -9007199254740991,    "failed": -9007199254740991  },  "outcomes": [    {      "reportId": "string",      "candidateName": "string",      "status": "sent",      "reason": "no_draft",      "message": "string",      "delivery": "not_requested"    }  ]}