Business Service Extractor
Pricing
$3.00 / 1,000 results
Business Service Extractor
Pricing
$3.00 / 1,000 results
Rating
0.0
(0)
Developer
Eichan Jolly
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Features
Share
Extract services that a business has explicitly declared in JSON-LD on one official business website page. The Actor does not infer services from visible page text.
Who it is for
B2B list-quality teams, service-category researchers and sales operations users who need traceable, machine-readable service declarations, not marketing-text guesses. One URL per run. No accounts, logins, LinkedIn collection or personal-profile harvesting.
Input
{"url":"https://firstcapitol.co.uk/debt-collection-agency-london/"}
This is a real publicly reachable business page (independently accessible on 2026-11-01), not a fabricated/example domain. The live HTML's current JSON-LD service coverage could not be verified by the build environment. Accordingly, service results for this URL are not guaranteed; honest not_found output is part of normal operation.
Output
One row per explicitly declared Service (or recognized Schema.org service subtype) from JSON-LD @graph declarations, makesOffer, hasOfferCatalog, nested OfferCatalog entries, or itemOffered. @id references to same-page entities are supported. Output keys remain stable:
businessName: a published provider business name, or name of the organization declaring an offer;nullif not presentserviceName: publishedService.name, otherwisenullserviceType: publishedserviceType, otherwise explicit Schema.org Service@typedescription: first 300 characters of the published description with whitespace normalized;nullwhen not provided, never generatedsourceUrl: fetched input page URLstatus:foundornot_founderror:nullfor found rows, or readable explanation ofnot_found
An illustrative fixture result, not live evidence for the prefill target:
{"businessName":"Northstar Trade Services","serviceName":"Business Debt Recovery","serviceType":"B2B collections","description":"Collection service for businesses.","sourceUrl":"https://firstcapitol.co.uk/debt-collection-agency-london/","status":"found","error":null}
If the page has no declared Service, one row is emitted with businessName, serviceName, serviceType, and description all null, sourceUrl set, status:"not_found", and an informative error string.
Honest limits
- No service guessing from headings, navigation, prose, product offers, page titles, or catalog names; a
Servicenode must explicitly exist in embedded JSON-LD. Does not read visible text, Microdata, RDFa, externally linked JSON-LD or other pages. - Site-authored JSON-LD is self-declared and not proof a service is currently offered. Data may be incomplete, outdated, duplicated, or malformed. Duplicate same-name/type/description declarations within a page are coalesced.
@graph/@idin-page links and nested offer catalogs are supported. If no provider name is explicitly linked,businessNameisnull(never inferred from the domain).- Only recognized Schema.org
Servicetypes are eligible; exotic unlisted service subtypes may be missed. Long descriptions are clipped to 300 characters without generating summaries. - No cross-domain redirects, login, JS rendering, or crawling. Enforces HTTPS and public IPs, robots.txt, TLS validation, a 12-second network timeout and 2 MB HTML limit.
- Public sites may block bots or omit JSON-LD. Failures produce a plain
ERROR:line without a traceback. The Actor never extracts contact details or personal data.
Local and Apify use
Python 3.12+ standard library exclusively; requirements.txt is intentionally empty of dependencies.
$ACTOR_INPUT_JSON='{"url":"https://firstcapitol.co.uk/debt-collection-agency-london/"}' python src/main.py
Alternatively put the same object in storage/key_value_stores/default/INPUT.json. Local results: storage/datasets/default/000000001.json, etc. For Apify, input is read using APIFY_DEFAULT_KEY_VALUE_STORE_ID + APIFY_TOKEN and GET /v2/key-value-stores/{id}/records/INPUT; dataset records are written to APIFY_DEFAULT_DATASET_ID via POST /v2/datasets/{id}/items. ACTOR_INPUT_JSON takes precedence for local tests. Live Apify platform operation was not tested; API behavior was verified with a fixture.
Tests and actual script-mode output
python tests/run_direct_smoke.pypython -m unittest discover -s tests -v
The direct runner executes the actual src/main.py script in a subprocess, not an imported main() function, using a valid URL and a simulated offline response. Evidence in tests/SMOKE_OUTPUT.txt, dataset in tests/SMOKE_DATASET.json, full unittest output in tests/TEST_RUN_OUTPUT.txt. The fixture file tests/sitecustomize.py is test-only and activated with ACTOR_TEST_HTTP=1 + test PYTHONPATH; production never uses it.
Store category and price suggestion
Candidates: LEAD_GENERATION, DATA_EXTRACTION. Suggested pricing: $3 per 1,000 dataset items ($0.003 each), model PRICE_PER_DATASET_ITEM. This is a planning suggestion, not deployed billing. Before any future billing activation, decide whether not-found rows should be charged.