Endpoint
Sync candidates
Push a candidate from your case-management system (CaseWorthy, Apricot, ETO, Salesforce NPSP, homegrown). Astris matches, scores, and lets you query ranked open roles.
Authentication
Requires the candidates scope. Key must be organization-scoped.
Endpoints
POST
/api/v1/candidates/syncGET
/api/v1/candidatesPOST /api/v1/candidates/sync — request
firstNamestringrequiredFirst name as recorded by your case-management system.
lastNamestringrequiredLast name.
preferredNamestringWhat the candidate goes by.
emailstringEmail. Used as upsert key when present — re-POST with the same email updates the existing candidate.
phonestringPhone number with country code.
citystringCurrent city.
statestringTwo-letter state code.
workAuthStatusenumOne of: us_citizen, permanent_resident, refugee, asylee, asylum_pending, tps, parolee, student_visa, h1b, other_ead, pending, unknown.
countryOfOriginstringCountry of origin (free-text).
nativeLanguagestringNative language.
resumeTextstringRaw resume body. If provided, Astris parses it with the resume parser and stores a CandidateDocument.
consentToContactbooleanWhether the candidate consented to contact.
consentToShareDatabooleanWhether the candidate consented to data-sharing with prospective employers.
Response
{
"candidateId": "2378f4cc-15dd-48bc-85be-d2626bb9a2cb",
"action": "created", // or "updated"
"parsed": {
"skills": ["Team Leadership", "Scheduling", "Tractor Operation"],
"certifications": [],
"languages": ["Dari", "Pashto", "English"],
"yearsExperience": 6,
"workHistory": [{"employerName": "ACME Farm", "jobTitle": "Agricultural Supervisor", "startDate": "2018"}]
}
}Example — push from CaseWorthy
const KEY = process.env.ASTRIS_API_KEY;
// caseworthy.findClients() is your wrapper for their API or DB.
const clients = await caseworthy.findClients({ status: "intake_complete" });
for (const c of clients) {
await fetch("https://www.astrishr.com/api/v1/candidates/sync", {
method: "POST",
headers: {
"Authorization": `Bearer ${KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
firstName: c.firstName,
lastName: c.lastName,
preferredName: c.preferredName,
email: c.email,
phone: c.phone,
city: c.city,
state: c.state,
workAuthStatus: c.workAuthStatus,
countryOfOrigin: c.countryOfOrigin,
nativeLanguage: c.nativeLanguage,
resumeText: c.resumeBody,
consentToContact: c.consents.contact,
consentToShareData: c.consents.share,
}),
});
}What happens next
- Candidate stored under your organization; embedded for semantic search.
- If you provided
resumeText, the parse becomes the candidate's pre-validation profile. - Send a self-validation email to the candidate via Astris's existing flow before they enter matching (compliance requirement).
- Once validated, the candidate is eligible for matches — call
POST /api/v1/matchor subscribe tomatch.createdwebhooks.