REST API

Searches job offers by text and filters

Full-text search over offers.
Request:
GET https://isitfair.pl/api/v1/offers/search
Params:
(string) searchsearch text, e.g. city + technology, up to 300 characters. A full offer URL from the job board (as in offer_href) finds exactly that offer.
(string) offer_statusjob offer status.
activeactive job offers.
expiredexpired job offers.
Response:
Up to 20 offer objects in data. Active offers are sorted with the fair ones first (fair offer from a fair company), then from the newest.
{
  "data": [
    { "offer_uuid": "72bbaa55-e6fb-4b1d-b697-1867d5b4abb6", ... },
    ...
  ]
}

Returns a list of job offersBusiness

Cursor-paginated access to offers.
Request:
GET https://isitfair.pl/api/v1/offers
Headers:
Authorization: Bearer {api_key}
Params:
(string) offer_status [optional]job offer status; all offers when omitted.
activeactive job offers.
expiredexpired job offers.
(string) offer_source [optional]job offer source.
pracuj.pljob offers from the pracuj.pl platform.
justjoin.itjob offers from the justjoin.it platform.
nofluffjobs.comjob offers from the nofluffjobs.com platform.
(string) offer_category [optional]job offer category.
phpjob offers from the PHP category.
pythonjob offers from the Python category.
javajob offers from the Java category.
javascriptjob offers from the JavaScript category.
htmljob offers from the HTML category.
sqljob offers from the SQL category.
datajob offers from the Data category.
analyticsjob offers from the Analytics category.
cjob offers from the C category.
gojob offers from the Go category.
rubyjob offers from the Ruby category.
netjob offers from the .NET category.
mobilejob offers from the Mobile category.
adminjob offers from the Admin category.
devopsjob offers from the DevOps category.
securityjob offers from the Security category.
aijob offers from the AI category.
pmjob offers from the PM category.
testingjob offers from the Testing category.
architecturejob offers from the Architecture category.
erpjob offers from the ERP category.
otherjob offers from the Other category.
supportjob offers from the Support category.
uxjob offers from the UX category.
gamejob offers from the Game category.
scalajob offers from the Scala category.
(string) company_uuid [optional]job offers of a single company.
(string) sort [optional]sort field.
offer_idcreation order (default).
offer_updated_atlast update time.
(string) order [optional]sort direction.
ascascending (default).
descdescending.
(int) limit [optional]records per page, from 1 to 500 (default 100).
(string) cursor [optional]next_cursor from the previous response.
Response:
One page of offer objects in data. Request links.next until meta.next_cursor is null to read all offers.
{
  "data": [
    { "offer_uuid": "72bbaa55-e6fb-4b1d-b697-1867d5b4abb6", ... },
    ...
  ],
  "links": {
    "first": null,
    "last": null,
    "prev": null,
    "next": "https://isitfair.pl/api/v1/offers?limit=100&cursor=eyJvZmZlcl9pZCI6MTAwLCJfcG9pbnRzVG9OZXh0SXRlbXMiOnRydWV9"
  },
  "meta": {
    "path": "https://isitfair.pl/api/v1/offers",
    "per_page": 100,
    "next_cursor": "eyJvZmZlcl9pZCI6MTAwLCJfcG9pbnRzVG9OZXh0SXRlbXMiOnRydWV9",
    "prev_cursor": null
  }
}
(array) dataoffer objects, at most limit per page.
(string|null) links.nextaddress of the next page, with the same params; null on the last page.
(string|null) links.prevaddress of the previous page; null on the first page.
(null) links.first, links.lastalways null (cursor pagination has no page numbers).
(string) meta.pathaddress of the endpoint, without params.
(int) meta.per_pagepage size, the same as limit.
(string|null) meta.next_cursorvalue of the cursor param for the next page; null on the last page.
(string|null) meta.prev_cursorvalue of the cursor param for the previous page; null on the first page.

Offer object

