Description
n8n-nodes-jia
This is an n8n community node. It lets you use JustInterview (JIA) in your n8n workflows.
JustInterview is an AI hiring platform. The JustInterview node analyzes resumes, sends AI voice interview invites, checks interview results and manages job descriptions. The JustInterview Trigger starts a workflow when an interview is completed or a resume is analyzed.
n8n is a fair-code licensed workflow automation platform.
Installation ·
Credentials ·
Operations ·
Trigger ·
Example workflows ·
Usage ·
Limits ·
Version history
Installation
Follow the installation guide in the n8n community nodes documentation, and install the package n8n-nodes-jia.
On self-hosted n8n, an instance owner or admin installs it once from Settings → Community nodes → Install; the node and credential are then available to every user of that instance. If the menu is missing, set N8NCOMMUNITYPACKAGESENABLED=true. In queue mode, also set N8NREINSTALLMISSINGPACKAGES=true so workers install it too.
Credentials
The nodes use a JustInterview API credential (named JIA API before 1.0.0).
1. In JIA, open Settings → API Keys (organization owners only) and create a key. Pick its permissions (Analyze resumes, Send interview invites, Read jobs, Read interview results) and copy it: JIA shows the full key only once.
2. In n8n, create a JustInterview API credential:
– Base URL: the URL of your JIA backend API, without a trailing slash.
– API Key: the key from step 1.
3. Click Test. n8n calls GET /v1/me without using any credits.
The key is sent as Authorization: Bearer .
Test keys. A key that starts with jiatest (tick Test key when creating it) runs in sandbox mode: Analyze scores resumes for real but uses no credits, Send Invite is simulated (no email, nothing saved, the interviewid starts with test), and the Trigger only receives sandbox events. Test keys can’t use the Job Description operations.
Rotating a key. Regenerate in Settings → API Keys replaces a key with a new one with the same permissions; the old one stops at once.
A key acts as the JIA member who created it. It stops working as soon as it is revoked in JIA, that member is deactivated, or that member changes their password or signs out everywhere.
Setting up JIA for a team
Each key belongs to one JIA organization, so use one credential per organization (for example JIA – QA and JIA – Production).
1. A JIA organization owner creates one key per environment.
2. An n8n admin creates a project (for example JIA Hiring), adds the JIA API credential to it, and adds the people who build hiring workflows as project members.
3. Members pick the shared credential in the JIA node. They can run workflows with it but can’t see the key.
4. To rotate a key, revoke it in JIA, create a new one, and update the single credential; every workflow keeps working.
Operations
Job Description
| Operation | What it does |
|—|—|
| Generate | Writes a job description with JIA AI from a short description of the role. With Save to JIA on (the default) it also saves the job in JIA; with it off, it only returns the draft. Override Fields replace what the AI writes. |
| Create | Saves a job description from fields you provide: Title, Description, Experience and Department are required. |
| Get | Gets one job description, picked from a searchable list or by ID. |
| Get Many | Lists job descriptions, with optional search, status and department filters. |
Every field accepts n8n expressions, so values can come from earlier nodes, for example {{ $json.role }}.
#### Output
Each job description is returned as one item:
{
"job_id": 812,
"publicjdid": "1000812",
"title": "Senior Backend Engineer",
"description": "…",
"skills": ["Python", "FastAPI", "PostgreSQL"],
"experience": "3-5 years",
"department": "Engineering",
"employmenttype": "FULLTIME",
"job_location": ["Bengaluru, Karnataka"],
"salary_min": 1800000,
"salary_max": 2600000,
"application_deadline": "2026-11-30",
"custominterviewquestions": [],
"is_active": true,
"saved": true
}
A draft that was not saved has "saved": false and "job_id": null.
Resume
| Operation | What it does |
|—|—|
| Analyze | Scores one resume against a job and returns the score, matched and missing skills and a recommendation (shortlist at 70+, review at 50–69, reject below 50). The resume is a File from an input binary field or a public https:// Link. Uses POST /v1/resumes/analyze. |
| Screen | Scores one resume against a job with JIA AI. The resume comes from an input binary field (default data), for example a Gmail attachment (attachment_0), an HTTP download or a form upload. Choose Existing Job to screen against a job in JIA, or Job Description Text to paste one. |
Each input item is screened separately, so 10 resumes in give 10 results out. JIA accepts PDF and DOCX up to 10 MB; scanned (image-only) PDFs can’t be read.
#### Screening output
{
"score": 88,
"composite_score": 85.7,
"summary": "Strong fit for the Senior Backend Engineer role…",
"strengths": ["Relevant experience", "Relevant projects", "Certifications", "Resume quality"],
"gaps": [],
"attributes": { "relevantexperiencescore": 92, "relevantprojectsscore": 85, "certificationsscore": 80, "resumequality_score": 95 },
"experiencegapmonths": 0,
"candidate": { "name": "Aarav Test", "email": "[email protected]", "phone": "+919800000010", "yearsofexperience": 6 },
"job_id": 7980,
"injection_detected": false,
"credits_remaining": 2,
"file_name": "resume.pdf"
}
Analyze returns the same fields plus recommendation, skillsmatched, skillsmissing, test and source (the file name or link).
score is top level so an IF node can branch on it, for example {{ $json.score >= 70 }}. composite_score uses the job’s evaluation profile and is null when screening against pasted text. Turn on Include Input Binary to pass the resume file on to later steps.
Interview
| Operation | What it does |
|—|—|
| Send Invite | Emails a candidate an AI voice interview for a job: Candidate Name, Candidate Email and Job, plus an optional Deadline (24 hours to 7 days from now) and Resume URL. Uses 1 AI interview credit. |
| Get Status | Returns an interview’s status (invited, inprogress, evaluating, completed, expired), score (0–100) and reporturl. |
{
"interview_id": "5512",
"status": "invited",
"invite_link": "https://app.justinterview.ai/interview/…",
"expires_at": "2026-11-06T10:00:00",
"job_id": 812,
"candidate_email": "[email protected]",
"test": false
}
The Job picker on Analyze and Send Invite lists your active jobs (GET /v1/jobs).
Trigger
The JustInterview Trigger registers its webhook URL with JIA when the workflow is activated and removes it when deactivated. Events:
- Interview Completed (
interview.completed): the interview is over and its evaluation report is ready. The item has the Get Status fields:interviewid,candidatename,candidateemail,jobid,score,reporturl,completedat. - Resume Analyzed (
resume.analyzed): a resume was analyzed through the API. The item has the Analyze fields.
Every delivery is signed (X-JIA-Signature, HMAC-SHA256) with a secret JIA gives the trigger at registration; unsigned or stale requests are refused. JIA retries a failed delivery for about 1.5 hours. The n8n instance must be reachable from JIA over https.
Example workflows
Import these from workflows/ (Workflows → Import from File), then pick your credential and job in each JustInterview node.
1. Resume analysis per job: a form takes a candidate’s resume, Resume: Analyze scores it against a job, and the result is split into shortlist / review / reject.
2. Invite top candidates: analyzes each applicant and sends an AI voice interview to everyone scoring above 70; a second branch uses the Trigger to collect completed interview scores.
Checking a JIA environment
scripts/e2e-v1.mjs runs the API the node uses end to end (auth, jobs, analyze, invite, status and, with JIAWEBHOOKURL, webhooks). Use a jiatest key so nothing is charged or emailed:
JIABASEURL=https://your-jia-backend.example.com JIAAPIKEY=jiatest... JIA_RESUME=./resume.pdf node scripts/e2e-v1.mjs
Usage
Sheet row to published job: Google Sheets Trigger (new row) → JIA Job Description: Generate with Job Details set to {{ $json.role }}, {{ $json.experience }}, {{ $json.location }} → Slack message with the new job_id.
Screen inbound applications: Gmail Trigger (has attachment) → JIA Resume: Screen with Input Binary Field attachment_0 and an Existing Job → IF {{ $json.score >= 70 }} → notify the recruiter.
Draft for review: JIA Generate with Save to JIA off → send the draft for approval → JIA Create with the approved fields.
Limits
Retry-After (seconds).Errors from JIA appear in n8n with JIA’s own message and HTTP status. With Continue On Fail on, a failed item returns { "error": "…", "httpCode": "…" } and the other items keep running.
Compatibility
Built with @n8n/node-cli and tested against n8n 2.x.
Resources
Releasing (maintainers)
main only accepts reviewed pull requests, so releases are cut by tag:
1. Open a PR that bumps version in package.json and package-lock.json and adds a CHANGELOG.md entry. Merge it after review.
2. Tag the merged commit and push only the tag:
git switch main && git pull
git tag 0.1.2
git push origin 0.1.2
3. The tag runs .github/workflows/publish.yml, which lints, builds and publishes to npm with provenance through npm Trusted Publishing.
Version history
See CHANGELOG.md.


