Skip to main content
POST
/
job
cURL
curl --request POST \
  --url https://api.collective.work/{environment}/v1/job \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "description": "I am searching for a talented developer to join our team! The stack includes javascript, react, and nodejs.",
  "accountEmail": "[email protected]",
  "internalJobId": "open-ai-fullstack-engineer-123",
  "contractType": "FREELANCE",
  "companyLogoUrl": "https://openai.com/logo.png",
  "companyName": "OpenAI.com",
  "title": "Senior Fullstack Developer",
  "profileWanted": "We are looking for a senior engineer with 5+ years of experience in distributed systems and a strong background in cloud infrastructure.",
  "isSalaryAccordingToProfile": true,
  "budget": "1250€/day or 80-100K€/year",
  "startingDate": "IN_2_TO_4_WEEKS",
  "expirationDate": "2026-11-29",
  "notifyByEmailForEveryApplication": false,
  "applicationUrl": "https://openai.com/aply",
  "requirePhoneNumber": false,
  "requireResume": true,
  "questions": [
    "What is your favorite programming language?",
    "How much experience do you have in this industry?"
  ],
  "skills": [
    "javascript",
    "react",
    "node.js"
  ],
  "workPreferences": "ON_SITE",
  "location": "San Francisco, CA",
  "language": "fr"
}
'
{
  "jobId": "<string>",
  "jobUrl": "<string>",
  "accountEmail": "<string>",
  "internalJobId": "<string>"
}

Authorizations

Authorization
string
header
required

API key given to you (If you don't have one, check this section)

Body

application/json
description
string
required

Job description

It can be plain text or HTML (we sanitise it to keep only basic tags)

Example:

"I am searching for a talented developer to join our team! The stack includes javascript, react, and nodejs."

accountEmail
string<email>

Email of the account on Collective under which this job will be posted. If not specified, the first account found will be picked. This field can only be set at creation.

internalJobId
string

Internal identifier of the job posting (provided by you when you created the job). This field can only be set at creation.

This identifier is great for future updates and for closing the job. More info here.

Example:

"open-ai-fullstack-engineer-123"

contractType
enum<string>
default:FREELANCE

The contract type for the job

Values should be one of FREELANCE or PERMANENT_CONTRACT.

Available options:
FREELANCE,
PERMANENT_CONTRACT
Example:

"FREELANCE"

companyLogoUrl
string<uri>

URL of the company logo

Example:

"https://openai.com/logo.png"

companyName
string

Name of the company

If not specified, we will default to the recruiter's account default company

Example:

"OpenAI.com"

title
string

Job title

If not specified, we will try to infer it

Note: In sandbox, we add the [Sandbox] prefix to the job title to prevent mistakes

Example:

"Senior Fullstack Developer"

profileWanted
string

Description of the ideal candidate profile - ⚠️ If you want your offer to perform and be multi posted well, we highly recommend filling this field.

It can be plain text or HTML (we sanitise it to keep only basic tags)

Example:

"We are looking for a senior engineer with 5+ years of experience in distributed systems and a strong background in cloud infrastructure."

isSalaryAccordingToProfile
boolean

Whether the salary is open to negotiation and based on the candidate profile - ⚠️ We don't recommend setting this to true as jobs without salary perform way worse.

When set to true, the salary/budget will be displayed as "According to profile" on the job posting, overriding any budget value specified.

budget
string

Salary for the position - ⚠️ If you want your offer to perform and be multi posted well, we highly recommend filling this field.

If not specified, we will try to infer it or default to empty.

Note: there is no need to set this field when isSalaryAccordingToProfile is true.

Example:

"1250€/day or 80-100K€/year"

startingDate
enum<string>

Start date for the position

If not specified, we will try to infer it or default to IN_2_TO_4_WEEKS

Available options:
ASAP,
IN_2_TO_4_WEEKS,
IN_4_TO_8_WEEKS,
IN_8_WEEKS_OR_MORE
Example:

"IN_2_TO_4_WEEKS"

expirationDate
string<date>

Max date until which users can apply to the job

Date should be in "YYYY-MM-DD" format.

If not specified, we will try to infer it or default to "In 2 weeks from now".

Example:

"2026-11-29"

notifyByEmailForEveryApplication
boolean
default:false

Controls whether the recruiter who posted the job will be notified by email for every application. Defaults to false. Ignored when applicationUrl is provided.

applicationUrl
string<uri>

External application URL

Use only this value in certain cases where you want to redirect users to your own application form.

⚠️ When this option is used, the job is not considered "premium" and Collective does not push the job in its own supply. We don't recommend using it for the best performance.

Example:

"https://openai.com/aply"

requirePhoneNumber
boolean
default:false

Whether phone number is required for application

Note: this field is not used when redirecting to an external application url.

requireResume
boolean
default:true
deprecated

Whether resume is required for application (deprecated - resume is always required now)

questions
string[]

Questions asked to applicants. This field can only be set at creation.

Note: this field is not used when redirecting to an external application url.

Maximum array length: 4
Example:
[
"What is your favorite programming language?",
"How much experience do you have in this industry?"
]
skills
string[]

Required skills for the position

We will match it also with our skills database to improve the job visibility, which may result in skills being added or tweaked.

Example:
["javascript", "react", "node.js"]
workPreferences
string

Work arrangement preferences (remote, hybrid, on-site)

Values should be one of ON_SITE (no remote allowed at all), HYBRID (some remote allowed, but still ne to come onsite), or REMOTE (no need to come to the office).

If not specified, we will try to infer it.

Example:

"ON_SITE"

location
string

Job location. We only accept a city (no region, or country, and we don't accept multiple cities - create 2 different jobs for that).

If not specified, we will try to infer it.

This field is a string but will be automatically remapped to an exact location in the google maps API.

Example:

"San Francisco, CA"

language
enum<string>

Language of the job posting

Values should be one of en (English) or fr (French).

If not specified, the language will be automatically detected.

Available options:
en,
fr
Example:

"fr"

Response

Job successfully created

jobId
string
required

Unique identifier of the job posting (automatically generated by Collective)

jobUrl
string<uri>
required

Public URL of the job on Collective

accountEmail
string
required

Email of the account on Collective under which this job will be posted.

internalJobId
string

Internal identifier of the job posting (provided by you when you created the job). It is returned only if it was provided at creation.