A job offer, returned by both endpoints.
{
  "offer_uuid": "72bbaa55-e6fb-4b1d-b697-1867d5b4abb6",
  "offer_source": "justjoin.it",
  "offer_category": "php",
  "offer_title": "PHP Developer",
  "offer_href": "https://justjoin.it/job-offer/example-company-php-developer-warszawa-php",
  "offer_city": "Warszawa",
  "offer_remote_available": false,
  "offer_technologies": [
    "PHP",
    "Laravel",
    "MySQL"
  ],
  "offer_salary_interval": "monthly",
  "offer_salary_min": 18000,
  "offer_salary_max": 24000,
  "offer_salary_currency": "PLN",
  "offer_salary_qualifies": false,
  "offer_duration": 12,
  "offer_duration_qualifies": true,
  "offer_is_fair": false,
  "offer_status": "expired",
  "offer_published_at": "2026-06-16T11:17:57.000000Z",
  "offer_expired_at": "2026-07-12T14:23:52.000000Z",
  "offer_created_at": "2026-06-16T11:20:04.000000Z",
  "offer_updated_at": "2026-07-12T14:23:52.000000Z",
  "company": {
    "company_uuid": "5846c58c-b13d-4eb5-ba54-1103f7719abb",
    "company_is_fair": 0,
    "company_expired_offers_count": 11,
    "company_active_fair_offers_count": 1,
    "company_active_unfair_offers_count": 8,
    "company_name": "Example Company",
    "company_vat": "PL1234567890",
    "company_logo": "logos/5846c58c-b13d-4eb5-ba54-1103f7719abb.png",
    "company_active_unfair_offers_percentage": 89,
    "company_active_unfair_offers_percentage_qualifies": false,
    "company_vat_display": {
      "label": "NIP",
      "value": "1234567890"
    }
  }
}
Fields:
(string) offer_uuidoffer identifier; the offer page is https://isitfair.pl/o/{offer_uuid}.
(string) offer_sourcejob board the offer comes from: pracuj.pl, justjoin.it or nofluffjobs.com.
(string) offer_categorycategory, one of the offer_category values listed above.
(string) offer_titlejob title.
(string) offer_hrefaddress of the offer on the job board.
(string|null) offer_citycity; null when the job board gives none, e.g. for a fully remote job.
(bool) offer_remote_availabletrue when the job can be done fully remotely; hybrid work alone does not count.
(string[]) offer_technologiesskills required by the employer, up to 10; an empty list when the job board gives none.
(string|null) offer_salary_intervalpay period: hourly, daily, weekly, monthly or yearly; null when the salary is not disclosed.
(int|null) offer_salary_minlower end of the salary range for that pay period, as published on the job board (not converted to a monthly amount); null when the salary is not disclosed.
(int|null) offer_salary_maxupper end of the salary range; null when the salary is not disclosed.
(string|null) offer_salary_currencycurrency of offer_salary_min and offer_salary_max as an ISO 4217 code, e.g. PLN; null when the salary is not disclosed.
(string|null) offer_formatted_salary_minoffer_salary_min formatted for display, e.g. "18 000". Only in /api/v1/offers/search.
(string|null) offer_formatted_salary_maxoffer_salary_max formatted for display. Only in /api/v1/offers/search.
(bool) offer_salary_qualifiestrue when the salary is disclosed and offer_salary_max is at most 10% above offer_salary_min.
(int) offer_durationnumber of days on which the offer was seen active on the job board.
(bool) offer_duration_qualifiestrue when offer_duration is 30 days or less.
(bool) offer_is_fairtrue when both offer_salary_qualifies and offer_duration_qualifies are true.
(string) offer_statusactive or expired.
(string) offer_published_atwhen the offer was first seen on the job board.
(string|null) offer_expired_atwhen the offer was found expired (not seen on the job board for 2 days); null for an active offer.
(string) offer_created_atwhen the offer was added to the database. Only in /api/v1/offers.
(string) offer_updated_atwhen the offer was last changed; used by sort=offer_updated_at. Only in /api/v1/offers.
(object) companythe company that published the offer, see Company object below.
Dates are ISO 8601 strings in UTC. Salary amounts are in the currency given in offer_salary_currency. /api/v1/offers/search returns offer_salary_qualifies, offer_duration_qualifies and offer_is_fair as 1 / 0 instead of true / false.

Company object

The company that published the offer, returned in the company field of every offer.
Fields:
(string) company_uuidcompany identifier, accepted by the company_uuid param.
(string) company_namecompany name.
(string|null) company_vatVAT number with the country prefix, e.g. PL1234567890; null when unknown.
(object|null) company_vat_displaythe same number for display: label ("NIP" for a Polish number, otherwise "VAT number") and value (a Polish number without the PL prefix); null when unknown.
(string|null) company_logologo path relative to https://isitfair.pl/storage/; null when there is no logo.
(int) company_expired_offers_countnumber of expired offers of the company.
(int) company_active_fair_offers_countnumber of active offers that are fair.
(int) company_active_unfair_offers_countnumber of active offers that are not fair.
(int) company_active_unfair_offers_percentageshare of unfair offers among the active ones, from 0 to 100.
(bool) company_active_unfair_offers_percentage_qualifiestrue when that share is below 20.
(int) company_is_fair1 when the company is fair (less than 20% of its active offers are unfair), 0 otherwise.