GoWork FR & DE Company Reviews and Profile Scraper avatar

GoWork FR & DE Company Reviews and Profile Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
GoWork FR & DE Company Reviews and Profile Scraper

GoWork FR & DE Company Reviews and Profile Scraper

Extract company profiles from GoWork France and Germany, including contact details, review threads with replies, ratings breakdowns, opening hours, social links, SIREN/NAF identifiers, and 100+ structured company fields. Supports keyword search, URL input, and bulk sitemap discovery.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

4 days ago

Last modified

Share

GoWork Scraper: Company Reviews, Ratings and Profile Data

GoWork Scraper turns GoWork France (gowork.fr) and GoWork Germany (gowork.de), employer-review sites where employees and candidates rate and review companies, into structured data. One run gives you a company's contact info, full review threads with replies, a star-rating histogram, opening hours, social links, French company identifiers (SIREN, SIRET, NAF code) where available, and 100+ structured fields per company. Start from a free-text search, pasted links, or a bulk sitemap walk, then export to JSON, CSV or Excel, or read the results straight into your app through the API.

Why This Scraper?

  • 100+ structured fields per company, including parsed geo coordinates, French SIREN/SIRET/NAF identifiers, employee count range, capital amount and currency, a full review thread tree with replies, a star-rating histogram with counts and percentages, opening hours, and social links.
  • Two output shapes: one row per company with reviews nested inside, or one row per review with the company's context joined in, built for BI tools.
  • Three ways to start: free-text search, paste company or search-result links, or walk GoWork's own sitemap for bulk discovery, with auto-paging on search and pasted search-result links.
  • Covers both GoWork France and GoWork Germany from the same input form; URL mode also detects the locale from the link itself.
  • Client-side filters skip companies below a rating or review-count threshold, or that have no scored reviews or aren't marked verified, so a capped run spends its budget on the companies you actually want.
  • Resume continues an interrupted run without re-collecting (or re-paying for) companies it already saved; Incremental mode tracks a saved search over time and labels every row NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED.
  • A run only fails outright when no working connection could be established before any scraping started, or when a pasted resumeFromRunId can't be read at all; a page or a company that gets refused mid-run is skipped and logged instead of stopping the whole run.

Use Cases

  • HR and employer-branding teams: monitor what employees and candidates say about your own company, or a competitor, across France and Germany.
  • Recruitment and staffing agencies: check a client's employer reputation and recurring complaints before placing candidates there.
  • Market and workforce researchers: build datasets of employer ratings, review volume and review activity by sector or region.
  • Business data providers: enrich company records with French SIREN, SIRET and NAF identifiers, employee-count ranges and capital figures.
  • Reputation and response teams: pull review threads with replies to measure response rate and catch new reviews on a recurring schedule.

Data You Get

Sample shape: values are illustrative placeholders, not from a live listing.

FieldExample
slugsample-company-paris
urlhttps://gowork.fr/sample-company-paris
siteLocalefr
org_name / longNameSample Company / SAMPLE COMPANY SAS
org_telephone / companyEmail+33100000000 / contact@example.com
companyWebsitehttps://example.com/
companySocialLinks[{"network":"linkedin","url":"..."}]
org_street_address / postalCode / org_address_locality / org_address_region / org_address_country1 Rue de Sample, 75001 Paris / 75001 / Paris / Ile-de-France / FR
latitude / longitude48.8566 / 2.3522
siren / siret / nafCode000000000 / 00000000000000 / 0000A
companyEmployeeCountLabel / Min / Max201-500 / 201 / 500
companyCapital / Amount / Currency80000 EUR / 80000 / EUR
companyFoundedDate2016-06-01
businessTradeName / companyBusinessAreaRetail Distribution / Wholesale and Logistics
org_rating_value / org_rating_count4.4 / 5
pageGlobalReviewCount31
ratingStar1Count..ratingStar5Count0, 0, 1, 1, 3
companyOpeningHoursJson{"lundi":"09:00-18:00", ...}
firstReviewDate / lastReviewDate2022-03-11T09:15:00.000Z / 2026-01-04T16:20:00.000Z
responseRate / avgRepliesPerReview / replyCountTotal50 / 1.0 / 2
reviewLanguagesAvailable / reviewYearDistribution["fr"] / {"2024":2,"2025":2,"2026":1}
reviewsarray of {reviewId, reviewerName, reviewDate, content, ratingValue, languageCode, authorKind, isModerated, isArchived, replies[]}
scrapedAt2026-01-05T09:00:00.000Z

When the output shape is reviews, each row is one review instead: it carries companySlug, companyName, companyRating and a compact set of other company fields joined in, plus that review's own reviewId, reviewerName, content, ratingValue, replies and moderation flags. A company record (either shape) also carries an SEO and diagnostics bundle (pageTitle, metaDescription, ogTitle/ogImage, raw jsonLd blocks), breadcrumbs, keywords, trusted-partner links, and, only when Incremental mode is on, changeType, changedFields, firstSeenAt and lastSeenAt.

