Skip to Content
Job boardsProfesia Job Ads Import API

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.

Profesia.sk

The leading Slovak job board for experienced professionals and managers across all industries.

Visit Profesia.sk

Credits (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/Import

Every 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

MethodPurpose
POSTInsert a new job offer
PUTUpdate a job offer / repost (refresh) an existing job offer
DELETEUnpublish a job offer
GETGet 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 published or unpublished state — DELETE unpublishes it, it does not remove it.

Endpoints

MethodPathDescription
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/customFieldsList 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/contactDataRegistered contact persons
GET/{SECRET_HASH}/company/offerListList 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}

ParameterInDescription
SECRET_HASHpathCompany account hash
lngpath/querysk | 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}

ParameterInDescription
SECRET_HASHpathCompany account hash
codebookTypepathOne of: channel, languageFlag, contactData, jobType, workplaceType, regions, categoryPositions, educationLevels, skills, drivingLicence, salaryPeriods, currencies, businessAreaId, postingPeriods, customFields
lngpath/querysk | 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}

ParameterInDescription
SECRET_HASHpathCompany account hash
typeIdpath1 | 2
lngpath/querysk | 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

ParameterInDescription
SECRET_HASHpathCompany 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:

fieldTypeDescription
textFieldShort text
textAreaText area — description field
singleSelectDrop-down list — single select
selectizeSelectize — multi select
checkboxtrue/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

FieldTypeDescriptionConstraints
positionstringTitle of the job advert / offered position5–151 chars
refNrstringReference number in the partner’s system2–21 chars, nullable
jobTasksstringDescription of responsibilities and job tasksmin 5 chars, nullable
prerequisitesstringPrerequisites of an employeemin 5 chars, nullable
otherBenefitsstringBenefits offered by the employermin 5 chars, nullable
salarystringAdditional (free-text) salary informationnullable
startDatestringEmployment date0–200 chars, nullable
noteForCandidatestringInformation on the selection proceduremin 5 chars, nullable
applicableTillstring (date)Date of completion of the selection processmust be ≥ current date

Job Advert Settings & Search Filters

FieldTypeDescription
channelarray of integerJob boards to publish to — codebook channel, 1 or 3
languageFlagstringLanguage of the advert — en | de | sk | hu | cz
categoryPositionsarray of array of integerCombination of working field and position — codebook categoryPositions, max 5 entries
workplaceTypeintegerWorkplace type — codebook workplaceType, see Workplace Type Values
locationstringStreet name and number, 0–100 chars, nullable
regionsarray of integerPlace of work — codebook regions, count depends on workplaceType
jobTypearrayContract type — codebook jobType
educationLevelsarrayRequired education — codebook educationLevels
specializationstringSpecialisation, field — 2–256 chars, nullable
validForGraduateintegerSuitable for a graduate — 0 = no, 1 = yes
practiceYearsintegerYears of working experience
practicestringExperience in the position/sector — listed in some partner materials but absent from the request JSON Schema and all examples; support unconfirmed, verify before use
skillsobjectRequired skills and levels — codebook skills, e.g. {"11": 4, "73": 9}
languageConjunctionstringConjunction of language skills — or | and
drivingLicencestringType of driving licence
onlyNewintegerAuto-generated CV filter delivered by e-mail — 0 = yes, 2 = no
numberOfOpeningsintegerNumber of employees needed for this position/locality
suitableForUkrainiansbooleanSuitable for Ukrainian refugees

Workplace Type Values

workplaceType determines how location and regions must be filled in:

workplaceTypeMeaninglocationregions
1Distinct job locationStreet/city — the region is matched automatically from itExactly 1 region ID
2Requires travel (no fixed location)Not usedUp to 3 region IDs (countries or regions)
3Remote workNot usedNot required
4Partly remote / home office (on-site with home-office option)Street/city, same as 1Exactly 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.

FieldTypeDescriptionConstraints
salaryInterval.minnumberBasic (minimum) wagerequired, must be ≥ 1, must be ≤ max
salaryInterval.maxnumberUpper limitrequired, must be ≥ 1
salaryInterval.maxHiddenbooleanHide or show the upper limit
salaryInterval.period.idintegerPay period — codebook salaryPeriods: 1 = month, 2 = hour
salaryInterval.currency.idintegerCurrency — codebook currenciessee table below

Supported currencies:

CurrencyID
EUR2
CZK4
HUF5

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.

FieldTypeDescription
businessAreaIdintegerClient’s core business — codebook businessAreaId
shortCompanyCharacteristicsstringClient’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.

