Optimised Apply

This use case provides technical implementation details for the SEEK Optimised Apply product. You can find more information and request an integration on its product page .Using SEEK’s Apply Form, candidates can apply for jobs without leaving our website or mobile app. This allows candidates to use documents and information already stored in their SEEK Profiles. SEEK Optimised Apply enables industry-leading conversion rates of candidates through the application funnel.When a candidate applies for a job advertised by one of your hirers, the SEEK API makes their application available for export. You can export applications for job ads posted via your recruitment software, but also for those posted directly on SEEK.

Retrieving candidate applications

CandidateApplicationCreated events are emitted when candidates submit applications. You will receive events for SEEK hirers you have an ApplicationExport relationship with at the time of application submission.You will need to request candidate application details from the GraphQL endpoint in response to these events. For more details, see:The available deliverables for an application will differ based on the job posting method, configuration of the job ad, and what the candidate provides. Ensure that you have accounted for all supported deliverables when you are validating your build.
Job posting method
Application ingestion method
Deliverables
Via your software
Optimised ApplyNew
Candidate data
Attachmentsresume, cover letter, selection criteria
ATS screening question submissionsNew
Direct on SEEK
Optimised ApplyNew
Candidate data
Attachmentsresume, cover letter, selection criteria
SEEK screening question submissions
The SEEK API may occasionally send duplicate events. This can occur incidentally, or when SEEK finds and fixes a data quality issue. While it is generally safe to ignore duplicate events that are sent in quick succession, we recommend reprocessing them to ensure that your software always has the latest view of each application.A duplicate CandidateApplicationCreated event does not indicate that a candidate modified their application. A candidate may submit multiple applications for a given job ad on the SEEK job board, but each application is modelled as its own object.A candidate application will remain for 180 days after the close date of its associated job ad. Your software must store any data that it needs to access after the 180 day period.

Job ads posted outside of your software

A significant number of SEEK hirers have workflows that require posting job ads directly on the SEEK employer website. On the SEEK employer website , there is a job reference field that hirers can provide during posting if they intend for the applications to arrive in their ATS.In order to support the workflows of these hirers, SEEK strongly recommends that you appropriately handle CandidateApplicationCreated events from job ads posted outside of your software. Otherwise, hirers will need to use the SEEK employer website to manage applications for these job ads.To associate an application from a job ad with the appropriate position in your software, use the PostedPositionProfile.seekHirerJobReference field. Your software will not have a record of position identifiers for job ads posted outside the SEEK API, so associating applications based on known position identifiers will fail.If the design of your software prohibits it from handling job ads posted from another source, you can implement the following logic:
  1. Use a reference field to correlate the job ad with an existing position in your software.
  2. If correlation fails, check the PostedPositionProfile.seekCreatedBySelfIndicator field for the job ad.true indicates that the job ad was posted by your software. You should triage this job ad as your software may have omitted a reference field.false indicates that the job ad was posted outside of your software. You may discard this job ad and its associated applications at the expense of workflow flexibility for your hirers. If you received the application via webhook, you should still respond with a 2xx status to allow the SEEK API to halt retries and mark the application as delivered.

Implementation options

Option 1: Webhook

Receiving a candidate application via webhook with the SEEK API:
This is an example of a webhook body containing two CandidateApplicationCreated events:
JSON
Copy
{
  "events": [
    {
      "id": "seekAnzPublicTest:event:events:5cKZnRzXas97fyUAhpiAV1",
      "type": "CandidateApplicationCreated",

      "createDateTime": "2019-09-13T22:16:10.593Z",

      "candidateApplicationProfileId": "seekAnzPublicTest:candidateProfile:apply:7DtW6Q68gk2R4okNGhvg1Y",
      "candidateId": "seekAnzPublicTest:candidate:feed:5PGXAHysiXhtA9JUqhyM8hhzMuWMPA",

      // This is only available for signed webhook subscriptions
      "hirerId": "seekAnzPublicTest:organization:seek:93WyyF1h"
    },
    {
      "id": "seekAnzPublicTest:event:events:WBmJMt4uEbj72ZVMhGi2hS",
      "type": "CandidateApplicationCreated",

      "createDateTime": "2019-09-08T20:32:12.479Z",

      "candidateApplicationProfileId": "seekAnzPublicTest:candidateProfile:apply:4QM5fWQbdekL9gPtPZrzex",
      "candidateId": "seekAnzPublicTest:candidate:feed:5PGXAHysjZdkQYwZghfL4bRCqvZ7ZM",

      // This is only available for signed webhook subscriptions
      "hirerId": "seekAnzPublicTest:organization:seek:93WyyF1h"
    }
  ],
  "subscriptionId": "seekAnzPublicTest:webhookSubscription:events:BoJiJ9ZWFVgejLXLJxUnvL",
  "url": "https://example.com/webhook"
}
Events sent via the webhook method do not contain sensitive information.Once you receive an event you can use its candidateApplicationProfileId to query the candidate’s application using the candidateProfile query.See the webhooks section for more information.

Option 2: Polling

Receiving candidate application events via polling with the SEEK API:
This query example returns a page of CandidateApplicationCreated events since the previous cursor:
QueryVariables
query ($after: String!, $filter: EventsFilterInput!, $schemeId: String!) {
  events(after: $after, filter: $filter, schemeId: $schemeId) {
    edges {
      node {
        typeCode
        ... on CandidateApplicationCreatedEvent {
          candidate {
            person {
              name {
                formattedName
              }
            }
          }
          candidateApplicationProfile {
            associatedPositionProfile {
              positionUri
            }
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
You do not need to query for the candidate’s application separately as all information can be retrieved as part of the Event.See the polling section for more information.