Skillshot.pl Jobs Scraper: game industry offers · Apify
Skillshot.pl Jobs Scraper avatar

Skillshot.pl Jobs Scraper

Pricing

from $0.34 / 1,000 job results

Go to Apify Store
Skillshot.pl Jobs Scraper

Skillshot.pl Jobs Scraper

Scrapes video-game industry job offers from skillshot.pl, the Polish gamedev job board: title, company, locations, category and description. Search by keyword, filter by category, or read one offer. Same output schema as our other job portal actors.

Pricing

from $0.34 / 1,000 job results

Rating

0.0

(0)

Developer

DataWatcher

DataWatcher

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

14 hours ago

Last modified

Categories

Features

Limited permissions

Share

Skillshot Jobs Scraper

Use this actor to scrape game-industry job data from skillshot.pl and get it as JSON, CSV or Excel, or through the Apify API. Each row holds the salaries, contract types, work type and experience levels of an offer, plus its company and city. Turn on one switch to add the full offer description.

🔎 What does Skillshot Jobs Scraper do?

  • Searches skillshot.pl by keyword (the site matches title, company and city) and by category.
  • Starts from a listing URL, an offer URL or a company page (/users/N, with its offers).
  • Applies your city, contract type, work type, experience and salary filters to the rows it reads, because the site has no such filters.
  • Reads each offer's own page when you turn on extractFullDetails: description, skills, benefits, languages and company details.
  • Reads salaries from the offer text. A range such as "od 7.000 zł do 10.000 zł netto na B2B" becomes a minimum and a maximum.
  • Keeps a rate per unit of output (for example 50 USD per minute of finished material) in extensions.payRates, not as a salary.
  • Takes the work type from the location text, so "Zdalnie" becomes remote.

⭐ Why this one

1️⃣ One schema across job portals. All our job actors share one output schema and one input schema. Build your pipeline once: our other job actors (Nofluffjobs, Aplikuj, Bluelionjob, Bulldogjob, Hollylist, Jobs-cz, Just Join IT, Pracuj, Reed, RocketJobs.pl, theprotocol.it) take the same input and return the same fields, so adding a portal means changing the actor name, not your code.

  • Salaries from the offer text. Ranges in the description become min and max values with currency, period and grossNet.
  • Filters the site does not have. City, contract type, work type, experience and salary are applied to the parsed rows.
  • Several ways in. Give keywords, a category, a listing URL, an offer URL or a company page.
  • Offer pages only when you ask. Listing rows cost $0.40 per 1,000. Offer pages are an extra charge, only when extractFullDetails is on.
  • Same fields as our other job actors. Rows from different portals fit one table.

🚀 How to scrape Skillshot jobs

  1. Open the actor on Apify and click Try for free.
  2. Enter a keyword such as artist, or paste a skillshot.pl listing, offer or company URL, and set any filters you need.
  3. Click Start.
  4. Download the Skillshot jobs data as JSON, CSV or Excel from the Output tab, or fetch it with the Apify API.

Data

This actor returns only what the site shows publicly at run time. We don't store or keep that data and are not its controller — you decide how you use it.

This actor is not affiliated with or endorsed by skillshot.pl. Rows contain the public offer text and the company name the employer published.

🤖 Use with AI agents (MCP)

AI assistants (Claude, ChatGPT, Cursor…) can run this actor through Apify's MCP server. Connect the server in your assistant, then ask, for example:

Scrape game-industry jobs from skillshot.pl for artists in Warszawa that show a salary, with full details, and list the pay ranges by contract type.

🔌 Run it your way

  • Schedule it with Apify schedules.
  • Call it from the Apify API and its clients (Python, JavaScript).
  • Connect it to Make, n8n, Zapier, webhooks or Google Sheets.
  • Ask an AI agent to run it: see Use with AI agents (MCP).

⚙️ Input

Every field is optional. With no input the actor reads the newest offers, up to maxResults.

