curl --request POST \
--url https://www.sorce.jobs/api/external/v1/jobs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Senior Product Designer",
"description": "<string>",
"remoteCountry": "<string>",
"locations": [
{
"locationId": 17024,
"city": "San Francisco",
"stateProvince": "California",
"country": "United States"
}
],
"salaryMin": 123,
"salaryMax": 123,
"bidPerQualifiedApplicantCents": 123,
"opportunityId": "<string>",
"atsJobUrl": "<string>",
"qualifications": [
{
"text": "5+ years of product design experience",
"order": 0
}
],
"questions": [
{
"prompt": "Why do you want to work here?",
"order": 123,
"options": [
"<string>"
]
}
],
"budgets": [
{
"budgetCents": 50000,
"notes": "<string>"
}
],
"publish": false
}
'import requests
url = "https://www.sorce.jobs/api/external/v1/jobs"
payload = {
"title": "Senior Product Designer",
"description": "<string>",
"remoteCountry": "<string>",
"locations": [
{
"locationId": 17024,
"city": "San Francisco",
"stateProvince": "California",
"country": "United States"
}
],
"salaryMin": 123,
"salaryMax": 123,
"bidPerQualifiedApplicantCents": 123,
"opportunityId": "<string>",
"atsJobUrl": "<string>",
"qualifications": [
{
"text": "5+ years of product design experience",
"order": 0
}
],
"questions": [
{
"prompt": "Why do you want to work here?",
"order": 123,
"options": ["<string>"]
}
],
"budgets": [
{
"budgetCents": 50000,
"notes": "<string>"
}
],
"publish": False
}
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 Product Designer',
description: '<string>',
remoteCountry: '<string>',
locations: [
{
locationId: 17024,
city: 'San Francisco',
stateProvince: 'California',
country: 'United States'
}
],
salaryMin: 123,
salaryMax: 123,
bidPerQualifiedApplicantCents: 123,
opportunityId: '<string>',
atsJobUrl: '<string>',
qualifications: [{text: '5+ years of product design experience', order: 0}],
questions: [{prompt: 'Why do you want to work here?', order: 123, options: ['<string>']}],
budgets: [{budgetCents: 50000, notes: '<string>'}],
publish: false
})
};
fetch('https://www.sorce.jobs/api/external/v1/jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.sorce.jobs/api/external/v1/jobs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Senior Product Designer',
'description' => '<string>',
'remoteCountry' => '<string>',
'locations' => [
[
'locationId' => 17024,
'city' => 'San Francisco',
'stateProvince' => 'California',
'country' => 'United States'
]
],
'salaryMin' => 123,
'salaryMax' => 123,
'bidPerQualifiedApplicantCents' => 123,
'opportunityId' => '<string>',
'atsJobUrl' => '<string>',
'qualifications' => [
[
'text' => '5+ years of product design experience',
'order' => 0
]
],
'questions' => [
[
'prompt' => 'Why do you want to work here?',
'order' => 123,
'options' => [
'<string>'
]
]
],
'budgets' => [
[
'budgetCents' => 50000,
'notes' => '<string>'
]
],
'publish' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.sorce.jobs/api/external/v1/jobs"
payload := strings.NewReader("{\n \"title\": \"Senior Product Designer\",\n \"description\": \"<string>\",\n \"remoteCountry\": \"<string>\",\n \"locations\": [\n {\n \"locationId\": 17024,\n \"city\": \"San Francisco\",\n \"stateProvince\": \"California\",\n \"country\": \"United States\"\n }\n ],\n \"salaryMin\": 123,\n \"salaryMax\": 123,\n \"bidPerQualifiedApplicantCents\": 123,\n \"opportunityId\": \"<string>\",\n \"atsJobUrl\": \"<string>\",\n \"qualifications\": [\n {\n \"text\": \"5+ years of product design experience\",\n \"order\": 0\n }\n ],\n \"questions\": [\n {\n \"prompt\": \"Why do you want to work here?\",\n \"order\": 123,\n \"options\": [\n \"<string>\"\n ]\n }\n ],\n \"budgets\": [\n {\n \"budgetCents\": 50000,\n \"notes\": \"<string>\"\n }\n ],\n \"publish\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.sorce.jobs/api/external/v1/jobs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Senior Product Designer\",\n \"description\": \"<string>\",\n \"remoteCountry\": \"<string>\",\n \"locations\": [\n {\n \"locationId\": 17024,\n \"city\": \"San Francisco\",\n \"stateProvince\": \"California\",\n \"country\": \"United States\"\n }\n ],\n \"salaryMin\": 123,\n \"salaryMax\": 123,\n \"bidPerQualifiedApplicantCents\": 123,\n \"opportunityId\": \"<string>\",\n \"atsJobUrl\": \"<string>\",\n \"qualifications\": [\n {\n \"text\": \"5+ years of product design experience\",\n \"order\": 0\n }\n ],\n \"questions\": [\n {\n \"prompt\": \"Why do you want to work here?\",\n \"order\": 123,\n \"options\": [\n \"<string>\"\n ]\n }\n ],\n \"budgets\": [\n {\n \"budgetCents\": 50000,\n \"notes\": \"<string>\"\n }\n ],\n \"publish\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.sorce.jobs/api/external/v1/jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Senior Product Designer\",\n \"description\": \"<string>\",\n \"remoteCountry\": \"<string>\",\n \"locations\": [\n {\n \"locationId\": 17024,\n \"city\": \"San Francisco\",\n \"stateProvince\": \"California\",\n \"country\": \"United States\"\n }\n ],\n \"salaryMin\": 123,\n \"salaryMax\": 123,\n \"bidPerQualifiedApplicantCents\": 123,\n \"opportunityId\": \"<string>\",\n \"atsJobUrl\": \"<string>\",\n \"qualifications\": [\n {\n \"text\": \"5+ years of product design experience\",\n \"order\": 0\n }\n ],\n \"questions\": [\n {\n \"prompt\": \"Why do you want to work here?\",\n \"order\": 123,\n \"options\": [\n \"<string>\"\n ]\n }\n ],\n \"budgets\": [\n {\n \"budgetCents\": 50000,\n \"notes\": \"<string>\"\n }\n ],\n \"publish\": false\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"title": "<string>",
"description": "<string>",
"remoteCountry": "<string>",
"salaryMin": 123,
"salaryMax": 123,
"bidPerQualifiedApplicantCents": 123,
"opportunityId": "<string>",
"atsJobUrl": "<string>",
"companyId": "<string>",
"locations": [
{
"locationId": 17024,
"displayName": "San Francisco, California, United States",
"city": "San Francisco",
"stateProvince": "California",
"country": "United States"
}
],
"qualifications": [
{
"text": "5+ years of product design experience",
"order": 0,
"id": "<string>"
}
],
"questions": [
{
"prompt": "Why do you want to work here?",
"order": 123,
"options": [
"<string>"
],
"id": "<string>"
}
],
"budgets": [
{
"budgetCents": 50000,
"notes": "<string>"
}
],
"applicationCounts": {
"pending": 123,
"accepted": 123,
"rejected": 123
},
"isFrozen": true,
"newApplicantCount": 123,
"publishedAt": "2023-11-07T05:31:56Z",
"expiresAt": "2023-11-07T05:31:56Z",
"closedAt": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "INVALID_SERVICE_KEY",
"message": "Invalid service key."
}
}{
"error": {
"code": "PAYMENT_METHOD_REQUIRED",
"message": "Add a payment method before publishing."
}
}{
"error": {
"code": "AGREEMENT_OUTDATED",
"message": "Your organization must accept the current terms in the Sorce dashboard before publishing via the API."
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "Validation failed.",
"fields": {
"salaryMin": "Add a minimum salary."
}
}
}Create a job
Creates a job for your company. Any subset of fields is accepted; omitted fields stay empty and the job is saved as a DRAFT. With "publish": true the job goes live in the same transaction, provided it passes the publish gates (completeness, terms accepted in the dashboard, card on file); if any gate fails, nothing is created.
curl --request POST \
--url https://www.sorce.jobs/api/external/v1/jobs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Senior Product Designer",
"description": "<string>",
"remoteCountry": "<string>",
"locations": [
{
"locationId": 17024,
"city": "San Francisco",
"stateProvince": "California",
"country": "United States"
}
],
"salaryMin": 123,
"salaryMax": 123,
"bidPerQualifiedApplicantCents": 123,
"opportunityId": "<string>",
"atsJobUrl": "<string>",
"qualifications": [
{
"text": "5+ years of product design experience",
"order": 0
}
],
"questions": [
{
"prompt": "Why do you want to work here?",
"order": 123,
"options": [
"<string>"
]
}
],
"budgets": [
{
"budgetCents": 50000,
"notes": "<string>"
}
],
"publish": false
}
'import requests
url = "https://www.sorce.jobs/api/external/v1/jobs"
payload = {
"title": "Senior Product Designer",
"description": "<string>",
"remoteCountry": "<string>",
"locations": [
{
"locationId": 17024,
"city": "San Francisco",
"stateProvince": "California",
"country": "United States"
}
],
"salaryMin": 123,
"salaryMax": 123,
"bidPerQualifiedApplicantCents": 123,
"opportunityId": "<string>",
"atsJobUrl": "<string>",
"qualifications": [
{
"text": "5+ years of product design experience",
"order": 0
}
],
"questions": [
{
"prompt": "Why do you want to work here?",
"order": 123,
"options": ["<string>"]
}
],
"budgets": [
{
"budgetCents": 50000,
"notes": "<string>"
}
],
"publish": False
}
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 Product Designer',
description: '<string>',
remoteCountry: '<string>',
locations: [
{
locationId: 17024,
city: 'San Francisco',
stateProvince: 'California',
country: 'United States'
}
],
salaryMin: 123,
salaryMax: 123,
bidPerQualifiedApplicantCents: 123,
opportunityId: '<string>',
atsJobUrl: '<string>',
qualifications: [{text: '5+ years of product design experience', order: 0}],
questions: [{prompt: 'Why do you want to work here?', order: 123, options: ['<string>']}],
budgets: [{budgetCents: 50000, notes: '<string>'}],
publish: false
})
};
fetch('https://www.sorce.jobs/api/external/v1/jobs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://www.sorce.jobs/api/external/v1/jobs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Senior Product Designer',
'description' => '<string>',
'remoteCountry' => '<string>',
'locations' => [
[
'locationId' => 17024,
'city' => 'San Francisco',
'stateProvince' => 'California',
'country' => 'United States'
]
],
'salaryMin' => 123,
'salaryMax' => 123,
'bidPerQualifiedApplicantCents' => 123,
'opportunityId' => '<string>',
'atsJobUrl' => '<string>',
'qualifications' => [
[
'text' => '5+ years of product design experience',
'order' => 0
]
],
'questions' => [
[
'prompt' => 'Why do you want to work here?',
'order' => 123,
'options' => [
'<string>'
]
]
],
'budgets' => [
[
'budgetCents' => 50000,
'notes' => '<string>'
]
],
'publish' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://www.sorce.jobs/api/external/v1/jobs"
payload := strings.NewReader("{\n \"title\": \"Senior Product Designer\",\n \"description\": \"<string>\",\n \"remoteCountry\": \"<string>\",\n \"locations\": [\n {\n \"locationId\": 17024,\n \"city\": \"San Francisco\",\n \"stateProvince\": \"California\",\n \"country\": \"United States\"\n }\n ],\n \"salaryMin\": 123,\n \"salaryMax\": 123,\n \"bidPerQualifiedApplicantCents\": 123,\n \"opportunityId\": \"<string>\",\n \"atsJobUrl\": \"<string>\",\n \"qualifications\": [\n {\n \"text\": \"5+ years of product design experience\",\n \"order\": 0\n }\n ],\n \"questions\": [\n {\n \"prompt\": \"Why do you want to work here?\",\n \"order\": 123,\n \"options\": [\n \"<string>\"\n ]\n }\n ],\n \"budgets\": [\n {\n \"budgetCents\": 50000,\n \"notes\": \"<string>\"\n }\n ],\n \"publish\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://www.sorce.jobs/api/external/v1/jobs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Senior Product Designer\",\n \"description\": \"<string>\",\n \"remoteCountry\": \"<string>\",\n \"locations\": [\n {\n \"locationId\": 17024,\n \"city\": \"San Francisco\",\n \"stateProvince\": \"California\",\n \"country\": \"United States\"\n }\n ],\n \"salaryMin\": 123,\n \"salaryMax\": 123,\n \"bidPerQualifiedApplicantCents\": 123,\n \"opportunityId\": \"<string>\",\n \"atsJobUrl\": \"<string>\",\n \"qualifications\": [\n {\n \"text\": \"5+ years of product design experience\",\n \"order\": 0\n }\n ],\n \"questions\": [\n {\n \"prompt\": \"Why do you want to work here?\",\n \"order\": 123,\n \"options\": [\n \"<string>\"\n ]\n }\n ],\n \"budgets\": [\n {\n \"budgetCents\": 50000,\n \"notes\": \"<string>\"\n }\n ],\n \"publish\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.sorce.jobs/api/external/v1/jobs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Senior Product Designer\",\n \"description\": \"<string>\",\n \"remoteCountry\": \"<string>\",\n \"locations\": [\n {\n \"locationId\": 17024,\n \"city\": \"San Francisco\",\n \"stateProvince\": \"California\",\n \"country\": \"United States\"\n }\n ],\n \"salaryMin\": 123,\n \"salaryMax\": 123,\n \"bidPerQualifiedApplicantCents\": 123,\n \"opportunityId\": \"<string>\",\n \"atsJobUrl\": \"<string>\",\n \"qualifications\": [\n {\n \"text\": \"5+ years of product design experience\",\n \"order\": 0\n }\n ],\n \"questions\": [\n {\n \"prompt\": \"Why do you want to work here?\",\n \"order\": 123,\n \"options\": [\n \"<string>\"\n ]\n }\n ],\n \"budgets\": [\n {\n \"budgetCents\": 50000,\n \"notes\": \"<string>\"\n }\n ],\n \"publish\": false\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"title": "<string>",
"description": "<string>",
"remoteCountry": "<string>",
"salaryMin": 123,
"salaryMax": 123,
"bidPerQualifiedApplicantCents": 123,
"opportunityId": "<string>",
"atsJobUrl": "<string>",
"companyId": "<string>",
"locations": [
{
"locationId": 17024,
"displayName": "San Francisco, California, United States",
"city": "San Francisco",
"stateProvince": "California",
"country": "United States"
}
],
"qualifications": [
{
"text": "5+ years of product design experience",
"order": 0,
"id": "<string>"
}
],
"questions": [
{
"prompt": "Why do you want to work here?",
"order": 123,
"options": [
"<string>"
],
"id": "<string>"
}
],
"budgets": [
{
"budgetCents": 50000,
"notes": "<string>"
}
],
"applicationCounts": {
"pending": 123,
"accepted": 123,
"rejected": 123
},
"isFrozen": true,
"newApplicantCount": 123,
"publishedAt": "2023-11-07T05:31:56Z",
"expiresAt": "2023-11-07T05:31:56Z",
"closedAt": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "INVALID_SERVICE_KEY",
"message": "Invalid service key."
}
}{
"error": {
"code": "PAYMENT_METHOD_REQUIRED",
"message": "Add a payment method before publishing."
}
}{
"error": {
"code": "AGREEMENT_OUTDATED",
"message": "Your organization must accept the current terms in the Sorce dashboard before publishing via the API."
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "Validation failed.",
"fields": {
"salaryMin": "Add a minimum salary."
}
}
}Authorizations
Partner key (sk_ext_…) bound to your company.
Body
All fields optional; arrays use replace semantics (the set you send becomes the entire new set).
"Senior Product Designer"
REMOTE, HYBRID, IN_PERSON, null Where remote employees may work (REMOTE jobs).
FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP, null ENTRY, MID, SENIOR, null Show child attributes
Show child attributes
Whole dollars
ANNUAL, HOURLY, null What you pay per qualified applicant, in cents.
Your id for this opening on your source ATS. Optional; used by post-application flows to route submitted applications back.
Canonical job URL on your source ATS. Optional; used by post-application flows alongside opportunityId.
Show child attributes
Show child attributes
Custom screening questions only. The applicant basics - first and last name, email, phone, location, and resume - are collected automatically on every application; never send them as questions.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Publish atomically after creation.
Response
The created job.
The full job, as the dashboard sees it.
Stable cross-service job id (svcAtsId).
DRAFT, ACTIVE, PAUSED, CLOSED, EXPIRED REMOTE, HYBRID, IN_PERSON, null FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP, null ENTRY, MID, SENIOR, null ANNUAL, HOURLY, null Partner id for this opening on the source ATS.
Canonical job URL on the source ATS.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
True once the job has applications. Qualifications/questions locked.