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/sync
GET/api/v1/candidates

POST /api/v1/candidates/sync — request

firstNamestringrequired
First name as recorded by your case-management system.
lastNamestringrequired
Last name.
preferredNamestring
What the candidate goes by.
emailstring
Email. Used as upsert key when present — re-POST with the same email updates the existing candidate.
phonestring
Phone number with country code.
citystring
Current city.
statestring
Two-letter state code.
workAuthStatusenum
One of: us_citizen, permanent_resident, refugee, asylee, asylum_pending, tps, parolee, student_visa, h1b, other_ead, pending, unknown.
countryOfOriginstring
Country of origin (free-text).
nativeLanguagestring
Native language.
resumeTextstring
Raw resume body. If provided, Astris parses it with the resume parser and stores a CandidateDocument.
consentToContactboolean
Whether the candidate consented to contact.
consentToShareDataboolean
Whether 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/match or subscribe to match.created webhooks.