{
  "openapi": "3.0.1",
  "info": {
    "title": "JustJoin.it Scraper",
    "description": "Scrape IT jobs from JustJoin.it, Poland's tech job board. Returns title, company, city, tech stack with skill levels, B2B/UoP salaries, remote/hybrid mode, languages, office address and expiry date. Sort by newest. Pay per result.",
    "version": "1.2",
    "x-build-id": "foVBBuJSbx7S9ozvJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/santamaria-automations~justjoinit-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-santamaria-automations-justjoinit-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/santamaria-automations~justjoinit-scraper/runs": {
      "post": {
        "operationId": "runs-sync-santamaria-automations-justjoinit-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/santamaria-automations~justjoinit-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-santamaria-automations-justjoinit-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "searchQueries": {
            "title": "Search Keywords",
            "type": "array",
            "description": "One or more job-title or tech keywords to search on JustJoin.it (e.g. 'backend developer', 'Python', 'React', 'DevOps'). Each keyword runs its own server-side search (with its own sort, date window and pagination) and results are kept separate per query. Leave empty only when using startUrls.",
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerQuery": {
            "title": "Max Results per Query",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum results per search keyword. The actor pages through search results (50 offers per page) until this cap is reached.",
            "default": 5
          },
          "maxResults": {
            "title": "Max Total Results",
            "minimum": 1,
            "type": "integer",
            "description": "Total job cap across all queries. JustJoin.it has around 10,000 active IT listings at any time.",
            "default": 5
          },
          "maxConcurrency": {
            "title": "Max Concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Number of detail pages fetched in parallel when includeJobDetails is enabled. Each worker uses an independent request session with rotating headers. Increase freely to speed up large runs.",
            "default": 5
          },
          "searchUrls": {
            "title": "Search URLs (optional)",
            "type": "array",
            "description": "Direct JustJoin.it job URLs to scrape. Paste individual job links (https://justjoin.it/job-offer/...) or category pages. Accepts both plain strings and Apify requestListSources objects.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (optional)",
            "type": "array",
            "description": "Alternative URL input. Supports both plain strings and Apify requestListSources objects with url/method fields.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "country": {
            "title": "Country",
            "enum": [
              "all",
              "PL",
              "DE",
              "NL",
              "CZ",
              "SK",
              "UA",
              "GB"
            ],
            "type": "string",
            "description": "Filter results by country. JustJoin.it primarily covers Poland (PL), with some EU remote roles. Use 'all' for all countries.",
            "default": "all"
          },
          "city": {
            "title": "City (optional)",
            "type": "string",
            "description": "Filter by city name (e.g. 'Warszawa', 'Krakow', 'Wroclaw', 'Gdansk'). Applied server-side through the city listing page when JustJoin.it has one, otherwise as a post-filter. Leave blank for all cities."
          },
          "seniority": {
            "title": "Seniority Level (optional)",
            "enum": [
              "",
              "Junior",
              "Mid",
              "Senior",
              "Lead"
            ],
            "type": "string",
            "description": "Filter by seniority level extracted from the job title. Leave blank for all levels.",
            "default": ""
          },
          "techStack": {
            "title": "Tech Stack Filter (optional)",
            "type": "array",
            "description": "Filter by tech category keywords in the job URL slug (e.g. ['python', 'javascript', 'devops', 'data']). Case-insensitive substring match.",
            "items": {
              "type": "string"
            }
          },
          "contractType": {
            "title": "Contract Type (optional)",
            "enum": [
              "Any",
              "B2B",
              "UoP"
            ],
            "type": "string",
            "description": "Filter by contract type, applied server-side (employment-type filter). B2B = freelance/invoice, UoP = Polish employment contract (permanent). Offers that do not disclose a contract type are still included by the site. Any = no filter.",
            "default": "Any"
          },
          "remoteOnly": {
            "title": "Remote only",
            "type": "boolean",
            "description": "When enabled, only returns fully remote positions (applied server-side with the workplace=remote filter). JustJoin.it has a large share of remote Polish IT jobs.",
            "default": false
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "newest",
              "relevance",
              "salary",
              "published",
              "salaryDesc"
            ],
            "type": "string",
            "description": "How JustJoin.it orders results. Applied by the site itself (server-side), not re-sorted by the actor. 'newest' is recommended for scheduled scrapes. 'relevance' uses the site default (relevance-ranked when a keyword is set). 'salary' returns the highest salaries first. 'published' and 'salaryDesc' are legacy aliases kept for backward compatibility. Promoted or pinned offers may appear at the top with an older date.",
            "default": "newest"
          },
          "postedWithinDays": {
            "title": "Posted within (days)",
            "minimum": 0,
            "type": "number",
            "description": "Only return jobs posted within this many days. The site filters by 1, 7, 14 or 30 days: your value is rounded up to the nearest of those buckets, then an exact posted_at cutoff is applied. Values above 30, 0 or empty mean no date filter."
          },
          "includeJobDetails": {
            "title": "Include full job details",
            "type": "boolean",
            "description": "Fetch each job's full description, HTML, and markdown. Also extracts contact emails, phones, and URLs from the job description. Adds $0.005 per row (detail event).",
            "default": false
          },
          "titleFilter": {
            "title": "Filter by Job Title",
            "type": "string",
            "description": "Comma-separated list of terms to match against job titles (case-insensitive OR-match). Only jobs whose title contains one of the terms are emitted. Non-matching rows are dropped before the detail-fetch event, so you don't pay for filtered-out jobs. Leave empty to disable.",
            "default": ""
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}