TeamWork Online Sports Jobs Scraper avatar

TeamWork Online Sports Jobs Scraper

Pricing

from $2.00 / 1,000 jobs

Go to Apify Store
TeamWork Online Sports Jobs Scraper

TeamWork Online Sports Jobs Scraper

Scrape every job on TeamWork Online, the sports industry's main board. Salary, categories, career level, expiry date and the full posting. HTTP-only, no browser, no proxy.

Pricing

from $2.00 / 1,000 jobs

Rating

0.0

(0)

Developer

Piquno

Piquno

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Share

Scrape the whole of TeamWork Online — the job board the sports industry actually uses. Teams, leagues, arenas, agencies, college athletics, motorsports. ~8,900 live postings.

HTTP-only, no browser, no proxy. 26 flat fields per job, ready for CSV or Excel.

$2.00 per 1,000 jobs. No charge for empty rows.


Why this one

Nothing else on the Store covers this site. Four separate searches for TeamWork Online returned zero actors. The general job-board scrapers don't reach it, and the one nominally sports-labelled actor is Brazilian gym data.

That matters because sports hiring barely overlaps with the mainstream boards. A ticket-sales role at an NHL club or a partnerships job at a college athletics department is posted here and often nowhere else.

What you get that the listing page doesn't show

  • Disclosed salary ranges, parsed into salaryMin / salaryMax / salaryPeriod. These are not in the site's structured data — they only exist in the page HTML.
  • Job categories — "Corporate Partnerships | Corporate Sponsorship Sales | Premium/Suite Sales"
  • validThrough — an actual expiry date, which most job boards never publish. You can tell a live posting from a stale one.
  • The full posting text, including department, reports-to, FLSA status and qualifications.
  • applyUrl — the direct application link.

Two modes

Set fetchDetails: false for a fast, cheap sweep — one request per 100 jobs instead of one per job. Good for monitoring which organisations are hiring. Leave it on for salary, categories and full descriptions.


Input

{
"vertical": "hockey-jobs",
"searchQuery": "ticket sales",
"maxJobs": 500,
"fetchDetails": true,
"withSalaryOnly": true
}

Defaults: maxJobs is 100 with fetchDetails on — a fast sample that finishes in roughly 90 seconds. Raise maxJobs for a bulk extract; the whole board is around 8,900 jobs.

Or crawl the whole board by leaving vertical at its default. startUrls accepts TeamWork Online listing URLs directly, including ones with filters already applied on the site.

Monitoring the board

Set incremental: true with its own stateKey. Only postings not seen before are emitted, tagged changeType: "new" — so a daily watch on 8,900 jobs bills for the handful that are actually new.


Output

{
"jobId": "2186711",
"jobTitle": "Manager, Partnerships & Premium",
"organizationName": "NorCal - Major League Volleyball",
"vertical": "other-sports-jobs",
"careerLevel": "Manager",
"jobCategories": "Corporate Partnerships | Corporate Sponsorship Sales | Premium/Suite Sales",
"locationCity": "San Ramon",
"locationState": "CA",
"locationCountry": "US",
"postalCode": "94583",
"workArrangement": "Hybrid",
"salaryMin": 62000,
"salaryMax": 72000,
"salaryPeriod": "year",
"datePosted": "2026-08-21T00:00:00.000Z",
"validThrough": "2026-09-30T00:00:00.000Z",
"applyUrl": "https://www.teamworkonline.com/employment_opportunities/2186711/applications/new",
"fieldsPopulated": 24
}

Field fill rates

Measured on live pages. Published so you can judge completeness before you buy, not after.

FieldFill
jobId, jobTitle, organizationName, jobUrl100%
locationCity, locationState, careerLevel100%
datePosted, validThrough, description100% with fetchDetails
salaryMin / salaryMaxonly where the employer disclosed pay — a minority of postings
workArrangementpresent when the employer stated it

Nothing is inferred. A withheld salary stays null rather than being estimated.


Pricing

EventPrice
Job$0.002 ($2.00 / 1,000)
Actor start$0.00005

A row is billed only if it has a job id, and it is billed before it is pushed — so you are never charged for a row you did not receive. Rows removed by your filters are never billed. The actor honours the maximum charge per run set in run options and stops fetching once that budget is spent.


Limitations — read before you buy

  • Salary is often absent. Sports employers frequently withhold pay. Use withSalaryOnly if you need it, but expect the count to drop substantially.
  • Full details cost one request per job. 500 jobs with fetchDetails: true is ~505 requests, and the actor sustains about one job per second. Turn it off for broad sweeps — listing-only is one request per 100 jobs.
  • Filters that need detail data (withSalaryOnly, postedWithinDays) require fetchDetails: true.
  • The board is US-centric. Some international roles appear, but most postings are US-based.
  • Format risk. Listings are parsed from server-rendered HTML and details from the page's structured data. If either changes, the actor logs it and stops rather than silently returning partial rows — and a failed detail fetch degrades to the listing row rather than dropping the job.

Running locally

npm install
npm test

Tests run against captured live pages in test/fixtures/ — no network required. They assert the things that actually break this scraper: 100 cards per page, page 2 disjoint from page 1, the pagination container being a <nav> rather than a <div>, and a posting with no salary not shifting every other field.