WP Career Board Pro adds routes to the wcb/v1 namespace, on top of the routes in the Free plugin (see the Free REST API reference). This page lists the Pro routes only. Base URL: https://your-site.com/wp-json/wcb/v1.
- Logged-in browser calls send the
X-WP-Nonce header (wp_create_nonce( 'wp_rest' )). External clients use Application Passwords over HTTPS.
- Pro routes are not gated by the license. The license only controls automatic updates, so a route works on an unlicensed site.
- Permission failures return
401 (not logged in) or 403 (logged in, not allowed) with a WP_Error body.
- Abilities named below (for example
wcb/manage-boards) are the Free plugin’s abilities. Administrators have all of them.
| Route |
Method |
Who may call |
Params |
Notes |
/jobs/{id}/kanban |
GET |
Needs wcb/view-applications, and be an admin, a moderator (wcb/moderate-jobs), or the job’s author |
stage_id (int, 0 = all columns), page (int, default 1) |
Returns one array item per stage with applications, total, has_more, page. With stage_id it returns that one column’s page. 25 cards per page by default (filter wcbp_kanban_stage_limit, capped at 100). |
/applications/{id}/stage |
PUT, PATCH, POST |
Needs wcb/view-applications, and be a moderator or the author of the application’s job |
stage_id (int, required) |
400 wcb_invalid_stage if the stage is not on the job’s board. 409 wcb_application_closed if the application is withdrawn, position closed or job removed. Fires wcbp_application_stage_changed. |
| Route |
Method |
Who may call |
Params |
Notes |
/boards/{id} |
GET |
Anyone |
none |
Returns id, title, currency. 404 wcb_board_not_found for a missing board, and for an unpublished board unless the caller has wcb/manage-boards. |
/boards/{id} |
DELETE |
wcb/manage-boards |
none |
Deletes the board, its stages, and unlinks its jobs. |
/boards/{id}/stages |
GET |
Logged in, and wcb/manage-boards or the board’s author |
none |
Ordered stage list. |
/boards/{id}/stages |
POST |
wcb/manage-boards |
label, color (hex, default #6366f1), sort_order, is_terminal, terminal_outcome |
Creates a stage. |
/boards/{id}/stages/{stage_id} |
PUT, PATCH, POST |
wcb/manage-boards |
label, color, sort_order |
Send only the fields to change. |
/boards/{id}/stages/{stage_id} |
DELETE |
wcb/manage-boards |
none |
Its cards move to the board’s first remaining stage; the response reports moved_to_stage and applications_moved. |
All Field Builder routes need wcb/manage-boards.
| Route |
Method |
Params |
Notes |
/fields/groups |
GET |
board_id, entity_type (default job) |
Lists groups. |
/fields/groups |
POST |
board_id (required, 0 = global), label (required), entity_type (default job), sort_order, excluded_boards (int array) |
excluded_boards hides a job group on those boards. |
/fields/groups/{id} |
PUT, PATCH, POST |
same as create, none required |
|
/fields/groups/{id} |
DELETE |
none |
|
/fields/groups/{group_id}/fields |
GET |
none |
Fields in a group. |
/fields/groups/{group_id}/fields |
POST |
field_type (required), label (required), field_key, options (array), rules (object), visibility (public, employer_only, admin_only; default public), required (bool), sort_order |
Keys are stored with a wcbf_ prefix. 400 wcb_invalid_field_type, 404 wcb_group_not_found, 409 when the key already exists. |
/fields/{id} |
PUT, PATCH, POST |
same as create, none required |
|
/fields/{id} |
DELETE |
none |
|
/fields/reorder |
POST |
items (array of objects, required) |
Saves drag-and-drop order. |
The 17 accepted field_type values: text, textarea, number, url, email, date, date_range, select, multi_select, checkbox, radio, file, video_url, location, salary_range, repeater, conditional.
| Route |
Method |
Who may call |
Params |
Notes |
/resumes |
GET |
Anyone the candidate directory access level allows (setting resume_directory_access: public, members or approved; filter wcb_can_browse_candidates). Others get 401 (logged out) or 403 |
page, per_page (1-50, default 12), search, skill, open_to_work, experience, location, order (ASC, DESC), author |
Public candidate directory. Filtering runs on the server. Returns resumes, total, pages and has_more. |
/resumes |
POST |
Logged in |
none |
Creates a resume for the current user. |
/candidates/{id}/resumes |
GET |
The candidate, or a user with wcb/view-resumes |
none |
Blocked candidates return 404. |
/candidates/{id}/resumes |
POST |
The candidate only |
title (required) |
|
/resumes/{id} |
GET |
Owner, anyone who may read that resume, or wcb/manage-settings |
none |
|
/resumes/{id} |
PUT, PATCH, POST |
Owner or wcb/manage-settings |
title, is_public, custom_fields, sections |
|
/resumes/{id} |
DELETE |
Owner or wcb/manage-settings |
none |
|
/resumes/photo-upload |
POST |
Needs wcb/manage-resume |
multipart file field photo |
|
/resumes/{id}/pdf |
GET |
Same as GET /resumes/{id} |
none |
Streams the generated PDF as a download. |
/resumes/{id}/pdf |
POST |
Owner or wcb/manage-settings |
multipart file field resume_file (PDF only) |
Replaces the attached CV. 400 wcb_invalid_file_type for non-PDF. |
/resumes/{id}/bookmark |
POST |
Logged in |
none |
Toggles the bookmark for the current user. |
| Route |
Method |
Who may call |
Params |
Notes |
/alerts |
GET |
Logged in |
none |
The current user’s alerts, up to 1000. |
/alerts |
POST |
Logged in, or a guest with a valid email when guest alerts are on |
board_id (0 = all), search_query, filters (object: category, type), frequency (instant, daily, weekly; default daily), email (guests) |
Returns id and needsConfirm (true for guests, who must confirm by email). Guests: 5 requests per IP per hour (429 wcb_rate_limited). Everyone: capped per person by the alerts limit (400 wcb_alert_limit). |
/alerts/{id} |
PUT, PATCH, POST |
Alert owner or wcb/manage-settings |
frequency, search_query, filters, board_id |
Returns updated. |
/alerts/{id} |
DELETE |
Alert owner or wcb/manage-settings |
none |
Returns deleted. |
/alerts/{id}/unsubscribe/{token} |
GET, POST |
Anyone with the 32-character token |
none |
One-click unsubscribe used by the email header. Always answers 200 {"unsubscribed":true}, whatever the id or token, so alert IDs cannot be probed; only the correct token deletes the alert. |
All routes need a logged-in user and only touch that user’s rows.
| Route |
Method |
Params |
Notes |
/notifications |
GET |
page (default 1), per_page (1-50, default 20) |
Returns notifications and unread_count. |
/notifications |
DELETE |
none |
Clears all. |
/notifications/{id} |
DELETE |
none |
|
/notifications/{id}/read |
PUT, PATCH, POST |
none |
|
/notifications/read-all |
POST |
none |
|
| Route |
Method |
Who may call |
Params |
Notes |
/push/register-device |
POST |
Logged in |
expo_push_token (required), platform (ios, android), device_name |
400 wcb_invalid_push_token unless the token looks like ExponentPushToken[...] or ExpoPushToken[...]. Returns 201 {"registered":true}. |
/push/register-device |
DELETE |
Logged in |
expo_push_token (required) |
Returns 200 {"unregistered":true}. |
| Route |
Method |
Who may call |
Notes |
/employers/{id}/credits |
GET |
That employer, or wcb/manage-credits |
Returns balance and the 50 newest ledger rows. |
/jobs/{id}/feature |
POST |
The job’s author, or wcb/manage-credits |
Charges the Featured price and features the job. Only publish or pending jobs (409 wcb_not_featurable). Returns id, featured, balance. |
/analytics/credits.csv |
GET |
wcb/view-analytics or wcb/manage-credits |
Streams the credit ledger as CSV, newest first. |
The credit checkout, claim and webhook routes belong to the bundled Credits SDK and live under wbcom-credits/v1. See Credits SDK.
Each allowed call counts against a limit of 30 AI requests per user per hour (429 wcb_rate_limited); permission is checked first, so refused or signed-out calls count for nobody. See AI providers.
| Route |
Method |
Who may call |
Params |
/ai/match |
POST |
Logged in |
query (optional; empty uses the candidate’s resume) |
/candidates/{id}/matches |
GET |
That candidate, or wcb/manage-ai |
none |
/ai/ranked-applications/{job_id} |
GET |
wcb/view-applications, and an admin, moderator or the job’s author |
none |
/jobs/ai-description |
POST |
wcb/post-jobs |
title, company_type, location |
/jobs/{job_id}/ai-cover-letter |
POST |
wcb/apply-jobs |
none |
Responses:
/ai/match and /candidates/{id}/matches return an array of match cards: job_id, score, score_pct, title, company, url, location. Filter wcbp_ai_candidate_matches can change the list.
/ai/ranked-applications/{job_id} returns an array of applicants, best fit first, with score (0 to 100, or null when not scored yet), reason and summary. It returns an empty array when no analysis provider is set. Filter wcbp_ai_ranked_applications can change the list.
/jobs/ai-description returns { "description": "..." }. title defaults to developer, location to remote. 503 wcb_ai_disabled when no analysis provider is set.
/jobs/{job_id}/ai-cover-letter returns { "cover_letter": "..." }. 503 wcb_ai_disabled when no analysis provider is set, and 404 unless the job is published.
| Route |
Method |
Who may call |
Params |
Notes |
/geocode |
GET |
Anyone |
address (required, 2-200 characters) |
Returns { lat, lng } from the active map driver. Results are cached (one day for a hit, one hour for a miss). 30 requests per IP per hour by default (filter wcbp_geocode_rate_limit, 429 wcb_rate_limited). 422 wcbp_geocode_failed when no place is found. |
These three routes run the Pro steps of the setup wizard and need wcb/manage-settings.
| Route |
Method |
Params |
/wizard/activate-license |
POST |
license_key (required) |
/wizard/setup-credits |
POST |
threshold (int, default 5) |
/wizard/create-pro-pages |
POST |
none |
The job feed is an XML file at /wcb-jobs.xml, not a wcb/v1 route. It answers 404 until Settings > Job Feed > Enable Feed is on. It lists published jobs, newest first, 200 per page (?start=0, ?start=200, and so on). It leaves out jobs whose deadline has passed. Each job carries city, country and, for remote jobs, remotetype. The email element appears only when a Contact Email is set. See Job feed.