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) search | search 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_status | job offer status. | ||||
|
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. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
| (string) offer_source [optional] | job offer source. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
| (string) offer_category [optional] | job offer category. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
| (string) company_uuid [optional] | job offers of a single company. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| (string) sort [optional] | sort field. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
| (string) order [optional] | sort direction. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||
| (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) data | offer objects, at most limit per page. |
| (string|null) links.next | address of the next page, with the same params; null on the last page. |
| (string|null) links.prev | address of the previous page; null on the first page. |
| (null) links.first, links.last | always null (cursor pagination has no page numbers). |
| (string) meta.path | address of the endpoint, without params. |
| (int) meta.per_page | page size, the same as limit. |
| (string|null) meta.next_cursor | value of the cursor param for the next page; null on the last page. |
| (string|null) meta.prev_cursor | value 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_uuid | offer identifier; the offer page is https://isitfair.pl/o/{offer_uuid}. |
| (string) offer_source | job board the offer comes from: pracuj.pl, justjoin.it or nofluffjobs.com. |
| (string) offer_category | category, one of the offer_category values listed above. |
| (string) offer_title | job title. |
| (string) offer_href | address of the offer on the job board. |
| (string|null) offer_city | city; null when the job board gives none, e.g. for a fully remote job. |
| (bool) offer_remote_available | true when the job can be done fully remotely; hybrid work alone does not count. |
| (string[]) offer_technologies | skills required by the employer, up to 10; an empty list when the job board gives none. |
| (string|null) offer_salary_interval | pay period: hourly, daily, weekly, monthly or yearly; null when the salary is not disclosed. |
| (int|null) offer_salary_min | lower 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_max | upper end of the salary range; null when the salary is not disclosed. |
| (string|null) offer_salary_currency | currency 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_min | offer_salary_min formatted for display, e.g. "18 000". Only in /api/v1/offers/search. |
| (string|null) offer_formatted_salary_max | offer_salary_max formatted for display. Only in /api/v1/offers/search. |
| (bool) offer_salary_qualifies | true when the salary is disclosed and offer_salary_max is at most 10% above offer_salary_min. |
| (int) offer_duration | number of days on which the offer was seen active on the job board. |
| (bool) offer_duration_qualifies | true when offer_duration is 30 days or less. |
| (bool) offer_is_fair | true when both offer_salary_qualifies and offer_duration_qualifies are true. |
| (string) offer_status | active or expired. |
| (string) offer_published_at | when the offer was first seen on the job board. |
| (string|null) offer_expired_at | when the offer was found expired (not seen on the job board for 2 days); null for an active offer. |
| (string) offer_created_at | when the offer was added to the database. Only in /api/v1/offers. |
| (string) offer_updated_at | when the offer was last changed; used by sort=offer_updated_at. Only in /api/v1/offers. |
| (object) company | the 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_uuid | company identifier, accepted by the company_uuid param. |
| (string) company_name | company name. |
| (string|null) company_vat | VAT number with the country prefix, e.g. PL1234567890; null when unknown. |
| (object|null) company_vat_display | the 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_logo | logo path relative to https://isitfair.pl/storage/; null when there is no logo. |
| (int) company_expired_offers_count | number of expired offers of the company. |
| (int) company_active_fair_offers_count | number of active offers that are fair. |
| (int) company_active_unfair_offers_count | number of active offers that are not fair. |
| (int) company_active_unfair_offers_percentage | share of unfair offers among the active ones, from 0 to 100. |
| (bool) company_active_unfair_offers_percentage_qualifies | true when that share is below 20. |
| (int) company_is_fair | 1 when the company is fair (less than 20% of its active offers are unfair), 0 otherwise. |