{
"searchQueries": ["artist"],
"locations": ["Warszawa"],
"workType": ["remote", "hybrid"],
"withSalaryOnly": true,
"extractFullDetails": true,
"maxResults": 50
}
FieldDefaultNotes
maxResults50Maximum number of offers returned, in total. 0 means no limit. The free plan returns up to 1,000 per run.
startUrlsemptyA listing URL, an offer URL or a company page URL, read instead of a search. Your filters still apply. searchQueries is not applied to them (a warning says so).
searchQueriesemptyOne keyword per line. The site matches title, company and city. A games role word like artist or designer works; python finds nothing.
locationsemptyCity names. Accents and case do not matter (Krakow = Kraków). An unknown city gives a warning and no search for it.
categoriesemptygamedev, testing, project-management.
contractTypesemptyemployment, b2b, mandate, specific-task, internship.
workTypeemptyremote, hybrid, onsite, mobile.
experienceemptyintern, junior, mid, senior, expert, lead, manager, executive.
withSalaryOnlyfalseKeep only offers that show a salary. Pay is only in the offer text, so turn on extractFullDetails with it.
extractFullDetailsfalseRead each offer's own page for the description, skills, benefits, languages and company details. An offer URL is read in full either way.
maxConcurrency1Searches and offer pages processed in parallel (1 to 10).
maxRequestsPerMinute60Request rate for the whole run.
proxyConfigurationno proxyProxy settings, useful when many offer pages are read.
maxRequestRetries2Retries after a failed request (0 to 10).

Only these three category values exist on this site, so the input offers only them.

Filters on city, work type, contract type and experience are applied to the listing first. A listing row that cannot confirm a filter is left out, and the run warns you with the count. Turn on extractFullDetails to check those rows on each offer's page.

🧭 Input modes: what you give, what you get

Six ways to start a run. Each one works with extractFullDetails off (listing data) or on (listing data plus the offer page).

ModeYou giveRowsOffer pages read
1. Default searchnothingNewest offers, up to maxResultsOnly with extractFullDetails
2. KeywordssearchQueriesOffers matching the keywordsOnly with extractFullDetails
3. Filtered searchlocations, experience, contractTypes, workType, categoriesOffers that match the filtersOnly with extractFullDetails, or when a filter needs it
4. Listing URLa skillshot.pl listing URL in startUrlsThe offers on that listingOnly with extractFullDetails
5. Offer URLone offer URL in startUrlsThat offerYes
6. Listing URL, offer URL and filtersboth URLs in startUrls, plus filtersThe listing rows plus that offer, filteredThe offer URL yes; the listing rows only with extractFullDetails

A company page (/users/N) works like a listing URL and returns that company's offers.

{
"maxResults": 3,
"extractFullDetails": false
}

🔹 2. Keywords

{
"maxResults": 3,
"searchQueries": ["artist"],
"extractFullDetails": true
}
{
"maxResults": 3,
"locations": ["Warszawa"],
"experience": ["mid", "senior"],
"contractTypes": ["b2b", "employment"],
"workType": ["remote", "hybrid"],
"extractFullDetails": true
}

🔹 4. Listing URL

{
"maxResults": 3,
"startUrls": [{ "url": "https://www.skillshot.pl/jobs" }],
"extractFullDetails": false
}

🔹 5. Offer URL

{
"startUrls": [
{ "url": "https://www.skillshot.pl/jobs/40060-sound-designer-tworca-ambientu-do-gry-rpg-at-rocke" }
]
}

🔹 6. Listing URL, offer URL and filters

{
"maxResults": 3,
"startUrls": [
{ "url": "https://www.skillshot.pl/jobs" },
{ "url": "https://www.skillshot.pl/jobs/40060-sound-designer-tworca-ambientu-do-gry-rpg-at-rocke" }
],
"contractTypes": ["mandate"],
"extractFullDetails": false
}

With start URLs, searchQueries is not applied. Your other filters still drop the rows that do not match.

📦 Output: Skillshot jobs data

One row per job offer. The row below is shortened: long text ends with "...", and some fields are left out. Salaries carry contractType, currency, grossNet, min, max, period and isOriginal.

