Docs / Jobs

create_job_posting

Create a job posting as a draft.

This action can change or spend something, and when it does it happens right away. Read “Good to know” first.

What you give it

InputWhat it isWhere to get it
jobTitle
needed
A group of fields.
What goes inside
  • id (optional): a search filter id. LinkedIn's id for the job title (lookup_search_ids type JOB_TITLE). run lookup_search_ids with type JOB_TITLE, and use matches[].id from its answer.
  • text (optional): text. The job title as free text, when LinkedIn has no id for it.
You write it.
company
needed
A group of fields.
What goes inside
  • id (optional): a search filter id. LinkedIn's id for the company (lookup_search_ids type COMPANY). run lookup_search_ids with type COMPANY, and use matches[].id from its answer.
  • text (optional): text. The company as free text, when LinkedIn has no id for it.
You write it.
workplace
needed
One of: ON_SITE, HYBRID, REMOTE. You write it.
location
needed
A search filter id. LinkedIn's id for the place (lookup_search_ids type LOCATION).run lookup_search_ids with type LOCATION, and use matches[].id from its answer.
description
needed
Text, up to 25000 characters. The job description. HTML tags may be used to structure it.You write it.
employmentStatus
optional
One of: FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, OTHER, VOLUNTEER, INTERNSHIP. You write it.
autoRejectionTemplate
optional
Text. Message sent automatically to applicants who do not pass the screening questions.You write it.
screeningQuestions
optional
A list (a group of fields). Questions applicants must answer.
What goes inside
  • question (needed): text.
  • answerType (needed): text. The kind of answer, e.g. numeric or multiple_choices.
  • position (optional): a number.
  • mustMatch (optional): true or false.
  • minExpectation (optional): a number.
  • maxExpectation (optional): a number.
  • choices (optional): a list (text).
  • expectedChoices (optional): a list (text).
You write it.
applyMethod
optional
A group of fields. How people apply: on LinkedIn (applications are emailed to notificationEmail) or on an external site.
What goes inside
  • type (needed): exactly: linkedin.
  • notificationEmail (needed): an email address.
  • url (needed): a link.
You write it.
recruiter
optional
A group of fields. Recruiter job postings only. To create one LinkedIn requires project, functions, industries, seniority and applyMethod.
What goes inside
  • project (optional): a group of fields. create: the hiring project — { id } of an existing one or { name } for a new one.
  • projectId (optional): text. edit: the hiring project the posting belongs to.
  • functions (optional): a search filter id. Job function ids (lookup_search_ids type JOB_FUNCTION). run lookup_search_ids with type JOB_FUNCTION, and use matches[].id from its answer.
  • industries (optional): a search filter id. Industry ids (lookup_search_ids type INDUSTRY). run lookup_search_ids with type INDUSTRY, and use matches[].id from its answer.
  • skills (optional): a search filter id. Skill ids (lookup_search_ids type SKILL). run lookup_search_ids with type SKILL, and use matches[].id from its answer.
  • seniority (optional): one of: INTERNSHIP, ENTRY_LEVEL, ASSOCIATE, MID_SENIOR_LEVEL, DIRECTOR, EXECUTIVE, NOT_APPLICABLE.
  • includePosterInfo (optional): true or false.
  • trackingPixelUrl (optional): a link.
  • companyJobId (optional): text.
  • applyMethod (optional): a group of fields.
  • salary (optional): a group of fields.
  • additionalCompensation (optional): a group of fields.
  • autoArchiveApplicants (optional): a group of fields.
  • sendRejectionNotification (optional): true or false.
You write it.
connectionId
optional
A connection id. Which of your LinkedIn accounts to act from (its id from list_linkedin_accounts). Omit to use your first live one.Run list_linkedin_accounts and use accounts[].id from its answer.
15 more places to get it

Call it

curl -X POST https://api.heyreagent.com/v1/actions/create_job_posting \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "content-type: application/json" \
  -d '{"jobTitle":{"text":"Software Engineer"},"company":{"text":"Your company"},"workplace":"ON_SITE","location":"PASTE_LOCATION_ID_HERE","description":"What the job is about."}'
The same call in JavaScript
const response = await fetch("https://api.heyreagent.com/v1/actions/create_job_posting", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_KEY",
    "content-type": "application/json",
  },
  body: JSON.stringify({
    "jobTitle": {
      "text": "Software Engineer"
    },
    "company": {
      "text": "Your company"
    },
    "workplace": "ON_SITE",
    "location": "PASTE_LOCATION_ID_HERE",
    "description": "What the job is about."
  }),
});
const answer = await response.json();
console.log(answer);
The same call in Python
import requests

response = requests.post(
    "https://api.heyreagent.com/v1/actions/create_job_posting",
    headers={"Authorization": "Bearer YOUR_KEY"},
    json={
        "jobTitle": {
            "text": "Software Engineer",
        },
        "company": {
            "text": "Your company",
        },
        "workplace": "ON_SITE",
        "location": "PASTE_LOCATION_ID_HERE",
        "description": "What the job is about.",
    },
)
print(response.json())
The same call in n8n

Add an HTTP Request node and fill it in like this:

MethodPOST
URLhttps://api.heyreagent.com/v1/actions/create_job_posting
Send HeadersOn. Name Authorization, Value Bearer YOUR_KEY
Send BodyOn. Body Content Type JSON, Specify Body Using JSON, then paste the body below
{
  "jobTitle": {
    "text": "Software Engineer"
  },
  "company": {
    "text": "Your company"
  },
  "workplace": "ON_SITE",
  "location": "PASTE_LOCATION_ID_HERE",
  "description": "What the job is about."
}

Put your own key where it says YOUR_KEY. Put your own value where it says PASTE_…_HERE: the table above says where each one comes from. New here? Start with your first call.

What you get back

When it worked, the answer is { "ok": true, "result": { … } }. Inside result:

created
draft
fromthe account it ran on
usedTodaynumber
dailyLimitnumber
jobIdA job id. Other actions take it.
projectIdA hiring project id. Other actions take it.

A field that does not apply to an answer is left out, or is null. There are 11 more fields nested inside these.

When it did not work, the answer is { "ok": false, "error": "…", "message": "…" }. What each error means.

Good to know

In Claude or ChatGPT

Once connected, ask in your own words. The assistant sees this action as a tool with the same name, create_job_posting, and the same inputs.