Global Internship Finder avatar

Global Internship Finder

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Global Internship Finder

Global Internship Finder

Discover fresh internships across Europe and beyond, collected automatically from public job boards and company career pages. Normalized, deduplicated, and relevance-scored.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Tuhin

Tuhin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Categories

Share

Discover fresh internships across Europe and beyond — collected automatically from public job boards and company career pages, then normalized, deduplicated, and relevance-scored.

Select countries, cities, roles, languages, and remote/hybrid/on-site preference, and get a clean, ranked dataset of validated internships — ready to power an internship search website.

Responsible use: Uses only public / authorized sources and official-style JSON endpoints (The Muse API, Arbeitnow API, Remotive API, and public Greenhouse/Lever ATS boards). It does not log in, scrape LinkedIn/Indeed, bypass CAPTCHAs, or access private/paywalled data. LinkedIn & Indeed are intentionally excluded because their terms/anti-bot controls prohibit it.


Sources (modular — add more by dropping a connector in src/sources/)

SourceCoverageNotes
The MuseGlobal, explicit Internship levelBest structured internship source (category + location)
ArbeitnowEurope (esp. Germany)Public EU job board
RemotiveRemoteRemote internships
GreenhousePer companyPublic ATS boards — exposes deadlines & education
LeverPer companyPublic ATS boards

Input (all optional — run with none for a broad EU sweep)

FieldDescription
countries / citiesLocation filters, e.g. ["Germany","Netherlands"], ["Berlin"].
categoriesRoles, e.g. ["Software Engineering","Data Science","Finance"] (also queries The Muse).
keywordsMust appear in title/description.
locationTypeany / remote / hybrid / onsite.
languagesRequired languages, e.g. ["English","German"].
sourcesWhich connectors to run. Default ["themuse","arbeitnow","remotive"].
greenhouseCompanies / leverCompaniesCompany board tokens for ATS sources.
maxPerSourceCap per source (default 150).
minRelevanceScore / maxAgeDaysQuality/freshness filters.
previousDatasetIdPrior run's dataset → new/expired/deadline-change detection.

Example inputs

{ "countries": ["Germany","Netherlands"], "categories": ["Software Engineering","Data Science"] }
{ "sources": ["greenhouse","lever"], "greenhouseCompanies": ["stripe","gitlab"], "leverCompanies": ["ramp"], "keywords": ["data"] }
{ "countries": ["France"], "locationType": "remote", "previousDatasetId": "<PREV_DATASET_ID>" }

Output

1) Internships (default dataset — active, ranked by relevance)

{
"id": "3f9a1c22b7e04d18",
"jobTitle": "Data Science Internship (m/f/d)",
"company": "Example GmbH",
"country": "Germany", "city": "Berlin",
"locationType": "hybrid",
"industry": "Data Science", "department": "Data",
"internshipType": "internship", "duration": "6 months",
"salary": null,
"requiredSkills": ["python","sql","machine learning"],
"educationRequirements": "Bachelor",
"experienceRequirements": null,
"languageRequirements": ["English","German"],
"applicationDeadline": null,
"postingDate": "2026-08-20T00:00:00Z",
"sourceWebsite": "themuse.com", "source": "themuse",
"sources": ["themuse","arbeitnow"],
"sourceUrls": [{ "source":"themuse","url":"https://..." }],
"url": "https://...", "companyUrl": null,
"description": "…",
"relevanceScore": 82,
"relevanceReasons": ["country match","role match","keywords: python"],
"classifications": ["new","high-match"],
"status": "active",
"collectedAt": "2026-08-30T18:00:00Z",
"lastVerifiedAt": "2026-08-30T18:00:00Z"
}

2) Changes (named dataset changes)

{ "id":"3f9a1c22b7e04d18", "changeType":"new", "jobTitle":"…", "company":"…", "detectedAt":"…" }

changeTypenew · expired · deadline-changed · updated. Run summary is in key-value store OUTPUT.

Relevance score & classifications

Base 40 (already a validated internship) + country/city/role/keyword/language/location-type matches + freshness + multi-source corroboration → 0–100. Classifications: new (≤7d), deadline-soon (≤14d), remote, high-match (≥75), likely-expired (deadline passed or >90d old). Likely-expired listings are kept out of the active dataset but still surface in changes for historical tracking.

Scheduling & history

Schedule daily (or several times/day) and pass the previous run's dataset ID as previousDatasetId. Each run emits new/expired/deadline-changed/updated events, so you can maintain a live + historical view.

Website / database

db/schema.sql is a ready PostgreSQL schema with proper indexes (country, city, company, industry, location_type, deadline, posting_date, relevance, GIN on skills/languages/classifications) plus internship_sources, internship_changes, and saved_searches (alerts). Load the default dataset into internships (upsert on id, pattern included in the SQL) and the changes dataset into internship_changes. The website then queries/filter/paginates against these tables. The website + query API is a separate build from this Actor.

Reliability

Per-source fail-safe (one dead source never stops the run), retries with backoff, concurrency across sources, HTML→text normalization, and deterministic ids for stable dedup/upsert.

Limitations

  • Internship detection is keyword/heuristic (multi-language: EN/DE/FR/ES/IT/NL/PT/PL) — very accurate on explicit sources, best-effort on free-text boards.
  • Country/city are parsed from location strings via a curated hint list (extend COUNTRY_HINTS in normalize.js).
  • Deadlines exist mainly on Greenhouse; other sources rarely publish them.
  • LinkedIn/Indeed are out of scope by design (ToS/anti-bot).