Skillshot.pl Jobs Scraper
Pricing
from $0.34 / 1,000 job results
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
14 hours ago
Last modified
Categories
Features
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
minandmaxvalues with currency, period andgrossNet. - 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
extractFullDetailsis on. - Same fields as our other job actors. Rows from different portals fit one table.
🚀 How to scrape Skillshot jobs
- Open the actor on Apify and click Try for free.
- Enter a keyword such as
artist, or paste a skillshot.pl listing, offer or company URL, and set any filters you need. - Click Start.
- 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}
| Field | Default | Notes |
|---|---|---|
maxResults | 50 | Maximum number of offers returned, in total. 0 means no limit. The free plan returns up to 1,000 per run. |
startUrls | empty | A 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). |
searchQueries | empty | One keyword per line. The site matches title, company and city. A games role word like artist or designer works; python finds nothing. |
locations | empty | City names. Accents and case do not matter (Krakow = Kraków). An unknown city gives a warning and no search for it. |
categories | empty | gamedev, testing, project-management. |
contractTypes | empty | employment, b2b, mandate, specific-task, internship. |
workType | empty | remote, hybrid, onsite, mobile. |
experience | empty | intern, junior, mid, senior, expert, lead, manager, executive. |
withSalaryOnly | false | Keep only offers that show a salary. Pay is only in the offer text, so turn on extractFullDetails with it. |
extractFullDetails | false | Read each offer's own page for the description, skills, benefits, languages and company details. An offer URL is read in full either way. |
maxConcurrency | 1 | Searches and offer pages processed in parallel (1 to 10). |
maxRequestsPerMinute | 60 | Request rate for the whole run. |
proxyConfiguration | no proxy | Proxy settings, useful when many offer pages are read. |
maxRequestRetries | 2 | Retries 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).
| Mode | You give | Rows | Offer pages read |
|---|---|---|---|
| 1. Default search | nothing | Newest offers, up to maxResults | Only with extractFullDetails |
| 2. Keywords | searchQueries | Offers matching the keywords | Only with extractFullDetails |
| 3. Filtered search | locations, experience, contractTypes, workType, categories | Offers that match the filters | Only with extractFullDetails, or when a filter needs it |
| 4. Listing URL | a skillshot.pl listing URL in startUrls | The offers on that listing | Only with extractFullDetails |
| 5. Offer URL | one offer URL in startUrls | That offer | Yes |
| 6. Listing URL, offer URL and filters | both URLs in startUrls, plus filters | The listing rows plus that offer, filtered | The 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.
🔹 1. Default search
{"maxResults": 3,"extractFullDetails": false}
🔹 2. Keywords
{"maxResults": 3,"searchQueries": ["artist"],"extractFullDetails": true}
🔹 3. Filtered search
{"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, ordegradedwith 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)
| Event | Price | Trigger |
|---|---|---|
Job result (job-scraped) | $0.40 per 1,000 events | One job offer returned by the Actor. |
Job details (job-details-scraped) | $1.50 per 1,000 events | Additional 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 health | What it means | What you do |
|---|---|---|
site down: <request> answered 500, 502-504, 520-526 | The 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 page | The 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 429 | The site asks for fewer requests. The actor waits and slows down by itself. | If it keeps happening, lower maxRequestsPerMinute. |
gone: <request> answered 404, 410 | The 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)
- Nofluffjobs Jobs Scraper
- Aplikuj Job Scraper
- Bluelionjob Jobs Scraper
- Bulldogjob Jobs Scraper
- Just Join IT Jobs Scraper
- Pracuj Job Scraper
- RocketJobs.pl Jobs Scraper
- theprotocol.it Jobs Scraper
🔗 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.