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_idstringrequiredThe id of the account to trigger the request from.
job_titleobjectrequiredEither `id` (JOB_TITLE) or `text`.
job_title object
idstringNumeric id resolved via `GET /linkedin/search/parameters`.
textstringFree-text fallback when no id is available.
companyobjectrequiredEither `id` (COMPANY) or `text`.
company object
idstringNumeric id resolved via `GET /linkedin/search/parameters`.
textstringFree-text fallback when no id is available.
workplacestringrequiredON_SITEHYBRIDREMOTElocationstringrequiredLOCATION id (numeric). Resolve via `type=LOCATION`.
employment_statusstringFULL_TIMEPART_TIMECONTRACTTEMPORARYOTHERVOLUNTEERINTERNSHIPdescriptionstringrequiredJob description. HTML tags allowed.
auto_rejection_templatestringTemplate sent automatically to applicants that don't pass screening questions.
screening_questionsarray of objectsTwo variants: `numeric` or `multiple_choices`.
screening_questions object
(variant) numericobjectWhen `answer_type=numeric`.
(variant) numeric object
questionstringrequiredanswer_typestringnumericrequiredpositionnumberOverrides the index of the question in the array.
must_matchbooleanIf true, answers outside the expected range disqualify the applicant.
min_expectationnumbermax_expectationnumber(variant) multiple_choicesobjectWhen `answer_type=multiple_choices`.
(variant) multiple_choices object
questionstringrequiredanswer_typestringmultiple_choicesrequiredchoicesarray of stringsrequiredexpected_choicesarray of stringsrequiredpositionnumbermust_matchbooleanrecruiterobjectRecruiter-specific fields. Required when the account uses LinkedIn Recruiter.
recruiter object
projectobjectrequiredEither 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
namestringrequiredName for a new Recruiter project.
functionsarray of stringsrequired1-3 job-function ids (lowercase). Resolve via `type=JOB_FUNCTION`.
industriesarray of stringsrequired1-3 industry ids. Resolve via `type=INDUSTRY`.
skillsarray of strings1-10 skill ids. Resolve via `type=SKILL`.
senioritystringrequiredINTERNSHIPENTRY_LEVELASSOCIATEMID_SENIOR_LEVELDIRECTOREXECUTIVENOT_APPLICABLEinclude_poster_infobooleanShow the poster's profile on the job post. Default true.
tracking_pixel_urlstringURL for impression tracking.
company_job_idstringEmployer job id for impression tracking.
apply_methodobjectrequiredapply_method object
(variant) Apply within LinkedInobject(variant) Apply within LinkedIn object
typestringlinkedinrequirednotification_emailstringrequiredresume_requiredbooleanrequired(variant) Apply through an external websiteobject(variant) Apply through an external website object
typestringexternalrequiredurlstringrequiredsalaryobjectsalary object
currencystringrequiredISO 4217 (e.g. USD, EUR).
minnumberrequiredmaxnumberrequiredpay_frequencystringrequiredYEARLYMONTHLYHOURLYadditional_compensationobjectBonus / equity / etc., same shape as `salary`.
additional_compensation object
currencystringrequiredISO 4217 (e.g. USD, EUR).
minnumberrequiredmaxnumberrequiredpay_frequencystringrequiredYEARLYMONTHLYHOURLYauto_archive_applicantsobjectLinkedIn `Qualification setting`.
auto_archive_applicants object
screening_questionsbooleanAuto-archive applicants who don't meet must-have screening questions. Default true.
outside_of_countrybooleanAuto-archive applicants outside the hiring country. Default true.
send_rejection_notificationbooleanLinkedIn `Send rejection notification`. Default true.
Response 200 OK
objectstringLinkedinJobPostingDraftCreatedrequiredjob_idstringrequiredproject_idstringRecruiter project id (only for Recruiter postings).
publish_optionsobjectrequiredpublish_options object
freeobjectrequiredfree object
eligiblebooleanrequiredWhether the user is authorized to publish this offer for free.
ineligible_reasonstringrequiredestimated_monthly_applicantsnumberrequiredpromotedobjectrequiredpromoted object
estimated_monthly_applicantsnumberrequiredcurrencystringrequireddaily_budgetobjectrequireddaily_budget object
minnumberrequiredmaxnumberrequiredrecommendednumberrequiredmonthly_budgetobjectrequiredmonthly_budget object
minnumberrequiredmaxnumberrequiredrecommendednumberrequiredExample 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