Publish a job posting

POSThttps://api.postpress.ai/v1/linkedin/jobs/{draft_id}/publish

Publish a LinkedIn job posting draft as either a free listing or a promoted (paid) listing.

Authorization

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

Path parameters

draft_idstringrequired
The id of the draft to publish.

Request body

The body is a discriminated union on mode: FREE or PROMOTED / PROMOTED_PLUS.

Body - Free posting

account_idstringrequired
The id of the account to trigger the request from.
servicestring
CLASSICRECRUITER
Which LinkedIn service this job posting depends on. Defaults to `CLASSIC`.
hiring_photo_frameboolean
Whether to add the hiring photo frame to the profile picture.
bypass_email_verificationboolean
Skip the check that verifies you are allowed to post on behalf of the current company.
modestringFREErequired

Body - Promoted posting

account_idstringrequired
The id of the account to trigger the request from.
servicestring
CLASSICRECRUITER
Which LinkedIn service this job posting depends on. Defaults to `CLASSIC`.
hiring_photo_frameboolean
Whether to add the hiring photo frame to the profile picture.
bypass_email_verificationboolean
Skip the check that verifies you are allowed to post on behalf of the current company.
modestringrequired
PROMOTEDPROMOTED_PLUS
`PROMOTED` works for Classic and Recruiter. `PROMOTED_PLUS` is Classic-only.
budgetobject
Either a daily budget or a monthly budget. Defaults to LinkedIn's recommendation when omitted.
budget object
(variant) dailyobject
(variant) daily object
dailyobjectrequired
daily object
currencystringrequired
amountnumberrequired
(variant) monthlyobject
(variant) monthly object
monthlyobjectrequired
monthly object
currencystringrequired
amountnumberrequired

Response 200 OK

Two response variants. If LinkedIn requires an additional step before publishing (typically email verification or OTP), you'll receive a checkpoint payload to resolve via POST /linkedin/jobs/{job_id}/checkpoint.

(variant) Publishedobject
Returned when the job was published immediately.
(variant) Published object
objectstringLinkedinJobPostingPublishedrequired
job_statestringrequired
activedraftreviewclosedpaused
job_idstringrequired
(variant) Checkpointobject
Returned when LinkedIn requires an additional step (email verification or OTP).
(variant) Checkpoint object
objectstringLinkedinJobPostingPublishCheckpointrequired
typestringrequired
EMAIL_VERIFICATIONOTP
Resolve via `POST /linkedin/jobs/{id}/checkpoint`.
job_idstringrequired

Example request

curl --request POST \
  --url 'https://api.postpress.ai/api/v1/linkedin/jobs/3984512098/publish' \
  --header 'X-API-KEY: pp_live_...' \
  --header 'accept: application/json' \
  --header 'content-type: application/json' \
  --data '{
    "account_id": "acc_linkedin_01HXYZ4QK3WJ8FN3M6QH7TZ8GR",
    "service": "CLASSIC",
    "mode": "FREE",
    "hiring_photo_frame": true
  }'

Example response

{
  "object": "LinkedinJobPostingPublished",
  "job_state": "active",
  "job_id": "3984512098"
}

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.
400 Bad Request8 types

The request body is malformed or the draft is not eligible for the requested mode (e.g. free posting).

  • errors/invalid_parameters - One or more parameters are invalid (wrong enum, wrong shape, draft not eligible to free posting, ...).
  • errors/malformed_request - The request is malformed.
  • errors/content_too_large - The request body is too large.
  • errors/invalid_url - A URL field is invalid.
  • errors/too_many_characters - A string field exceeds the allowed length.
  • errors/unescaped_characters - A field contains characters that must be encoded.
  • errors/missing_parameters - A required field (`account_id`, `mode`, ...) is missing.
  • errors/limit_too_high - A numeric field exceeds the allowed maximum.
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 draft 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 Entity7 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/action_already_performed - This draft has already been published.
  • errors/payment_error - Promoted publishing failed at the payment step.
  • errors/insufficient_credits - The account does not have enough credits to promote the job.
  • errors/insufficient_job_slot - The account does not have an available job slot.
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