OXYGENOxygen/ Docs
Providers

LinkedIn data access

Enrich people and companies with Oxygen managed LinkedIn data, preview exact request costs, and choose HarvestAPI BYOK when you want to use your own key.

Use Oxygen managed LinkedIn enrichment, shown in the app as Professional Network Data · supplied by Up2Data, to look up a person by LinkedIn profile or a company directly by its website domain. Supported managed operations need no connected LinkedIn account, cookie, browser extension, or provider key. HarvestAPI is a separate bring your own key (BYOK) option under the same scraper.* operation IDs.

Where the data comes from

Managed LinkedIn data is collected and provided by Up2Data, a named data supplier listed on the subprocessors page. OXYGEN never uses your LinkedIn account for it. Some data is visible on LinkedIn only to signed-in members: post reactions and comments, a profile's or company's activity feed, and search results. Up2Data may use signed-in sessions of its own to collect that data.

Every managed operation states its sourcing in data_sourcing, and every managed run records the supplier in its provenance (meta.supplier):

oxygen tools get scraper.linkedin_post_reactions --json

You are the controller of the personal data you choose to retrieve. You are responsible for your lawful basis, for informing the people concerned (GDPR Article 14 where it applies), and for honouring objections. Company-page followers come from a different supplier; see Company followers (ScrapeLi).

Prepare person and company enrichment

Start with the operation descriptors. They list accepted inputs, output fields, supported credential modes, and current prices:

oxygen tools search "public LinkedIn profile" --json
oxygen tools get scraper.linkedin_profile --json
oxygen tools get scraper.linkedin_company --json
EnrichmentManaged inputResult
Person — scraper.linkedin_profileLinkedIn profile URL or public identifierProfile details, headline, location, current position, experience, education, and follower/connection counts
Company — scraper.linkedin_companyWebsite domain, LinkedIn company URL, slug, or company idCompany profile, industry, headcount, locations, website, specialties, and available funding information

The descriptor's output_schema names the fields you can map into a Table or Workflow before running an enrichment. Individual profiles may leave some fields empty.

Preview both requests for free. Select managed mode explicitly to keep the plan on Oxygen credits even if your workspace also has a HarvestAPI key:

oxygen tools run scraper.linkedin_profile \
  --input-json '{"url":"https://www.linkedin.com/in/satyanadella/"}' \
  --credential-mode managed --mode dry_run --json

oxygen tools run scraper.linkedin_company \
  --input-json '{"domain":"microsoft.com"}' \
  --credential-mode managed --mode dry_run --json

These previews return the request-shaped price and confirm that no provider call happened (meta.provider_call: false). A preview does not fetch the profile or guarantee a matching record. Read its availability and validation result before approving a live call.

Company-name lookup through the search input and ID-only person enrichment require HarvestAPI BYOK. For managed company enrichment, use an exact domain or LinkedIn company identifier.

Public data or a connected account

Public research belongs on the scraper. Account-specific data and sending use a connected account.

What you want to readSurfaceWhy
Public profiles, companies, posts, engagers, or supported searchesscraper.* — managed or explicit HarvestAPI BYOKReads without using a connected account's action quota.
Your own connections, followers, profile viewers, inbox threadsConnected account (linkedin.*)Only your logged-in account can see these.
Sending — invites, DMs, comments, postsConnected account, approval-gatedWrites require an account. See Sequences.

What it can read

Every scraper.* operation currently in the catalog is listed under Professional Network Data · supplied by Up2Data in the provider reference.

Managed and HarvestAPI BYOK operations can accept different filters and pagination. Read the descriptor for the mode you intend to use. Ad lookup/search, group lookup/search, service search, geo-id search, comment replies, and comment reactions require HarvestAPI BYOK; managed mode reports them as unavailable.

The descriptor is always the authority — its input schema, when_to_use, output shape, pagination, and current price:

oxygen tools get scraper.linkedin_lead_search --json

Your own Up2Data or ScrapeLi key for the LinkedIn lanes

Professional Network Post Search and Professional Network Post Engagers run on Managed credits by default. Pick Bring your own API key in the lane (CLI --credential-mode user_api_key, MCP credential_mode) to run them on your workspace's Up2Data key instead: Up2Data bills the calls and no Oxygen credits are charged. Professional Network Company Followers offers the same choice with a ScrapeLi key. Save the key under Connections → Up2Data or Connections → ScrapeLi, or with oxygen integrations connect up2data --api-key <key>. Without a saved key the lane refuses before creating anything. BYOK requires a paid Oxygen plan.

Bring your own HarvestAPI key

Open Connections → Professional Network Data · supplied by Up2Data and use the HarvestAPI API key field for your direct HarvestAPI key. An Apify token is not a HarvestAPI key. Oxygen stores the key encrypted and scoped to your workspace; BYOK requires a paid Oxygen plan. Adding this key is optional for supported managed operations.

From the CLI, discover the required key field without submitting a credential:

