Create a job posting

POSThttps://api.postpress.ai/v1/linkedin/jobs

Create a new LinkedIn job offer draft. Resolve free-text values (job title, company, location, industries, skills, ...) via GET /linkedin/search/parameters first.

Authorization

X-API-KEYstringrequired
API key from your postpress dashboard. Sent as a request header.

Request body

account_idstringrequired
The id of the account to trigger the request from.
job_titleobjectrequired
Either `id` (JOB_TITLE) or `text`.
job_title object
idstring
Numeric id resolved via `GET /linkedin/search/parameters`.
textstring
Free-text fallback when no id is available.
companyobjectrequired
Either `id` (COMPANY) or `text`.
company object
idstring
Numeric id resolved via `GET /linkedin/search/parameters`.
textstring
Free-text fallback when no id is available.
workplacestringrequired
ON_SITEHYBRIDREMOTE
locationstringrequired
LOCATION id (numeric). Resolve via `type=LOCATION`.
employment_statusstring
FULL_TIMEPART_TIMECONTRACTTEMPORARYOTHERVOLUNTEERINTERNSHIP
descriptionstringrequired
Job description. HTML tags allowed.
auto_rejection_templatestring
Template sent automatically to applicants that don't pass screening questions.
screening_questionsarray of objects
Two variants: `numeric` or `multiple_choices`.
screening_questions object
(variant) numericobject
When `answer_type=numeric`.
(variant) numeric object
questionstringrequired
answer_typestringnumericrequired
positionnumber
Overrides the index of the question in the array.
must_matchboolean
If true, answers outside the expected range disqualify the applicant.
min_expectationnumber
max_expectationnumber
(variant) multiple_choicesobject
When `answer_type=multiple_choices`.
(variant) multiple_choices object
questionstringrequired
answer_typestringmultiple_choicesrequired
choicesarray of stringsrequired
expected_choicesarray of stringsrequired
positionnumber
must_matchboolean
recruiterobject
Recruiter-specific fields. Required when the account uses LinkedIn Recruiter.
recruiter object
projectobjectrequired
Either an existing project id or a new project name.
project object
(variant) Existing projectobject
(variant) Existing project object
idstringrequired
(variant) New projectobject
(variant) New project object
namestringrequired
Name for a new Recruiter project.
functionsarray of stringsrequired
1-3 job-function ids (lowercase). Resolve via `type=JOB_FUNCTION`.
industriesarray of stringsrequired
1-3 industry ids. Resolve via `type=INDUSTRY`.
skillsarray of strings
1-10 skill ids. Resolve via `type=SKILL`.
senioritystringrequired
INTERNSHIPENTRY_LEVELASSOCIATEMID_SENIOR_LEVELDIRECTOREXECUTIVENOT_APPLICABLE
include_poster_infoboolean
Show the poster's profile on the job post. Default true.
tracking_pixel_urlstring
URL for impression tracking.
company_job_idstring
Employer job id for impression tracking.
apply_methodobjectrequired
apply_method object
(variant) Apply within LinkedInobject
(variant) Apply within LinkedIn object
typestringlinkedinrequired
notification_emailstringrequired
resume_requiredbooleanrequired
(variant) Apply through an external websiteobject
(variant) Apply through an external website object
typestringexternalrequired
urlstringrequired
salaryobject
salary object
currencystringrequired
ISO 4217 (e.g. USD, EUR).
minnumberrequired
maxnumberrequired
pay_frequencystringrequired
YEARLYMONTHLYHOURLY
additional_compensationobject
Bonus / equity / etc., same shape as `salary`.
additional_compensation object
currencystringrequired
ISO 4217 (e.g. USD, EUR).
minnumberrequired
maxnumberrequired
pay_frequencystringrequired
YEARLYMONTHLYHOURLY
auto_archive_applicantsobject
LinkedIn `Qualification setting`.
auto_archive_applicants object
screening_questionsboolean
Auto-archive applicants who don't meet must-have screening questions. Default true.
outside_of_countryboolean
Auto-archive applicants outside the hiring country. Default true.
send_rejection_notificationboolean
LinkedIn `Send rejection notification`. Default true.

Response 200 OK

objectstringLinkedinJobPostingDraftCreatedrequired
job_idstringrequired
project_idstring
Recruiter project id (only for Recruiter postings).
publish_optionsobjectrequired
publish_options object
freeobjectrequired
free object
eligiblebooleanrequired
Whether the user is authorized to publish this offer for free.
ineligible_reasonstringrequired
estimated_monthly_applicantsnumberrequired
promotedobjectrequired
promoted object
estimated_monthly_applicantsnumberrequired
currencystringrequired
daily_budgetobjectrequired
daily_budget object
minnumberrequired
maxnumberrequired
recommendednumberrequired
monthly_budgetobjectrequired
monthly_budget object
minnumberrequired
maxnumberrequired
recommendednumberrequired

