What people build with Astris
The common integration patterns, end-to-end.
1. Auto-sync your careers page into Astris
Who: Employer with an ATS (Workday, iCIMS, Greenhouse, Greatjob, etc.) or a careers CMS.
What you get: Every new req on your site is in Astris within hours, indexed for matching, deduplicated, with structured fields (skills, certs, schedule, comp, benefits) extracted by Claude.
How:
- Issue an employer-scoped key with the
jobsscope at /developers/keys. - Set up a cron job that pulls your active reqs every 15 min / 1 hr / nightly (your choice).
- POST each req to
/api/v1/jobs/syncwith the ATS req id asexternalId. Re-runs are idempotent. - Optionally subscribe to
match.createdto know when Astris finds a candidate for one of your reqs.
// pseudo-cron
import cron from "node-cron";
cron.schedule("0 */1 * * *", async () => {
const reqs = await myAts.fetchActiveReqs();
for (const r of reqs) {
await fetch("https://www.astrishr.com/api/v1/jobs/sync", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.ASTRIS_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ externalId: r.id, text: r.fullBody, location: r.location }),
});
}
});Full reference: /developers/api/jobs-sync.
2. Push candidates from your case-management system
Who: Refugee resettlement org, workforce board, vocational training program. Anyone running CaseWorthy, Apricot, ETO, Salesforce NPSP, or homegrown intake.
What you get: Every intake-complete client gets a candidate record in Astris automatically. Matching runs against every employer's open jobs. You receive ranked matches back, in your preferred ATS-shape via the webhook adapter.
How:
- Issue an organization-scoped key with the
candidatesscope. - POST every client at intake completion to
/api/v1/candidates/sync. IncluderesumeTextif you have it (Astris parses + stores it). - Send the self-validation link to the candidate via your normal channel — they review and approve the profile before Astris matches.
- Subscribe to
match.createdevents with adapter=caseworthy / apricot / eto to receive new matches in your system's shape.
Full reference: /developers/api/candidates-sync.
3. Embed match scores in your existing UI
Who: Anyone with their own front-end who wants Astris's matching, retention forecast, and explanations without using astrishr.com's UI.
What you get: Real-time match scoring you can render in your own design system. 7-component breakdown, retention forecast, gaps, transferable-skill bridges — all from one API call.
How:
async function scoreMatch(candidateId, jobId) {
const res = await fetch("https://www.astrishr.com/api/v1/match", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.ASTRIS_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ candidateId, jobId }),
});
const data = await res.json();
return {
score: data.finalScore, // 0–100
rec: data.recommendation, // strong_match / moderate / weak / …
breakdown: data.componentScores, // skills / experience / language / distance / schedule / cert / transport
retention: data.retention.expectedTenureDays, // 30–365
gaps: data.gaps, // what's missing
bridges: data.transferableSkills, // transferable skill mappings
};
}4. Embed retention forecasts into your ATS dashboard
Who: Employer with internal HR analytics that want to surface retention risk per candidate-job pair.
What you get: 30/90/180/365-day retention probabilities + expected tenure days per (candidate, job) — without exposing candidate data to a third-party model.
const r = await fetch("https://www.astrishr.com/api/v1/retention-forecast", {
method: "POST",
headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ candidateId, jobId }),
}).then(r => r.json());
// Render r.retention180, r.expectedTenureDays, r.confidenceScore in your dashboard.5. Augment your existing skill extraction
Who: Any HR tech building skill profiles from resumes.
What you get: The skills a worker has but didn't list. Combine your extracted skills with Astris's inferred skills for a fuller profile.
const r = await fetch("https://www.astrishr.com/api/v1/skills-infer", {
method: "POST",
headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
occupations: ["Forklift Operator", "Line Cook"],
existing: ["Knife Skills"],
}),
}).then(r => r.json());
// r.inferred → 8-10 likely skills with source ("curated" | "llm") and confidence (0..1)