oxygen integrations connect scraper --json

Follow the returned connection instructions, or paste the key in Connections. For tool calls, select --credential-mode user_api_key explicitly so a missing or invalid key fails instead of using managed credits. Use the same mode for the preview and live request:

oxygen tools run scraper.linkedin_profile \
  --input-json '{"url":"https://www.linkedin.com/in/example"}' \
  --credential-mode user_api_key --mode dry_run --json

HarvestAPI is BYOK only. Its calls use your HarvestAPI balance and incur no Oxygen managed provider-credit charge. Missing or invalid BYOK credentials fail instead of falling back to managed. Live provider calls still require approval and scope; other Oxygen actions retain their normal pricing. Choose --credential-mode managed for supported Oxygen-managed operations, with no key setup.

Preview before you spend

Every operation has a free dry run. It validates the selected input and credential mode, returns the request-shaped estimate or availability limitation, and confirms no provider call happened (meta.provider_call: false).

# Free — estimates the live price, calls nothing.
oxygen tools run scraper.linkedin_post_reactions \
  --input-json '{"post":"https://www.linkedin.com/posts/example_activity-123","page":1}' \
  --credential-mode managed --mode dry_run --json

# Paid — only after you've read the estimate.
oxygen tools run scraper.linkedin_post_reactions \
  --input-json '{"post":"https://www.linkedin.com/posts/example_activity-123","page":1}' \
  --credential-mode managed --mode live --approved --max-credits <cap_from_the_dry_run> --json

--max-credits is a ceiling. The usage receipt records what actually ran: result-based operations settle against returned results, while page-based operations settle against pages fetched. The descriptor names the billing unit; a preview alone does not fetch a result.

One record vs. a whole table

Managed feed operations return one page and a continuation token at response.raw.pagination.paginationToken when more data is available. Continue with the next page and that value as pagination_token; page numbers alone do not identify the next result set. Keep the token with the same input and credential mode. For company posts and post engagers, max_results caps the entire scrape (default 25), including later pages. Reaching that cap is a bounded sample; it does not establish that every post or engager was collected. Inspect response.raw.pagination.truncated before treating the result as complete.

Managed searches use max_results to bound their internal pagination. Start at the first page; managed searches reject page values above one. Preview the requested limit before execution. HarvestAPI BYOK retains the pagination documented for its operation and mode. Use native runs for batches so pagination, retries, cost, and provenance stay inspectable.

ScopeUse
One known profile, company, or postoxygen tools run directly, as above
The same lookup across many rowsA tool column — one operation bound to one input column
Collect engagers on a post within an approved capoxygen engagement harvest --post <url> --source cookieless --max-credits N — a durable background harvest into a table
Multi-page or multi-source harvestsA workflow run

In the web app, add a LinkedIn company tool column, map Domain to your website-domain column, and keep Credentials → Managed. New managed scraper columns select Managed even when a HarvestAPI key is connected. Select HarvestAPI BYOK to use your own key with its supported inputs. Existing columns keep their saved credential choice.

Workflows and blueprints, including the LinkedIn profile engager monitor, run every scraper.* step on the managed rail. A HarvestAPI key is used only when a call asks for it: --credential-mode user_api_key on the CLI, credential_mode: "user_api_key" over MCP, a column saved as HarvestAPI BYOK, or a workflow tool step that names the connection. The dry-run preview and the live run therefore always agree on which lane pays.

From the CLI, a company-domain tool column binds the input directly:

oxygen columns add <table> --label "LinkedIn company" --kind tool --data-type jsonb \
  --definition-json '{"toolId":"scraper.linkedin_company","credentialMode":"managed","inputMapping":{"domain":{"type":"column","columnKey":"domain"}}}' --json

Preview a small row sample, inspect the result, and approve a bounded run before expanding. Posts and engagement operations add paid work per row, so scope them to a qualified shortlist — see Columns for run conditions and batch execution.

Cost

Scraper prices are runtime data that can change independently of any document, so this page deliberately quotes none. The authoritative sequence is always:

  1. oxygen tools get <tool_id> --json — the operation's units, output fields, supported modes, and current price.
  2. Dry-run the exact input, result limit, and credential mode for a request-shaped estimate.
  3. Use the preview's recommended ceiling and explicitly approve the live request. For a Table or Workflow, preview the whole bounded run.

Watch actual burn with oxygen billing usage --limit 20 --json. See Billing and Caps.

What it cannot do

  • Private data. No private profiles, no connection-gated fields, no one else's inbox.
  • Your own network. Connections, followers, and profile viewers are connected-account surfaces.
  • Writes. No invites, DMs, comments, or posts — the scraper only reads.
  • Guaranteed density. A person who rarely posts returns thin or empty results. That is the real answer, not a failure; re-running will not produce more.

If the scraper is unavailable, Oxygen surfaces the availability error rather than silently rerouting through another provider or spending a connected account's quota.

On this page