How to Use

  1. Pick a mode: search (free-text query), url (paste a company link or a search-result link), or sitemap (bulk discovery from GoWork's own sitemap).
  2. Fill in the fields for that mode, and turn Fetch full company detail on if you want reviews, opening hours and the rating histogram rather than just the search-result card.
  3. Set Max companies (and, if you want, Max review threads per company) to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search by query (lean, no detail):

{
"mode": "search",
"locale": "fr",
"queries": ["Carrefour"],
"fetchDetails": false,
"maxListings": 25
}

Search with full detail enrichment (reviews, opening hours, histogram):

{
"mode": "search",
"locale": "fr",
"queries": ["Carrefour", "Auchan"],
"fetchDetails": true,
"maxPages": 2,
"maxListings": 50,
"maxReviewsPerCompany": 100
}

URL mode (paste a company link, a search-result link, or both):

{
"mode": "url",
"urls": [
"https://gowork.fr/b-hive-mulhouse",
"https://gowork.fr/search?q=Carrefour&page=2"
],
"fetchDetails": true,
"maxListings": 30
}

Reviews-only output (one row per review, company context joined in):

{
"mode": "url",
"urls": ["https://gowork.fr/b-hive-mulhouse"],
"output": "reviews",
"maxReviewsPerCompany": 50
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/gowork-eu-scraper").call(run_input={"mode": "search", "locale": "fr", "queries": ["Carrefour"], "fetchDetails": True})
for company in client.dataset(run["defaultDatasetId"]).iterate_items():
print(company["org_name"], company.get("org_rating_value"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/gowork-eu-scraper').call({ mode: 'search', locale: 'fr', queries: ['Carrefour'], fetchDetails: true });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

How Max companies shapes a multi-query, multi-URL or sitemap run

Max companies (maxListings) is one shared budget for the whole run, not a per-query or per-URL allowance. Queries, pasted URLs, or sitemap-discovered links are worked through in the order you gave them; once the cap is reached the run stops right there, and any entries further down the list are never even started. Put your highest-priority query or URL first, or raise the cap (or set it to 0 for unlimited, bounded only by the run's own timeout) if every entry needs to be represented.

Resume and recurring updates

  • Resume (resumeFromRunId) continues one interrupted run: paste its run ID or dataset ID and this run skips every company slug already saved there, appending only new companies. A background checkpoint also lets a run that the platform itself restarts mid-walk pick up where it left off, without re-collecting or re-paying for what it already saved. There is a real limitation here: the pagination-stop check for one search or URL looks at every company slug collected anywhere in the tracked scope, including slugs Resume seeded from an earlier run, not just that search's own earlier pages. If new companies were added to the results since the earlier run, a resumed walk's next page can turn out to be entirely companies already saved, and the walk stops there rather than continuing to genuinely new companies further down.
  • Incremental mode (incrementalMode) is for a search, URL list or sitemap config you run on a schedule. Each company is classified NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), REAPPEARED, or EXPIRED. A company can only be marked EXPIRED after a run that scanned its whole tracked scope with no cap, page limit or resume cutting it short, and only when Emit expired rows is on, because that same setting is also what marks the company as gone in the first place. The same limitation described under Resume above also applies here when you configure more than one query, URL or sitemap section in the same run: a later search's own walk can stop early because it overlapped with a different search's results earlier in the same run, and that early stop is still counted as a complete scan, which can wrongly mark a still-live company EXPIRED rather than actually gone. Keep each tracked scope to its own run if you rely on Emit expired rows across multiple queries or URLs. With Emit expired rows off, a company that drops out of your tracked search is simply left untouched in the saved baseline (no row for it that run); when it turns up again later it is classified UPDATED or UNCHANGED like normal, never REAPPEARED, since REAPPEARED only applies to a company a prior run actually marked gone. stateKey names or shares the saved baseline; leave it empty and one is derived from your mode, queries/URLs/sitemap settings and filters, so two different searches never share a baseline by accident. With Incremental mode off, output is exactly as before.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (free-text queries), url (paste detail or search-result links), or sitemap (bulk discovery from GoWork's sitemap).
localestringfrfr for gowork.fr or de for gowork.de. Applies to search and sitemap modes; URL mode detects the locale from the link's host instead.
queriesarray(none; input form prefills ["Carrefour"])Search terms (company name, brand, or keyword). One query becomes one search-result walk.
urlsarray(none; input form prefills ["https://gowork.fr/b-hive-mulhouse"])Company detail links or search-result links (multiple allowed). A search-result link auto-paginates forward.
sitemapKindstringconstantconstant (company profile URLs, recommended), cities, regions, rankings, or all.
sitemapFilterstring"" (empty = no filter)Case-insensitive substring filter on the discovered URL's slug.
outputstringcompanycompany (one row per company, reviews nested) or reviews (one row per review, company fields joined in; auto-enables fetchDetails).
fetchDetailsbooleantrueOn: fetches full company detail (reviews, opening hours, rating histogram, social links, company identifiers). Off: search-mode listings return only the search-result card, with no detail-page fetch or charge.
maxPagesinteger(none; empty = unlimited)Pagination ceiling per query or per search-result link. Leave empty to walk every result page, still bounded by Max companies.
maxListingsinteger25Hard ceiling on companies returned across the whole run, in every mode. 0 = unlimited, bounded only by the run's own timeout.
maxReviewsPerCompanyinteger50Cap on review threads (each can include replies) returned per company, from 0 (unlimited) to 500.
minRatinginteger0Skip companies whose aggregate rating is below this threshold, from 0 to 5.
minReviewCountinteger0Skip companies with fewer than this many total reviews.
ratedOnlybooleanfalseSkip companies with no scored reviews on file. Only reliable when Fetch full company detail is on (or on a pasted company link, which always reads full detail); a plain search-result card doesn't carry a review count to check, so with detail off this can filter out every result.
verifiedOnlybooleanfalseSkip companies not marked as verified. Only takes effect when Fetch full company detail is on, since verification status isn't available on a search-result card alone.
proxyobject(none; input form prefills Apify Residential, country FR)This actor needs a residential-class connection; the default group rotates automatically if a request keeps getting refused.
mcpConnectorsarray(none)Optional: send a summary of each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run, from 1 to 1000. Does not affect the dataset.
resumeFromRunIdstring(none)A previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Companies already saved there (matched by slug) are skipped.
incrementalModebooleanfalseTrack a recurring search/URL/sitemap config over time and label each row NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED.
stateKeystring(none)Names the saved baseline this run compares against. Leave empty to auto-derive one from your mode/queries/urls/sitemap settings/filters.
emitUnchangedbooleanfalseAlso return (and bill) companies with no detected change.
emitExpiredbooleanfalseAlso return (and bill) a row for a previously-tracked company no longer found, but only after a run that scanned the full tracked scope with no cap, page limit, or resume cutting it short.

Output Example

Sample shape: values are illustrative placeholders, not from a live listing.

{
"source": "gowork_detail",
"listingId": "sample-company-paris",
"slug": "sample-company-paris",
"url": "https://gowork.fr/sample-company-paris",
"siteLocale": "fr",
"scrapedAt": "2026-01-05T09:00:00.000Z",
"pageTitle": "Avis sur Sample Company - 31 avis - GoWork.fr",
"h1": "Avis Sample Company",
"htmlLang": "fr-FR",
"canonicalUrl": "https://gowork.fr/sample-company-paris",
"org_name": "Sample Company",
"longName": "SAMPLE COMPANY SAS",
"org_telephone": "+33100000000",
"org_tax_id": "000000000",
"org_description": "Wholesale distribution and logistics services for retail clients.",
"org_street_address": "1 Rue de Sample, 75001 Paris",
"org_address_locality": "Paris",
"org_address_region": "Ile-de-France",
"org_address_country": "FR",
"postalCode": "75001",
"latitude": 48.8566,
"longitude": 2.3522,
"siren": "000000000",
"siret": "00000000000000",
"nafCode": "0000A",
"activityShortLabel": "Wholesale distribution, warehousing",
"companyEmployeeCountLabel": "201-500",
"companyEmployeeCountMin": 201,
"companyEmployeeCountMax": 500,
"companyEmail": "contact@example.com",
"companyWebsite": "https://example.com/",
"companyLinkedInUrl": "https://fr.linkedin.com/company/sample",
"companySocialLinks": [
{ "network": "linkedin", "url": "https://fr.linkedin.com/company/sample" }
],
"companyBusinessArea": "Wholesale and Logistics",
"companyActivityDescription": "Wholesale distribution and logistics services for retail clients.",
"businessTradeName": "Retail Distribution",
"businessTradeSlug": "retail-distribution",
"companyCapital": "80000 EUR",
"companyCapitalAmount": 80000,
"companyCapitalCurrency": "EUR",
"companyFoundedDate": "2016-06-01",
"companyOpeningHoursJson": "{\"lundi\":\"09:00-18:00\"}",
"companyTrustedPartnersCount": 2,
"org_rating_value": 4.4,
"org_rating_count": 5,
"org_review_count": 5,
"pageGlobalRating": 4.4,
"pageGlobalReviewCount": 31,
"ratingHistogramScoredTotal": 5,
"ratingStar1Count": 0,
"ratingStar2Count": 0,
"ratingStar3Count": 1,
"ratingStar4Count": 1,
"ratingStar5Count": 3,
"ratingStar1Percent": 0,
"ratingStar2Percent": 0,
"ratingStar3Percent": 20,
"ratingStar4Percent": 20,
"ratingStar5Percent": 60,
"responseRate": 50,
"avgRepliesPerReview": 1.0,
"replyCountTotal": 2,
"reviewLanguagesAvailable": ["fr"],
"reviewYearDistribution": { "2024": 2, "2025": 2, "2026": 1 },
"firstReviewDate": "2022-03-11T09:15:00.000Z",
"lastReviewDate": "2026-01-04T16:20:00.000Z",
"reviews": [
{
"reviewId": "00000000-0000-0000-0000-000000000000",
"reviewerName": "Jane Doe",
"reviewDate": "04-01-2026 16:20",
"reviewDateIso": "2026-01-04T16:20:00.000Z",
"content": "Sample review text describing a typical experience working here.",
"contentLength": 62,
"ratingValue": 5,
"languageCode": "fr",
"authorKind": "ANONYMOUS",
"isModerated": false,
"isArchived": false,
"replyCount": 1,
"replies": [
{
"replyId": "00000000-0000-0000-0000-000000000001",
"authorName": "Employer Response Team",
"content": "Sample reply text thanking the reviewer for their feedback.",
"date": "05-01-2026 09:00",
"dateIso": "2026-01-05T09:00:00.000Z"
}
]
}
],
"breadcrumbs": [{ "name": "Sample", "url": "/avis/sample" }],
"keywords": ["industry", "engineering"],
"mainTextPreview": "Engineering consulting and design office serving industrial clients (preview)",
"jsonLd": [
{ "@context": "https://schema.org", "@type": "Organization", "name": "SAMPLE COMPANY" }
]
}

Plan Requirement

This scraper needs a residential-class connection to load GoWork's pages reliably. The default proxy setting works out of the box, and the actor rotates to nearby countries and then a backup connection pool when requests keep getting refused. For large or frequent runs, keeping the residential proxy group selected under Connection gives the most headroom.

FAQ

How much does it cost?

You pay per company or review row returned, plus a second charge only when a company's full detail page is actually fetched and parses successfully. Search-mode listings only trigger that second charge when Fetch full company detail is on. A company link you paste directly, or one discovered through Sitemap discovery mode, is always fetched at the detail rate when the page parses, because there is no lighter "card only" version of a single company page. The Pricing tab shows current rates. Use Max companies and Max review threads per company to cap the cost of any run.

This actor collects only publicly published employer reviews and company profile data. You are responsible for how you use it: follow GoWork's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Reviewer names as shown on the site and review text can be personal data in some jurisdictions; handle them carefully, especially before republishing, and consider whether you need to redact or aggregate before sharing further.

Can I get only new or changed companies on a schedule?

Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated companies, and unchanged ones are not billed unless Emit unchanged rows is also on. Turn on Emit expired rows too if you also want a row for a company that drops out of your tracked search entirely, but only a run that scans the whole tracked scope with no cap, page limit or resume produces those, and a multi-query or multi-URL run can occasionally end one of its own searches early if it overlaps with another search's results, so treat EXPIRED as reliable only for a single tracked search or URL per run.

Why doesn't turning off Fetch full company detail always change what I'm billed for?

Fetch full company detail only controls the detail-page fetch for search-mode listings. A company link you paste directly in URL mode, or one found through Sitemap discovery mode, is always fetched and billed at the detail rate when it parses successfully, since there is no lighter alternative for a single company page.

Why did my run fail instead of returning an empty dataset?

Only a few conditions fail the run outright: no working connection could be established at all before any scraping started, an invalid combination of Resume and Incremental mode inputs was given, or a pasted Resume run or dataset id could not be read. If a connection is available but individual pages or companies get refused mid-run, those are skipped and logged instead, and the run still finishes with whatever it did manage to collect, even if that turns out to be nothing.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

🔗 Want more leads data?

Pair this actor with these related scrapers from the same team:

📇 JobStreet
From $1/1K. Pull JobStreet company profiles and employee reviews across Malaysia...
📱 Mastodon
From $1/1K. Scrape trending Mastodon profiles and related posts from any Mastodon...
🛒 ProductReview.com.au Scraper
Scrape ProductReview.com.au products, businesses and customer reviews. Search by...
📇 PagesJaunes FR
From $0.8/1K. Scrapes business listings from PagesJaunes.fr (French Yellow Pages)...
📱 Clutch Scraper
Scrape Clutch company directories and profiles. Get names, ratings, review counts, hourly...
💼 France Travail Scraper
Scrape job offers from France Travail with titles, companies, locations, salaries...

👉 Browse all abotapi scrapers

💬 Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.