JobAdder
Read/write the JobAdder recruiting ATS/CRM via its v2 API. Key gotcha: PUT updates are a FULL-resource replace — read-merge-write or you blank omitted fields.
Reach for JobAdder as the ATS write target at the end of a sourcing pipeline: push enriched, qualified candidates, attach them to open jobs, and read jobs/companies/placements. Source → enrich → load into JobAdder.
OAuth app credentials — authorization-code → refresh-token grant (JOBADDER_CLIENT_ID, JOBADDER_CLIENT_SECRET, JOBADDER_REFRESH_TOKEN). Because it's OAuth rather than a single key, JobAdder isn't a self-serve integration yet — you can't connect it from the dashboard. The token endpoint returns your region-specific base URL automatically.
Capabilities
| Tool | Does | Cost |
|---|---|---|
get_current_user | Cheapest call — confirms auth + resolves region base (pilot) | Free |
find_candidates | Search candidates (Name/Email/Phone/Location/Keywords/StatusId) | Free |
add_candidate | Create a candidate (409 on dup email → allow_duplicates) | Free |
add_candidates_to_job | Attach existing candidate(s) to a job (creates applications) | Free |
find_jobs | Search jobs (Active/CompanyId/StatusId/…) | Free |
set_candidate_status | Change candidate status (+ optional note) | Free |
search_by_email | Identity match candidates/contacts/users by email | Free |
count | Count-peek (Limit=0 → only totalCount) | Free |
~52 methods total (companies, contacts, applications, placements, ads, requisitions, notes). The above are the primary ones.
Guidance
- PUT = full replace, not patch.
update_candidate/update_company/update_contact/update_jobblank every field you omit. Alwaysget_*first, merge your change into the full object, then PUT it — including nested objects likesocial. - Custom-field writes fail silently: use
custom:[{"fieldId":N,"value":...}](singularvalue; List values are arrays). A wrong shape returns 200 but doesn't persist — always read the record back to confirm. - Pilot before bulk: production ATS writes — push one record, confirm, then scale. Request the minimum OAuth scopes needed.
- Count-peek before paging: every list takes
Limit=0for justtotalCount;paginatewalksOffset/Limit(max 1000). - IDs are ints, and status/custom-field IDs are account-specific — fetch the definitions per account before writing. Duplicates return 409 with an
X-Allow-Duplicatesheader.
hyreflow tools execute jobadder get_current_user --payload '{}'Refresh tokens may rotate on each refresh — persist the latest back to JOBADDER_REFRESH_TOKEN for long-lived runs.
Rate limits & bulk writes
JobAdder does not publish a fixed RPM, so the adapter defaults to a conservative 120 requests / minute.
Use add_candidates_batch, add_companies_batch, add_contacts_batch and add_jobs_batch for large pushes.
See Bulk pushes to ATS / recruiting CRM.