Posting a job ad

The SEEK API surfaces two mutations to post job ads, postPosition and postPositionProfileForOpening. Posting typically takes less than a minute after which a PositionProfilePosted event will be emitted.Job ads on SEEK have a maximum period of 30 days. Your software must allow hirers to advertise a job on SEEK for this full period.

Idempotency

Requests that carry a job posting mutation must be idempotent . This removes the risk of unintentionally posting duplicate job ads when your software needs to retry a request due to an error.A unique idempotencyId is required when posting a job ad. We recommend that you generate a new v4 UUID  before sending the first request to post each job ad, and to reuse that identifier on all subsequent retries of the same job ad.If your software has already posted a job ad with the same idempotencyId, the SEEK API will return a PostPositionPayload_Conflict or PostPositionProfileForOpeningPayload_Conflict result in accordance with our mutation conflict convention. If your software was retrying a job posting request, you can treat the conflict result as a success as it indicates the job ad has already been posted. See the code samples below for practical examples of these conflict results.The SEEK API deduplicates job ads posted by your software based on their idempotencyIds. Your software should never reuse an idempotencyId when posting a different job ad; this may result in subsequent job ads being missed or other unexpected behaviour. Your identifiers are isolated and will not conflict with those generated by other recruitment software providers.

Operations

The following sample mutations are provided for demonstration purposes only; they are not executable in the Playground environment. You should use your live partner credentials to post a job ad under your unsearchable SEEK test hirer for end-to-end testing.

postPosition

The postPosition mutation creates a new position opening and posts a PositionProfile in a single operation.
MutationVariablesSuccess resultConflict result
mutation ($input: PostPositionInput!) {
  postPosition(input: $input) {
    ... on PostPositionPayload_Success {
      positionOpening {
        documentId {
          value
        }
      }
      positionProfile {
        profileId {
          value
        }
      }
    }
    ... on PostPositionPayload_Conflict {
      conflictingPositionOpening {
        documentId {
          value
        }
      }
      conflictingPositionProfile {
        profileId {
          value
        }
      }
    }
  }
}

postPositionProfileForOpening

The postPositionProfileForOpening mutation posts a new PositionProfile within an existing position opening.A single position opening can contain a maximum of 300 position profiles. Once a position profile has been posted it will remain in the position opening until 180 days after its close date.
MutationVariablesSuccess resultConflict result
mutation ($input: PostPositionProfileForOpeningInput!) {
  postPositionProfileForOpening(input: $input) {
    ... on PostPositionProfileForOpeningPayload_Success {
      positionProfile {
        profileId {
          value
        }
      }
    }
    ... on PostPositionProfileForOpeningPayload_Conflict {
      conflictingPositionProfile {
        profileId {
          value
        }
      }
    }
  }
}
You will receive a FORBIDDEN error if the hirer in positionOrganizations does not match the PostingRequester.id of the existing position opening.

Events

PositionProfilePosted

PositionProfilePosted events are emitted when job ads have been posted on the SEEK job board. You will receive events for SEEK hirers you have a JobPosting relationship with at the time of posting.In response to these events you can request fields from the position profile. For example, you could query:This is an example of a webhook body containing a PositionProfilePosted event:
JSON
Copy
{
  "events": [
    {
      "id": "seekAnzPublicTest:event:events:UeFHntCu5giQh9Z6CRc2J7",
      "type": "PositionProfilePosted",
      "createDateTime": "2019-08-20T21:02:24.611Z",
      // This can be passed to the `positionProfile` query
      "positionProfileId": "seekAnzPublicTest:positionProfile:jobAd:26d9DVAzs",
      // This is only available for signed webhook subscriptions
      "hirerId": "seekAnzPublicTest:organization:seek:93WyyF1h"
    }
  ],
  "subscriptionId": "seekAnzPublicTest:webhookSubscription:events:Kyak8JfPKhHCAXM2s9b9wX",
  "url": "https://example.com/1/2/3"
}