Profesia Job Ads Import API
REST API used to automatically enter job adverts to Profesia.sk or Profesia.cz. Once the client’s system is configured, job adverts are published automatically — there is no need to log in to Profesia.sk to publish, update, or unpublish an advert.

The leading Slovak job board for experienced professionals and managers across all industries.
Visit Profesia.skCredits (Prepaid Service)
Posting job adverts requires prepaid credit. A job advert can be displayed for no longer than one month while the credit is valid.
Recommendations for a Successful Implementation
- Validate the JSON request body against the Profesia JSON Schema before sending it.
- Every API response contains a success or error code together with a message — read the message, it always carries actionable detail.
- Test each scenario (insert, update, refresh, unpublish, and the documented error cases) before relying on the integration in production.
Base URL
http://www.profesia.sk/API/ImportEvery endpoint is scoped under a company-specific secret hash:
http://www.profesia.sk/API/Import/{SECRET_HASH}/...SECRET_HASH is the company account hash issued by Profesia. It identifies and authenticates the calling company — there is no separate authentication header or token.
Allowed HTTP Requests
| Method | Purpose |
|---|---|
POST | Insert a new job offer |
PUT | Update a job offer / repost (refresh) an existing job offer |
DELETE | Unpublish a job offer |
GET | Get info (codebooks, company data, or a single job offer) |
Job offers cannot be deleted. Once a job offer is created it can only be updated. An advert can only be in
publishedorunpublishedstate —DELETEunpublishes it, it does not remove it.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /{SECRET_HASH}/codebook/?lng={lng} | List all codebooks |
GET | /{SECRET_HASH}/codebook/{codebookType}?lng={lng} | Get a single codebook |
GET | /{SECRET_HASH}/codebook/workplaceType/{typeId}/regions?lng={lng} | Locations available for a given workplace type |
GET | /{SECRET_HASH}/codebook/customFields | List the company’s custom fields |
GET | /{SECRET_HASH}/company/ | Basic company info |
GET | /{SECRET_HASH}/company/creditPackages?lng={lng} | Remaining credit balance |
GET | /{SECRET_HASH}/company/contactData | Registered contact persons |
GET | /{SECRET_HASH}/company/offerList | List of current job ads |
POST | /{SECRET_HASH}/offer/{externalId} | Insert a new job offer |
PUT | /{SECRET_HASH}/offer/{externalId} | Update a job offer |
GET | /{SECRET_HASH}/offer/{externalId} | Get detail of a job offer |
DELETE | /{SECRET_HASH}/offer/{externalId} | Unpublish a job offer |
POST | /{SECRET_HASH}/top-offer/{externalId} | Refresh (repost) an existing job offer |
externalId is the job advert’s ID in the partner’s own system — it must be at least four characters and is how you reference the advert in every subsequent call.
Codebooks
Several fields (channel, jobType, regions, categoryPositions, educationLevels, skills, drivingLicence, businessAreaId, postingPeriod, customFields, …) accept numeric or coded IDs defined by Profesia’s codebooks rather than free text. Fetch the relevant codebook to resolve the valid values before building a request.
List All Codebooks
GET /{SECRET_HASH}/codebook/?lng={lng}
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
lng | path/query | sk | cz | hu | de | en |
{
"jobType": [
{ "id": "1", "description": "plný úväzok" },
{ "id": "2", "description": "skrátený úväzok" },
{ "id": "4", "description": "na dohodu" },
{ "id": "8", "description": "živnosť" },
{ "id": "32", "description": "internship, stáž" }
],
"languageFlag": [
{ "id": "sk" }, { "id": "en" }, { "id": "hu" }, { "id": "de" }, { "id": "cz" }
],
"channel": [
{ "id": 1, "description": "profesia.sk" },
{ "id": 3, "description": "profesia.cz" }
],
"drivingLicence": [
{ "id": "A" }, { "id": "B" }, { "id": "C" }, { "id": "D" }, { "id": "E" }, { "id": "T" }
]
}Single Codebook
GET /{SECRET_HASH}/codebook/{codebookType}?lng={lng}
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
codebookType | path | One of: channel, languageFlag, contactData, jobType, workplaceType, regions, categoryPositions, educationLevels, skills, drivingLicence, salaryPeriods, currencies, businessAreaId, postingPeriods, customFields |
lng | path/query | sk | cz | hu | de | en |
{
"channel": [
{ "id": 1, "description": "profesia.sk" },
{ "id": 3, "description": "profesia.cz" }
]
}Locations by Workplace Type
GET /{SECRET_HASH}/codebook/workplaceType/{typeId}/regions?lng={lng}
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
typeId | path | 1 | 2 |
lng | path/query | sk | cz | hu | de | en |
{
"regions": [
{ "id": 1, "description": "Bratislavský kraj", "regionType": "region", "parent": 9, "workplaceType": [1, 2] },
{ "id": 2, "description": "Banskobystrický kraj", "regionType": "region", "parent": 9, "workplaceType": [1, 2] }
]
}regionType can be a country, region, district, or municipality.
Custom Fields Codebook
GET /{SECRET_HASH}/codebook/customFields
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
{
"customFields": [
{
"fieldName": "extra_singleselect",
"fieldType": "singleselect",
"defaultValues": [
{ "page_id": 4001, "name": "ss_value 01" },
{ "page_id": 4002, "name": "ss_value 02" }
],
"description": "Praesent sapien massa, convallis a pellentesque nec, egestas non nisi.",
"isRequired": true
}
]
}Supported fieldType values:
fieldType | Description |
|---|---|
textField | Short text |
textArea | Text area — description field |
singleSelect | Drop-down list — single select |
selectize | Selectize — multi select |
checkbox | true/false, true = 1 |
Company Info
Basic Info
GET /{SECRET_HASH}/company/
{
"company": {
"id": 51706,
"companyName": "Test company",
"businessId": "75070511",
"DIC": "SK75070511"
}
}Remaining Credits
GET /{SECRET_HASH}/company/creditPackages?lng={lng}
{
"creditPackages": [
{ "description": "Remaining number of regional credits (10)", "type": "regional", "count": 10, "channels": [1, 3] },
{ "description": "Remaining number of credits on www.profesia.sk (7)", "type": "www.profesia.sk", "count": 7, "channels": [1] }
]
}Contact Persons
GET /{SECRET_HASH}/company/contactData
Registered users who may be used as the advert’s contact person / submitter.
{
"contactData": [
{ "id": 108599, "name": "John Doe", "email": "john.doe@notrealmail.eu" },
{ "id": 468738, "name": "Peter Smith", "email": "peter.smith@notrealmail.eu" }
]
}List Current Job Ads
GET /{SECRET_HASH}/company/offerList
Returns the list of the company’s currently active job ads.
[
{
"externalId": "testJob_0001",
"offerId": 3778230,
"position": ".NET/C# developer 01",
"offerUrl": "https://www.profesia.sk/praca/test-company/3778231",
"apiUrl": "http://www.profesia.sk/API/Import/SECRET_HASH/offer/testJob_0001",
"addDate": "24.10.2019",
"validTill": "24.11.2019"
},
{
"externalId": "testJob_0002",
"offerId": 3778229,
"position": ".NET/C# developer 02",
"offerUrl": "https://www.profesia.sk/praca/test-company/3778231",
"apiUrl": "http://www.profesia.sk/API/Import/SECRET_HASH/offer/testJob_0002",
"addDate": "24.10.2019",
"validTill": "24.11.2019"
}
]Job Offer Request Body
The following fields make up the JSON body for POST (insert) and PUT (update) of /{SECRET_HASH}/offer/{externalId}.
Required: channel, jobType, languageFlag, position, jobTasks, workplaceType, categoryPositions, regions, educationLevels, contactData, and at least the basic salary in salaryInterval (disclosing the basic wage component is mandatory under the Slovak Employment Services Act, 5/2004 §62 sec. 2).
Text Fields
| Field | Type | Description | Constraints |
|---|---|---|---|
position | string | Title of the job advert / offered position | 5–151 chars |
refNr | string | Reference number in the partner’s system | 2–21 chars, nullable |
jobTasks | string | Description of responsibilities and job tasks | min 5 chars, nullable |
prerequisites | string | Prerequisites of an employee | min 5 chars, nullable |
otherBenefits | string | Benefits offered by the employer | min 5 chars, nullable |
salary | string | Additional (free-text) salary information | nullable |
startDate | string | Employment date | 0–200 chars, nullable |
noteForCandidate | string | Information on the selection procedure | min 5 chars, nullable |
applicableTill | string (date) | Date of completion of the selection process | must be ≥ current date |
Job Advert Settings & Search Filters
| Field | Type | Description |
|---|---|---|
channel | array of integer | Job boards to publish to — codebook channel, 1 or 3 |
languageFlag | string | Language of the advert — en | de | sk | hu | cz |
categoryPositions | array of array of integer | Combination of working field and position — codebook categoryPositions, max 5 entries |
workplaceType | integer | Workplace type — codebook workplaceType, see Workplace Type Values |
location | string | Street name and number, 0–100 chars, nullable |
regions | array of integer | Place of work — codebook regions, count depends on workplaceType |
jobType | array | Contract type — codebook jobType |
educationLevels | array | Required education — codebook educationLevels |
specialization | string | Specialisation, field — 2–256 chars, nullable |
validForGraduate | integer | Suitable for a graduate — 0 = no, 1 = yes |
practiceYears | integer | Years of working experience |
practice | string | Experience in the position/sector — listed in some partner materials but absent from the request JSON Schema and all examples; support unconfirmed, verify before use |
skills | object | Required skills and levels — codebook skills, e.g. {"11": 4, "73": 9} |
languageConjunction | string | Conjunction of language skills — or | and |
drivingLicence | string | Type of driving licence |
onlyNew | integer | Auto-generated CV filter delivered by e-mail — 0 = yes, 2 = no |
numberOfOpenings | integer | Number of employees needed for this position/locality |
suitableForUkrainians | boolean | Suitable for Ukrainian refugees |
Workplace Type Values
workplaceType determines how location and regions must be filled in:
workplaceType | Meaning | location | regions |
|---|---|---|---|
1 | Distinct job location | Street/city — the region is matched automatically from it | Exactly 1 region ID |
2 | Requires travel (no fixed location) | Not used | Up to 3 region IDs (countries or regions) |
3 | Remote work | Not used | Not required |
4 | Partly remote / home office (on-site with home-office option) | Street/city, same as 1 | Exactly 1 region ID |
Salary Information (salaryInterval)
Disclosing gross (brutto) salary is a required part of the advert. Enter the basic wage, upper limit, currency, and period.
| Field | Type | Description | Constraints |
|---|---|---|---|
salaryInterval.min | number | Basic (minimum) wage | required, must be ≥ 1, must be ≤ max |
salaryInterval.max | number | Upper limit | required, must be ≥ 1 |
salaryInterval.maxHidden | boolean | Hide or show the upper limit | |
salaryInterval.period.id | integer | Pay period — codebook salaryPeriods: 1 = month, 2 = hour | |
salaryInterval.currency.id | integer | Currency — codebook currencies | see table below |
Supported currencies:
| Currency | ID |
|---|---|
EUR | 2 |
CZK | 4 |
HUF | 5 |
You may add free-text context in the separate salary field (“Additional salary information”).
Company Information (Recruitment / Media Companies Only)
Used only by recruitment or media companies advertising on behalf of a client.
| Field | Type | Description |
|---|---|---|
businessAreaId | integer | Client’s core business — codebook businessAreaId |
shortCompanyCharacteristics | string | Client’s brief description, min 5 chars, nullable |
Contact Person (Advert Submitter)
The contact person must already be registered in Profesia’s system. contactData is the primary identifier — see Contact Persons.
| Field | Type | Description |
|---|---|---|
contactData | integer | Contact person’s ID in Profesia’s system |
firstName | string | First name (optional info), 0–50 chars |
surname | string | Surname (optional info), 0–50 chars |
email | string (email) | E-mail (optional info) |
Application Method
Either specify a contact person’s e-mail (multiple e-mails per contact person are not supported) or provide a response-form URL.
| Field | Type | Description | Constraints |
|---|---|---|---|
applicationUrl | string (uri) | URL with a response form for this advert | pattern ^(https?|http?)://, max 512 chars |
applicationWithoutCv | boolean | Job ads that do not require a CV attachment when applying | Set to false if you process applications yourself via applicationUrl |
Job Posting Period
Default period is 1 month if postingPeriod is omitted.
| Job posting period | Value |
|---|---|
| 1 WEEK | 35 |
| 2 WEEKS | 36 |
| 1 MONTH | 37 |
| Field | Type | Description |
|---|---|---|
postingPeriod | integer | Job posting period — codebook postingPeriods, see table above |
Auto-Repeat-Post Mode
| Field | Type | Description |
|---|---|---|
autoRepeatPost | boolean | Repeat the same content multiple times, max once per week, within the defined posting period |
Custom Fields
Custom fields/categories are configured per client on request — see Custom Fields Codebook to check whether your company has any configured.
| Field | Type | Description |
|---|---|---|
customFields | object | Values for the company’s configured custom fields |
Known Source Discrepancies
Profesia’s own specification (Apiary blueprint and its JSON Schema) is internally inconsistent in a few places. This documentation follows the enforced JSON Schema and real request/response examples over the descriptive prose wherever they disagree, but the discrepancies are listed here for reference:
| Topic | Discrepancy | What this doc follows |
|---|---|---|
channel field name | The request schema property is named channels (plural), but the required list and every example use channel (singular) | channel — matches required and all working examples |
salaryInterval.period field name | The schema property is misspelled preriod, but required and every example use period | period — matches required and all working examples |
salaryInterval.max requirement | The JSON Schema’s required list includes both min and max, and most examples set both — but Profesia’s own “minimal required parameters” example omits max entirely (only min, currency, period) | Documented as required per schema, but the official minimal example suggests the backend may only enforce min. Verify empirically before relying on max always being mandatory. |
Length limits (position, refNr, specialization) | The descriptive parameter table lists 150 / 20 / 255 characters; the JSON Schema enforces 151 / 21 / 256 | JSON Schema limits (151 / 21 / 256) |
Insert New Job Offer
POST /{SECRET_HASH}/offer/{externalId}
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
externalId | path | External ID of the job offer in the partner’s system (min 4 chars) |
curl --location --request POST \
'http://www.profesia.sk/API/Import/SECRET_HASH/offer/Testing01' \
--header 'Content-Type: application/json' \
--data '{
"position": ".NET/C# developer",
"languageFlag": "en",
"channel": [1],
"jobTasks": "* Develop software applications in .NET/C\n* Participate in design, implementation and testing of software components",
"salaryInterval": {
"min": 2000,
"max": 2700,
"maxHidden": false,
"currency": { "id": 2 },
"period": { "id": 1 }
},
"workplaceType": 1,
"regions": [101],
"categoryPositions": [[5, 328], [5, 70]],
"jobType": [1, 4],
"educationLevels": [10, 7],
"contactData": 426263,
"numberOfOpenings": 1,
"postingPeriod": 35,
"autoRepeatPost": true,
"suitableForUkrainians": true
}'Response — 201 Created:
{
"externalId": "Testing01",
"offerId": 123456789,
"companyId": 51706,
"offerUrl": "https://www.profesia.sk/praca/test-company/O123456789",
"apiUrl": "http://www.profesia.sk/API/Import/SECRET_HASH/offer/Testing01",
"message": "offer was inserted",
"validTill": "2019-10-30",
"info": {
"general": {
"message": "Available 10 credit for publishing offers valid to 29.12.2019."
}
}
}Update Job Offer
PUT /{SECRET_HASH}/offer/{externalId}
Accepts the same job offer request body as insert. Uses the same required fields.
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
externalId | path | External ID of the job offer |
curl --location --request PUT \
'http://www.profesia.sk/API/Import/SECRET_HASH/offer/Testing01' \
--header 'Content-Type: application/json' \
--data '{
"position": ".NET/C# developer",
"refNr": "PR/013328",
"languageFlag": "en",
"channel": [1, 3],
"jobTasks": "* Develop software applications in .NET/C\n* Provide efficient code documentation",
"prerequisites": "* English - advanced\n* Experienced in .NET/C\n* Number of years of experience: 2",
"otherBenefits": "* International working environment\n* Flexible working time",
"salaryInterval": {
"min": 2000,
"max": 2700,
"maxHidden": false,
"currency": { "id": 2 },
"period": { "id": 1 }
},
"startDate": "By agreement",
"applicableTill": "2018-05-06",
"noteForCandidate": "To apply on-line please click the Send CV to the company button.",
"location": "Pribinova 19",
"regions": [101],
"categoryPositions": [[5, 328], [5, 70]],
"jobType": [1, 4],
"educationLevels": [10, 7],
"specialization": "Technical, IT",
"validForGraduate": 0,
"practiceYears": 3,
"skills": { "11": 4, "73": 9, "74": 7, "102": 5, "127": 5 },
"languageConjunction": "and",
"drivingLicence": "AB",
"businessAreaId": 2,
"shortCompanyCharacteristics": "Our customer is a leader in real-time energy and water monitoring...",
"contactData": 426263,
"firstName": "Peter",
"surname": "Smith",
"email": "peter.smith@notrealmail.eu",
"applicationUrl": "http://www.ats.eu/applications/hr-form/index/index/lang/en/id/A12456/",
"onlyNew": 2,
"numberOfOpenings": 1,
"suitableForUkrainians": true
}'Response — 200 OK:
{
"externalId": "Testing01",
"offerId": 123456789,
"companyId": 51706,
"offerUrl": "https://www.profesia.sk/praca/test-company/O123456789",
"apiUrl": "http://www.profesia.sk/API/Import/SECRET_HASH/offer/Testing01",
"message": "offer was updated.",
"validTill": "2020-05-03",
"info": {
"general": {
"message": "Available 10 credit for publishing offers valid to 12.12.2020."
}
}
}Get Job Offer Info
GET /{SECRET_HASH}/offer/{externalId}
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
externalId | path | External ID of the job offer |
Response — 200 OK:
{
"offerId": 123456789,
"linkToOffer": "https://www.profesia.sk/praca/test-company/O123456789",
"externalId": "Testing01",
"position": ".NET/C# developer",
"languageFlag": "en",
"channels": [1, 3],
"addDate": "2020-04-03",
"validTill": "2020-05-03",
"lastUpdated": "2020-04-03",
"published": true,
"jobTasks": "* Develop software applications in .NET/C",
"salaryInterval": {
"min": 2000,
"max": 2700,
"currency": "EUR",
"period": { "id": 1 },
"maxHidden": false
},
"regions": [101],
"categoryPositions": [[5, 70], [5, 328]],
"jobType": [1, 4],
"educationLevels": [7, 10],
"workplaceType": 1,
"numberOfOpenings": 1,
"applicationWithoutCv": false,
"suitableForUkrainians": true,
"customFields": [
{ "type": 2, "name": "extra_textfield", "value": "Praesent" },
{ "type": 4, "name": "extra_singleselect", "value": "4001" }
]
}The response mirrors the job offer request body plus read-only fields: offerId, linkToOffer, addDate, validTill, lastUpdated, and published.
Refresh (Repost) Job Offer
POST /{SECRET_HASH}/top-offer/{externalId}
Reposts an existing job offer with a new addDate and a new offerId, attracting new candidates without opening a separate job ad. Accepts the same job offer request body as insert/update.
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
externalId | path | External ID of the job offer |
Rules:
- Only an existing, currently published offer that has been live for at least 24 hours can be refreshed.
- Refreshing spends one new credit from the package.
- An offer already published or refreshed today cannot be refreshed again the same day — see 400 Bad Request.
curl --location --request POST \
'http://www.profesia.sk/API/Import/SECRET_HASH/top-offer/testing_0001' \
--header 'Content-Type: application/json' \
--data '{
"position": ".NET/C# developer",
"languageFlag": "en",
"channel": [1, 3],
"jobTasks": "* Develop software applications in .NET/C",
"salaryInterval": {
"min": 2000,
"max": 2700,
"maxHidden": false,
"currency": { "id": 2 },
"period": { "id": 1 }
},
"regions": [101],
"categoryPositions": [[5, 328], [5, 70]],
"jobType": [1, 4],
"educationLevels": [10, 7],
"contactData": 426263,
"numberOfOpenings": 1
}'Response — 200 OK:
{
"externalId": "testing_0001",
"offerId": 3214665,
"offerUrl": "http://test.profesia.sk/praca/test-company/O3214665",
"apiUrl": "http://test.profesia.sk/API/Import/SECRET_HASH/offer/testing_0001",
"message": "offer was refreshed",
"validTill": "2020-05-03",
"info": {
"general": {
"message": "Available 8 credit for publishing offers valid to 12.12.2020."
}
}
}Unpublish Job Offer
DELETE /{SECRET_HASH}/offer/{externalId}
| Parameter | In | Description |
|---|---|---|
SECRET_HASH | path | Company account hash |
externalId | path | External ID of the job offer |
curl --location --request DELETE \
'http://www.profesia.sk/API/Import/SECRET_HASH/offer/Testing01'Response — 200 OK:
{
"externalId": "Testing01",
"offerId": 123456789,
"companyId": 51706,
"offerUrl": "https://www.profesia.sk/praca/test-company/O123456789",
"apiUrl": "http://www.profesia.sk/API/Import/HASH/offer/Testing01",
"message": "offer was deleted"
}HTTP Status Codes
200 — OK
| Request | Body message |
|---|---|
GET — get info | Info about codebooks or job offer detail |
PUT — update job offer | "offer was updated" |
PUT — repost existing job offer | "offer was updated, offer was again published" |
DELETE — unpublish job offer | "offer was deleted" |
201 — Created
| Request | Body message |
|---|---|
POST — insert new job offer | "offer was inserted" |
400 — Bad Request
| Request | Situation | Body message |
|---|---|---|
| any | Malformed JSON | "Bad request: Error parsing JSON, malformed JSON" |
POST | Posting an existing/published offer | "Bad Request: insert - wrong externalId - offer already exist" |
POST | Refreshing an offer already published or refreshed today | "Bad request: the job offer has been published or refreshed today" |
POST/PUT | Wrong codebook value | "Bad request: insert/update - bad offer data integrity, offer not created/changed" |
POST/PUT | Bad value | "Value for field FIELD NAME is expected as integer." |
POST/PUT | Bad value (min) | "Value for field FIELD NAME is expected as integer greater as VALUE." |
POST/PUT | Bad value (max) | "Value for field FIELD NAME is expected as integer lower as VALUE." |
POST/PUT | Bad value (range) | "Value for field FIELD NAME is expected as integer between VALUES." |
POST/PUT | Bad value | "Invalid value VALUE for field FIELD NAME" |
POST/PUT | Too short text field (jobTasks, prerequisites, otherBenefits, noteForCandidate, shortCompanyCharacteristics) | "For field FIELD NAME is expected length value greater than 5 characters." |
POST/PUT | applicableTill not in the future | "For field applicableTill must be expected date greater or equals than YYYY-MM-DD HH:MM:SS" |
POST/PUT | Missing required field(s) | "insert - missing required field(s), offer not created" |
POST/PUT | Missing required field | "Field FIELD NAME is required." |
POST/PUT | Missing required non-empty string | "Field FIELD NAME is required as non-empty string." |
Required fields: channel, jobType, languageFlag, position, jobTasks, workplaceType, categoryPositions, regions, educationLevels, contactData, plus at least the basic salary in salaryInterval.
402 — Payment Required
| Request | Situation | Body message |
|---|---|---|
POST | Inserting a new job offer without credit | "Payment Required: offer abandoned. Check your credit, maybe credit exhausted" |
403 — Forbidden
| Request | Situation | Body message |
|---|---|---|
| any | Wrong hash | "Forbidden: wrong authentification hash" |
| any | No active API import service | "Company does not have active API import service" |
| any | Import disabled by administrator | "Import is disabled." |
404 — Not Found
| Request | Situation | Body message |
|---|---|---|
| any | Wrong externalId | "Not found: offerId no recognized, nothing we do" |
| any | externalId too short (< 4 chars) or wrong API endpoint | "Requested API endpoint: https://www.profesia.sk/Importoffer not found." |
Best Practices
- Validate against the JSON Schema before sending — catch structural errors client-side rather than via a
400round trip. - Resolve codebook IDs first — fetch the relevant codebook (
channel,regions,jobType,educationLevels,categoryPositions,skills, …) rather than hardcoding IDs, since they can change. - Track
externalId— it is your only handle to update, refresh, or unpublish an offer; it cannot be changed after insert. - Do not refresh the same day — an offer published or refreshed today cannot be refreshed again until the next day.
- Always disclose salary — at minimum, the basic wage (
salaryInterval.min) is legally required on every advert. - Monitor credit — check
/{SECRET_HASH}/company/creditPackagesbefore bulk inserting to avoid402 Payment Required.