curl --request POST \
--url https://cutshort.io/api/v1/jobs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Senior Data Engineer",
"experienceRange": {
"min": 123,
"max": 123
},
"salaryRange": {
"min": 123,
"max": 123
},
"jobDescription": "<string>"
}
'import requests
url = "https://cutshort.io/api/v1/jobs"
payload = {
"title": "Senior Data Engineer",
"experienceRange": {
"min": 123,
"max": 123
},
"salaryRange": {
"min": 123,
"max": 123
},
"jobDescription": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Senior Data Engineer',
experienceRange: {min: 123, max: 123},
salaryRange: {min: 123, max: 123},
jobDescription: '<string>'
})
};
fetch('https://cutshort.io/api/v1/jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"jobId": "<string>",
"publicUrl": "<string>",
"status": "submitted_for_review",
"title": "<string>",
"remoteType": "<string>",
"roleType": "<string>",
"locations": [
"<string>"
],
"skills": [
"<string>"
],
"mandatorySkills": [
"<string>"
],
"mandatorySkillsMatchType": "any",
"keyRequirements": [
{
"requirement": "<string>",
"importance": "<string>"
}
],
"screeningQuestionnaire": {
"attached": true,
"questionCount": 123
},
"autoITA": {
"enabled": true,
"savedSearchId": "<string>"
}
}{
"error_code": "<string>",
"error_description": "<string>"
}{
"error_code": "<string>",
"error_description": "<string>"
}{
"error_code": "<string>",
"error_description": "<string>"
}{
"error_code": "<string>",
"error_description": "<string>"
}{
"error_code": "<string>",
"error_description": "<string>"
}Post a job
Creates a fully configured job from minimal input: skills/tags derived from the JD, screening questionnaire auto-attached, and auto-outreach to matching candidates enabled. After posting, the job is reviewed and then goes live — typically ~30 minutes on business days; matching-candidate outreach starts once approved. Key requirement importance is honoured exactly as sent — we strongly recommend at most 3 must_have items (over-tight configs shrink outreach reach).
Requires scope jobs:write (production keys). Rate limits: 5 createJob + 120 global requests per 60s per API key.
curl --request POST \
--url https://cutshort.io/api/v1/jobs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Senior Data Engineer",
"experienceRange": {
"min": 123,
"max": 123
},
"salaryRange": {
"min": 123,
"max": 123
},
"jobDescription": "<string>"
}
'import requests
url = "https://cutshort.io/api/v1/jobs"
payload = {
"title": "Senior Data Engineer",
"experienceRange": {
"min": 123,
"max": 123
},
"salaryRange": {
"min": 123,
"max": 123
},
"jobDescription": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Senior Data Engineer',
experienceRange: {min: 123, max: 123},
salaryRange: {min: 123, max: 123},
jobDescription: '<string>'
})
};
fetch('https://cutshort.io/api/v1/jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"jobId": "<string>",
"publicUrl": "<string>",
"status": "submitted_for_review",
"title": "<string>",
"remoteType": "<string>",
"roleType": "<string>",
"locations": [
"<string>"
],
"skills": [
"<string>"
],
"mandatorySkills": [
"<string>"
],
"mandatorySkillsMatchType": "any",
"keyRequirements": [
{
"requirement": "<string>",
"importance": "<string>"
}
],
"screeningQuestionnaire": {
"attached": true,
"questionCount": 123
},
"autoITA": {
"enabled": true,
"savedSearchId": "<string>"
}
}{
"error_code": "<string>",
"error_description": "<string>"
}{
"error_code": "<string>",
"error_description": "<string>"
}{
"error_code": "<string>",
"error_description": "<string>"
}{
"error_code": "<string>",
"error_description": "<string>"
}{
"error_code": "<string>",
"error_description": "<string>"
}Authorizations
Workspace-scoped API key. Prefix: cs_live_. Eval keys (self-serve from Cutshort → Settings → Integrations → API Key) can search and get candidate details within small quotas; production keys add job posting and candidate messaging with higher limits.
Body
80"Senior Data Engineer"
locations is required unless remote_only
remote_only, remote_okay, remote_not_okay Years of experience
Show child attributes
Show child attributes
INR per annum (2500000 = 25 LPA)
Show child attributes
Show child attributes
20000full_time, internship Optional team to create the job under; defaults to your first team in the workspace
Hide the salary range on the public job page
How derived must-have skills gate matching: any = match any of them; all = match all of them. Defaults to any when omitted (same as the job-setup UI).
any, all Plain city names, canonicalized server-side
5["Bangalore", "Pune"]
Optional; defaults generated from the JD when omitted. Importance honoured as sent; strongly recommend at most 3 must_have.
8Show child attributes
Show child attributes
Response
Job created and submitted for review. Goes live after review — typically ~30 minutes on business days.
"submitted_for_review"
Derived skill taxonomy codes
Applied must-have skills match mode (defaults to any)
any, all Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