{
"recordType": "job",
"source": "skillshot",
"id": "40059",
"url": "https://www.skillshot.pl/jobs/40059-2d-generalist-at-gamefluence",
"title": "2D Generalist",
"company": {
"id": "17568",
"name": "Gamefluence",
"url": "https://gamefluence.io",
"profileUrl": "https://www.skillshot.pl/users/17568"
},
"locations": [],
"workType": [
{ "type": "remote", "remotePercent": 100, "remoteCountries": [] }
],
"categories": [
{ "value": "gamedev", "original": "Grafika i animacja" }
],
"experience": { "levels": [] },
"contractTypes": [
{ "value": "employment", "original": "Praca stała", "source": "portal" },
{ "value": "b2b", "original": "B2B", "source": "description" }
],
"salaries": [
{
"contractType": "b2b",
"currency": "PLN",
"grossNet": "net",
"min": 7000,
"max": 10000,
"period": "month",
"isOriginal": true
}
],
"benefits": ["Elastyczne godziny pracy, z core hours 10:00-15:00"],
"description": {
"text": "Oferta pracy: 2D Generalist\nPoszukujemy wsparcia dla naszego rozwijającego się zespołu..."
},
"extensions": {
"contractLabel": "Praca stała",
"locationText": "Zdalnie",
"views": 719,
"accountType": "Pro",
"payRates": []
}
}

Missing data is null, never a guess.

Run status. After each run, open the run's key-value store (Storage tab) to see how it went:

  • RUN_HEALTH: ok, or degraded with the reason (no rows, a failed request, a warning, or a row that broke a data rule).
  • RUN_SUMMARY: the run's numbers: rows, requests, retries, failed requests, warnings and billed events.

💰 Pricing (Pay-Per-Event)

EventPriceTrigger
Job result (job-scraped)$0.40 per 1,000 eventsOne job offer returned by the Actor.
Job details (job-details-scraped)$1.50 per 1,000 eventsAdditional charge for a job offer whose detail page was read.

There is no start fee. With extractFullDetails off you pay only for job results. With it on, each offer is also charged as a job detail.

Free plan: each run returns up to 1,000 results.

🎯 Use cases

  • Track game-industry vacancies. Follow new offers and their employers over time.
  • Compare compensation. Read salary ranges by contract type, city and work type.
  • Feed a job board. Merge Skillshot rows with other job portals in one table.
  • Recruiter sourcing. Find studios hiring for a role in a city, remote or hybrid.

🩺 If a run fails

The run health (the RUN_HEALTH record, RUN_SUMMARY and the last line of the log) names the cause, for example site down: list request answered 500 x3. Find that start of the message in the table.

Error in the log / run healthWhat it meansWhat you do
site down: <request> answered 500, 502-504, 520-526The site is offline or has a fault. The actor waits longer between tries, then stops the run.Try again later.
blocked: <request> answered 401, 403, 1020 or a captcha pageThe site refused the request or showed a captcha page.The actor already retries once through the Apify proxy. If it still fails, turn on the Apify proxy in the input (use the RESIDENTIAL group if it is already on).
rate limited: <request> answered 429The site asks for fewer requests. The actor waits and slows down by itself.If it keeps happening, lower maxRequestsPerMinute.
gone: <request> answered 404, 410The page or offer was removed. The actor skips it and it is not charged.Nothing; this is normal.
network error: <request> failed with timeout (or connection error, DNS error)A timeout or a broken connection. The actor retries with a pause.Try again later.
wrong answer: <request> returned HTML instead of JSON (or an empty body)The site answered with a page that is not data (HTML instead of JSON, an empty body). The site has probably changed.Report it in the Issues tab; we fix it.

❓ FAQ

How many jobs can I scrape on the free plan?

Up to 1,000 results per run. maxResults defaults to 50, so raise it when you want more.

How do I export Skillshot jobs to Excel or CSV?

Run the actor, open the Output tab and pick Excel or CSV in the export options. JSON, XML and HTML are there too, and the Apify API returns the same data.

Does it return salary data?

Yes, when the offer text states pay. Many offers state none, and then salaries is empty. In the approved sample, 4 of 10 rows had a salary. Pay is read from the offer text, so use extractFullDetails when you need it.

Why did my filtered run return fewer rows than expected?

City, work type, contract type and experience are applied to the listing first. A listing row that cannot confirm the filter is left out, and the run warns you with the count. Turn on extractFullDetails to check those rows on each offer's page.

Can I combine it with other portals?

Yes. All our job actors share one output schema and one input schema, so rows from different portals fit one table. See the list below.

🔗 Other Polish job scrapers (same schema)

🔗 Other job scrapers (same schema)

💬 Feedback and custom work

Need another portal, a field or a custom feed? Open an issue on the Issues tab.