Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/tech-dipesh/yeti-Jobs/llms.txt

Use this file to discover all available pages before exploring further.

Recruiters on Yeti Jobs are users assigned to a company as employees. Once linked to a company (via the admin assign-user flow), a recruiter gains access to a dedicated set of endpoints for managing the full hiring lifecycle — from posting a new role to reviewing applicants and issuing final hiring decisions. All recruiter actions are scoped to the company the recruiter belongs to, enforced at the middleware level via the isCompanyEmployee guard.

Creating a Job Listing

Post a new job opening on behalf of your company. The company_id is automatically read from your JWT token, so the job is always attributed to your employer. Skills can be passed as either a comma-separated string or a JSON array.
POST /api/v1/jobs/new
The job_type field must be one of exactly three values: Remote, Onsite, or Hybrid. Any other value will be rejected by the Zod validation layer before the database is touched.
title
string
required
The job title, e.g. "Senior Backend Engineer".
description
string
required
Full job description including responsibilities, requirements, and benefits.
salary
integer
required
Annual salary in your local currency unit (stored as int8).
job_type
string
required
Work arrangement. Must be Remote, Onsite, or Hybrid.
skills
string | array
required
Required skills. Pass as a comma-separated string ("Node.js,PostgreSQL,Docker") or a JSON array.
experience_years
integer
Minimum years of experience required. Defaults to 0 if omitted.
location
string
Job location, e.g. "San Francisco, CA" or "Remote".
expired_at
date
Expiry date for the listing in YYYY-MM-DD format. The nightly cron job closes listings past their expired_at date automatically.

Example Request

curl -X POST https://yeti-jobs.onrender.com/api/v1/jobs/new \
  -H 'Content-Type: application/json' \
  -H 'Cookie: token=<your_jwt_token>' \
  -d '{
    "title": "Senior Backend Engineer",
    "description": "We are looking for a Node.js expert to lead our API team. You will design scalable services and mentor junior developers.",
    "salary": 120000,
    "job_type": "Hybrid",
    "skills": "Node.js,PostgreSQL,Docker,Redis",
    "experience_years": 4,
    "location": "New York, NY",
    "expired_at": "2025-12-31"
  }'
{
  "message": {
    "uid": "a3f2c1d4-89ab-4e56-b123-000000000001"
  }
}
The response returns the newly created job’s uid, which you can use for subsequent edit or delete operations.

Editing a Job Listing

Update an existing job’s details. Only the owner (the company whose recruiter created it) can edit a listing. The isOwner middleware validates ownership before the controller runs.
PUT /api/v1/jobs/:id/edit
curl -X PUT https://yeti-jobs.onrender.com/api/v1/jobs/{job_uid}/edit \
  -H 'Content-Type: application/json' \
  -H 'Cookie: token=<your_jwt_token>' \
  -d '{
    "title": "Lead Backend Engineer",
    "description": "Updated responsibilities...",
    "salary": 135000,
    "job_type": "Remote",
    "skills": "Node.js,PostgreSQL,Kubernetes",
    "experience_years": 5,
    "location": "Remote"
  }'
The response returns the updated full job record from the jobs table.

Deleting a Job Listing

Permanently remove a job listing. This cascades to delete related applications and saved-job entries due to ON DELETE CASCADE in the schema.
DELETE /api/v1/jobs/:id/delete
curl -X DELETE https://yeti-jobs.onrender.com/api/v1/jobs/{job_uid}/delete \
  -H 'Cookie: token=<your_jwt_token>'

Reviewing Applicants

Fetch the list of all candidates who have applied to a specific job. The response includes full names, experience, phone numbers, resume URLs, skill arrays, application status, and applied-at timestamps.
GET /api/v1/applications/:id/applist
curl https://yeti-jobs.onrender.com/api/v1/applications/{job_uid}/applist \
  -H 'Cookie: token=<your_jwt_token>'
A sample applicant record looks like:
{
  "full_name": "Jane Doe",
  "experience": 3,
  "phone_number": "+1-555-0100",
  "resume_url": "https://storage.supabase.co/resume/...",
  "user_skills": ["React", "TypeScript", "PostgreSQL"],
  "status": "applied",
  "applied_at": "2025-07-10T09:30:00.000Z"
}

Changing Application Status

Move a candidate through the hiring pipeline by updating their application status. This is the primary tool for recruiters to communicate decisions — every status change is reflected immediately when the applicant views their application list.
POST /api/v1/applications/:id/status
status
string
required
The new application status. Must be one of: applied, shortlisted, hired, rejected.
user_id
string (UUID)
required
The UUID of the applicant whose status you are updating.
curl -X POST https://yeti-jobs.onrender.com/api/v1/applications/{job_uid}/status \
  -H 'Content-Type: application/json' \
  -H 'Cookie: token=<your_jwt_token>' \
  -d '{
    "status": "shortlisted",
    "user_id": "b7e1a2f3-0000-4cde-9876-000000000099"
  }'
The operation runs inside a database transaction (BEGIN / COMMIT) and validates that the applicant has indeed applied to the job before updating.

Company Dashboard Stats

Get a high-level overview of your company’s hiring activity. All counts are scoped to the authenticated recruiter’s company_id.
GET /api/v1/companies/dashboard
curl https://yeti-jobs.onrender.com/api/v1/companies/dashboard \
  -H 'Cookie: token=<your_jwt_token>'
{
  "message": {
    "total_jobs": 12,
    "total_applications": 84,
    "total_employees": 5,
    "total_followers": 230,
    "open_jobs": 7
  }
}

total_jobs

Count of all job listings ever created by your company.

total_applications

Count of all applications received across all your company’s jobs.

total_employees

Number of users currently assigned to your company.

total_followers

Number of users following your company profile.

Company Followers

Retrieve the list of users who follow your company. Returns full user records joined via user_companies_follows.
GET /api/v1/companies/followers
curl https://yeti-jobs.onrender.com/api/v1/companies/followers \
  -H 'Cookie: token=<your_jwt_token>'

Listing Company Employees

Fetch all users currently assigned to a company. Useful for auditing team membership and seeing who has recruiter access.
GET /api/v1/companies/:id/employees
curl https://yeti-jobs.onrender.com/api/v1/companies/{company_uid}/employees \
  -H 'Cookie: token=<your_jwt_token>'
The response includes each employee’s full_name, email, experience, education, role, resume_url, and profile_pic_url.

Company-Wide Applications

Retrieve all applications submitted across every job listing belonging to your company. The response joins the applications, users, and jobs tables to return applicant details alongside job context.
GET /api/v1/companies/:id/applications
curl https://yeti-jobs.onrender.com/api/v1/companies/{company_uid}/applications \
  -H 'Cookie: token=<your_jwt_token>'
A sample record from the response:
{
  "application_id": "f4e3d2c1-0000-0000-0000-000000000050",
  "status": "shortlisted",
  "cover_letter": "I am excited to apply...",
  "notice_period": 30,
  "expected_salary": 95000,
  "why_hire": "I bring 5 years of backend experience.",
  "resume_url": "https://<supabase-project>.supabase.co/storage/v1/object/public/resume/upload/<uuid>-resume.pdf",
  "phone_number": "+1-555-0100",
  "job_title": "Senior Backend Engineer",
  "total_job_views": 412,
  "applicant_id": "b7e1a2f3-0000-4cde-9876-000000000099",
  "job_id": "a3f2c1d4-89ab-4e56-b123-000000000001"
}

Build docs developers (and LLMs) love