This content provides an early look at an upcoming extension to the SEEK API. You may use it to scope integration effort, but the features described are not fully implemented and may be adjusted ahead of a production release.Check with your SEEK contact before starting any build work described here.
HTML
Copy
<script
type="text/javascript"
src="https://integration.seek.com/panels/SeekApi.js"
></script>
SeekApi.render function which renders the Enhanced Job Posting panel.The render function must be called on page load and whenever the properties of the job requisition change.
For example, if the hirer updates the job title of the requisition, you must re-render the panel to reflect changes.JavaScript
Copy
const { dispatchEvent } = SeekApi.render(
containerNode,
'enhancedJobPosting',
props);
SeekApi.render will return an object containing the dispatchEvent function, which you can use to trigger the draft to be saved.
See manage drafts for further details.We recommend your containerNode spans the full width of your UI for the best user experience.Prop | Type | Description |
|---|---|---|
getAuthToken | () => Promise<string> | Function to retrieve a browser token for the SEEK API |
position | object | The position object containing job requisition details which will be used to pre-fill the panel. See position below. |
draftPositionProfileId | stringoptional | If the user has previously created a draft with Enhanced Job Posting and a draftPositionProfileId has been returned, the id should be provided whenever the panel is rerendered. |
positionProfileId | stringoptional | An existing job ad to be edited. When supplied, the panel will open in edit mode for that job ad. When omitted, the panel will open in create mode for a new job ad. |
locale | stringoptional | Specifies the locale to display content in, e.g. en-AU. Set this prop to override the default localisation behaviour based on users browser preferences. Supported locales are outlined in the content localisation documentation. |
partnerManagedFields | string[]optional | A list of fields that your software captures separately to the Enhanced Job Posting panel. If a value is not supplied for a listed field, the panel will assume that the user has already been prompted to enter a value. Currently 3 fields are supported: - /postingInstructions/end - /seekBillingReference - /seekHirerJobReference |
position prop aligns to the structure of the PostPositionInput type used in Classic Job Posting, with differences to accommodate the Enhanced Job Posting panel:- Many mandatory fields from
PostPositionInputare optional in thepositionprop. When omitted the fields will be inferred or defaulted by the panel for the hirer to edit. - Validation to optional fields will not return errors to your system or prevent the panel from displaying. Instead, the panel will use defaults or otherwise allow the hirer to resolve. For example:
- Where an input violates maximum / minimum lengths, the panel will attempt to display the input with a validation error.
- Where fields expecting set values are supplied with unrecognised values, a default option will be inferred or displayed as not selected.
positionLocationshould be provided as a formatted address (for example,60 Cremorne St, Cremorne VIC 3121) and country code (for example,AU) which the SEEK location will be inferred from.- A SEEK job category will be inferred from the provided
positionvalues if an OID is not provided in thejobCategoriesargument. - ATS Screening Questions can be passed directly into the panel to create a questionnaire when the job is posted. Alternatively an interactive form can be provided to allow the hirer to add their own questions.
position see Position input.JavaScript
Copy
const { dispatchEvent } = SeekApi.render(
document.getElementById('seekPanelContainer'),
'enhancedJobPosting',
{
getAuthToken: async () => {
// Do not implement caching in your `getAuthToken` implementation.
// The panel will internally memoise the response.
const token = await fetchAuthToken();
return token;
},
position: {
positionOpening: {
postingRequester: {
roleCode: 'Company',
id: 'seekAnzPublicTest:organization:seek:93WyyF1h',
personContacts: [
{
communication: {
email: [{ address: 'mary.manager@example.com' }],
phone: [{ formattedNumber: '03 8517 4100' }],
address: [
{
extendedLines: [{ type: 'Apartment', value: 'line 1' }],
line: 'line 2',
countrySubDivisions: [{ type: 'State', value: 'Vic' }],
geoLocation: { latitude: 0, longitude: 0 },
formattedAddress: 'line 3',
countryCode: 'AU',
postalCode: '1234',
city: 'Melbourne',
},
],
},
name: {
family: 'Manager',
given: 'Mary',
formattedName: 'Mary Manager',
},
roleCode: 'HiringManager',
}
],
},
statusCode: 'Active',
},
basePositionProfile: {
positionTitle: 'Associate Developer',
positionOrganizations: ['seekAnzPublicTest:organization:seek:93WyyF1h'],
positionLocation: [
{
address: {
formattedAddress: '1 Cremorne St, Cremorne, VIC 3550',
countryCode: 'AU',
postalCode: '3550',
}
},
],
seekAnzWorkTypeCode: 'FullTime',
seekWorkArrangementCodes: ['OnSite'],
jobCategories: [{ name: 'Developers/Programmers' }],
offeredRemunerationPackage: {
basisCode: 'Salaried',
descriptions: ['$50,000 - $60,000 per year'],
ranges: [
{
minimumAmount: { value: 50_000, currency: 'AUD' },
maximumAmount: { value: 60_000, currency: 'AUD' },
intervalCode: 'Year',
},
],
},
positionFormattedDescriptions: [
{
descriptionId: 'AdvertisementDetails',
content: 'A newly created role for an ambitious <b>junior</b> or <b>graduate</b> developer. Be part of a great team in the Bendigo area.',
},
{
descriptionId: 'SearchSummary',
content: 'Start your software development career with a dynamic & growing team',
},
{
descriptionId: 'SearchBulletPoint',
content: 'Great team in the Bendigo area',
},
{
descriptionId: 'SearchBulletPoint',
content: 'Career progression opportunities',
},
{
descriptionId: 'SearchBulletPoint',
content: 'Free coffee & snacks',
},
],
postingInstructions: [
{
applicationMethods: [{ applicationUri: { url: 'https://au.seek.com/apply' } }],
end: '2000-01-01T14:00:00.000Z',
},
],
seekApplicationQuestionnaire: {
interactiveQuestionnaire: {
seekPrivacyPolicy: {
url: 'https://au.seek.com/privacy',
descriptionHtml: 'Do you agree to the privacy policy?',
}
},
},
seekBillingReference: 'JOB-123',
seekHirerJobReference: 'JOB-AB-123',
seekPartnerMetadata: null,
seekVideo: {
url: 'https://www.youtube.com/watch?v=iM9onXRkTa8j',
},
}
}
partnerManagedFields: ['/postingInstructions/end', '/seekBillingReference'],
}
);
- The panel loads and invokes the
getAuthTokenfunction passed to it. - Your frontend requests a browser token from your backend.The
getAuthTokenfunction should request a new token for the hirer ID inpositionProfile.positionOrganizations. If a user switches to a different SEEK hirer account in your posting form, your software should re-render the panel with the new hirer ID inpositionProfile.positionOrganizations, and ensure that subsequent invocations ofgetAuthTokenwill request a token for the new hirer ID. - Your backend authenticates and authorizes the user.Your software is responsible for verifying that the user is authorized to access a given hirer ID. A user must not be able to request a browser token for an arbitrary organization that they do not belong to.
- Your backend requests a browser token from the SEEK API for the appropriate hirer ID and
query:enhanced-job-posting, mutation:enhanced-job-postingscope. - Your backend responds with the browser token.
- Your frontend returns the browser token from the
getAuthTokenfunction. - The panel can now make requests to the GraphQL endpoint.
HTTP
Copy
POST https://graphql.seek.com/auth/token HTTP/2
Authorization: Bearer PARTNER_TOKEN_HERE
Content-Type: application/json
User-Agent: YourPartnerService/1.2.3
{"hirerId": "seekAnzPublicTest:organization:seek:93WyyF1h",
"scope": "query:ad-products query:organizations",
"userId": "317665"
}