Example request

curl --request POST \
  --url 'https://api.postpress.ai/api/v1/linkedin/jobs' \
  --header 'X-API-KEY: pp_live_...' \
  --header 'accept: application/json' \
  --header 'content-type: application/json' \
  --data '{
    "account_id": "acc_linkedin_01HXYZ4QK3WJ8FN3M6QH7TZ8GR",
    "job_title":  { "id": "9" },
    "company":    { "id": "9374000" },
    "workplace":  "HYBRID",
    "location":   "102277331",
    "employment_status": "FULL_TIME",
    "description": "<p>We are hiring a Senior Frontend Engineer ...</p>"
  }'

Example response

{
  "object": "LinkedinJobPostingDraftCreated",
  "job_id": "3984512098",
  "project_id": "proj_01HXYZ4QK3WJ8FN3M6QH7TZ8GR",
  "publish_options": {
    "free": {
      "eligible": true,
      "ineligible_reason": null,
      "estimated_monthly_applicants": 18
    },
    "promoted": {
      "estimated_monthly_applicants": 142,
      "currency": "USD",
      "daily_budget":   { "min": 10, "max": 250, "recommended": 35 },
      "monthly_budget": { "min": 300, "max": 7500, "recommended": 1050 }
    }
  }
}

Errors

Every error response follows the same envelope:

titlestringrequired
Short error title.
detailstringoptional
Human-readable explanation.
instancestringoptional
Request identifier for support.
typestringrequired
Error type identifier.
statusnumberrequired
HTTP status code.
401 Unauthorized13 types

Credentials are missing, expired, or otherwise invalid.

  • errors/missing_credentials - Some credentials are necessary to perform the request.
  • errors/multiple_sessions - LinkedIn limits multiple sessions on certain Recruiter accounts. Use the cookie connection method.
  • errors/wrong_account - The provided credentials do not match the correct account.
  • errors/invalid_credentials - The provided credentials are invalid.
  • errors/invalid_proxy_credentials - The provided proxy credentials are invalid.
  • errors/invalid_checkpoint_solution - The checkpoint resolution did not pass successfully. Retry.
  • errors/checkpoint_error - The checkpoint does not appear to be resolvable.
  • errors/expired_credentials - Credentials have expired. Reconnect the account.
  • errors/expired_link - This link has expired. Generate a new one.
  • errors/insufficient_privileges - This resource is out of your API-key scopes.
  • errors/disconnected_account - The account is disconnected from the provider service.
  • errors/disconnected_feature - The service you're trying to reach is disconnected.
  • errors/invalid_credentials_but_valid_account_imap - IMAP/SMTP credentials are invalid but the account is otherwise valid.
403 Forbidden9 types

Authenticated but the account is restricted or the action is not allowed.

  • errors/insufficient_permissions - Valid authentication but insufficient permissions to perform the request.
  • errors/account_restricted - The account has been restricted by the provider.
  • errors/account_mismatch - This action cannot be done with your account.
  • errors/unknown_authentication_context - An additional step seems necessary to complete login.
  • errors/session_mismatch - Token user id does not match client session id.
  • errors/feature_not_subscribed - The requested feature has not been subscribed or authenticated properly.
  • errors/subscription_required - A subscription is required to use this feature.
  • errors/resource_access_restricted - You don't have access to this resource.
  • errors/action_required - An additional step is required.
404 Not Found2 types

The targeted account or resolved id does not exist.

  • errors/resource_not_found - The requested resource was not found.
  • errors/invalid_resource_identifier - The provided identifier is not valid for this resource.
422 Unprocessable Entity5 types

The body is well-formed but the request cannot be fulfilled as-is.

  • errors/invalid_account - The provided account is not designed for this feature.
  • errors/unprocessable_entity - The request cannot be processed in its current form.
  • errors/account_configuration_error - The account configuration prevents this request.
  • errors/insufficient_job_slot - The account does not have an available job slot to create another posting.
  • errors/limit_exceeded - A LinkedIn or postpress limit was hit for this action.
500 Internal Server Error3 types

Something went wrong on our side or with the upstream provider.

  • errors/unexpected_error - Something went wrong.
  • errors/provider_error - The provider is experiencing operational problems. Retry later.
  • errors/authentication_intent_error - The current authentication intent was killed after failure.
503 Service Unavailable5 types

postpress is temporarily unable to handle the request.

  • errors/no_client_session - No client session is currently running.
  • errors/no_channel - No channel to client session.
  • errors/no_handler - Handler missing for that request.
  • errors/network_down - Network is down on the server side. Retry shortly.
  • errors/service_unavailable - Service temporarily unavailable. Retry later.
504 Gateway Timeout1 types

The upstream provider did not respond in time.

  • errors/request_timeout - Request timed out. Retry, and contact support if it persists.
Updated May 2026