FieldTypeDescription
contactDataintegerContact person’s ID in Profesia’s system
firstNamestringFirst name (optional info), 0–50 chars
surnamestringSurname (optional info), 0–50 chars
emailstring (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.

FieldTypeDescriptionConstraints
applicationUrlstring (uri)URL with a response form for this advertpattern ^(https?|http?)://, max 512 chars
applicationWithoutCvbooleanJob ads that do not require a CV attachment when applyingSet to false if you process applications yourself via applicationUrl

Job Posting Period

Default period is 1 month if postingPeriod is omitted.

Job posting periodValue
1 WEEK35
2 WEEKS36
1 MONTH37
FieldTypeDescription
postingPeriodintegerJob posting period — codebook postingPeriods, see table above

Auto-Repeat-Post Mode

FieldTypeDescription
autoRepeatPostbooleanRepeat 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.

FieldTypeDescription
customFieldsobjectValues 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:

TopicDiscrepancyWhat this doc follows
channel field nameThe 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 nameThe schema property is misspelled preriod, but required and every example use periodperiod — matches required and all working examples
salaryInterval.max requirementThe 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 / 256JSON Schema limits (151 / 21 / 256)

Insert New Job Offer

POST /{SECRET_HASH}/offer/{externalId}

ParameterInDescription
SECRET_HASHpathCompany account hash
externalIdpathExternal 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.

ParameterInDescription
SECRET_HASHpathCompany account hash
externalIdpathExternal 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}

ParameterInDescription
SECRET_HASHpathCompany account hash
externalIdpathExternal 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.

ParameterInDescription
SECRET_HASHpathCompany account hash
externalIdpathExternal 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}

ParameterInDescription
SECRET_HASHpathCompany account hash
externalIdpathExternal 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

RequestBody message
GET — get infoInfo 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

RequestBody message
POST — insert new job offer"offer was inserted"

400 — Bad Request

RequestSituationBody message
anyMalformed JSON"Bad request: Error parsing JSON, malformed JSON"
POSTPosting an existing/published offer"Bad Request: insert - wrong externalId - offer already exist"
POSTRefreshing an offer already published or refreshed today"Bad request: the job offer has been published or refreshed today"
POST/PUTWrong codebook value"Bad request: insert/update - bad offer data integrity, offer not created/changed"
POST/PUTBad value"Value for field FIELD NAME is expected as integer."
POST/PUTBad value (min)"Value for field FIELD NAME is expected as integer greater as VALUE."
POST/PUTBad value (max)"Value for field FIELD NAME is expected as integer lower as VALUE."
POST/PUTBad value (range)"Value for field FIELD NAME is expected as integer between VALUES."
POST/PUTBad value"Invalid value VALUE for field FIELD NAME"
POST/PUTToo short text field (jobTasks, prerequisites, otherBenefits, noteForCandidate, shortCompanyCharacteristics)"For field FIELD NAME is expected length value greater than 5 characters."
POST/PUTapplicableTill not in the future"For field applicableTill must be expected date greater or equals than YYYY-MM-DD HH:MM:SS"
POST/PUTMissing required field(s)"insert - missing required field(s), offer not created"
POST/PUTMissing required field"Field FIELD NAME is required."
POST/PUTMissing 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

RequestSituationBody message
POSTInserting a new job offer without credit"Payment Required: offer abandoned. Check your credit, maybe credit exhausted"

403 — Forbidden

RequestSituationBody message
anyWrong hash"Forbidden: wrong authentification hash"
anyNo active API import service"Company does not have active API import service"
anyImport disabled by administrator"Import is disabled."

404 — Not Found

RequestSituationBody message
anyWrong externalId"Not found: offerId no recognized, nothing we do"
anyexternalId too short (< 4 chars) or wrong API endpoint"Requested API endpoint: https://www.profesia.sk/Importoffer not found."

Best Practices

  1. Validate against the JSON Schema before sending — catch structural errors client-side rather than via a 400 round trip.
  2. Resolve codebook IDs first — fetch the relevant codebook (channel, regions, jobType, educationLevels, categoryPositions, skills, …) rather than hardcoding IDs, since they can change.
  3. Track externalId — it is your only handle to update, refresh, or unpublish an offer; it cannot be changed after insert.
  4. Do not refresh the same day — an offer published or refreshed today cannot be refreshed again until the next day.
  5. Always disclose salary — at minimum, the basic wage (salaryInterval.min) is legally required on every advert.
  6. Monitor credit — check /{SECRET_HASH}/company/creditPackages before bulk inserting to avoid 402 Payment Required.
Last updated on