Search

The search commands run LinkedIn searches for people, companies, posts, and jobs — all as POST-body requests. Every search command supports --all for paginated NDJSON streaming and rejects --preview. All are account-scoped and require --account.

Changed in 0.15.0: the per-command --url named flag is removed from search people|companies|posts|jobs. Running a pasted LinkedIn search URL directly is now the bare search <url> form.

search <url>

Runs a pasted LinkedIn search, saved-search re-run, or lead-list URL directly — the CLI resolves which search it is and dispatches it for you.

# Run a pasted search URL directly (POST, paginated)
curviate search "<linkedin-search-url>" [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] --account <account_id>

Named flags and the filter escape hatch

Each search command ships a set of curated named flags for the most common filters. For the full filter surface (35+ fields per command), pass the entire filter body as JSON via the escape hatch:

# Inline JSON
curviate search people --filters '{"network_distance":[1,2]}' --account acc_YOUR_ACCOUNT_ID
 
# From a file
curviate search people --filters-file filters.json --account acc_YOUR_ACCOUNT_ID
 
# From stdin
echo '{"network_distance":[1]}' | curviate search people --filters - --account acc_YOUR_ACCOUNT_ID

Named flags merge OVER the --filters base body, so you can mix both styles. For the complete filter field reference, see the API reference.

search people

# Search LinkedIn members (POST, paginated)
curviate search people \
  [--keywords <k>] \
  [--title <job-title-keyword>] \
  [--industry <ids>] \
  [--location <ids>] \
  [--company <ids>] \
  [--past-company <ids>] \
  [--school <ids>] \
  [--network-distance <1,2,3>] \
  [--connections-of <member_id>] \
  [--followers-of <member_id>] \
  [--profile-language <codes>] \
  [--filters '<json>'] \
  [--filters-file <path>] \
  [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] \
  --account <account_id>

Multi-value flags (--industry, --location, --company, --past-company, --school, --network-distance, --profile-language) accept comma-separated values. --title is a free-text job-title keyword filter (advanced_keywords.title). --connections-of / --followers-of take member id(s) — resolve one with curviate search parameters --type CONNECTIONS|PEOPLE --keywords "<name>". Use curviate search parameters to resolve human-readable terms to opaque IDs.

search companies

# Search LinkedIn companies (POST, paginated)
curviate search companies \
  [--keywords <k>] \
  [--industry <ids>] \
  [--location <ids>] \
  [--network-distance <1,2,3>] \
  [--has-job-offers] \
  [--headcount <ranges>] \
  [--filters '<json>'] \
  [--filters-file <path>] \
  [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] \
  --account <account_id>

--headcount is comma-separated ranges: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+ (10001+ not yet supported by the platform).

search posts

# Search LinkedIn posts (POST, paginated)
curviate search posts \
  [--keywords <k>] \
  [--sort-by <relevance|date>] \
  [--date-posted <past-day|past-week|past-month>] \
  [--content-type <videos|images|live_videos|collaborative_articles|documents>] \
  [--posted-by-member <ids>] \
  [--posted-by-company <ids>] \
  [--posted-by-me] \
  [--mentioning-member <ids>] \
  [--mentioning-company <ids>] \
  [--author-industry <ids>] \
  [--author-company <ids>] \
  [--author-keywords <k>] \
  [--filters '<json>'] \
  [--filters-file <path>] \
  [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] \
  --account <account_id>

--posted-by-member, --posted-by-company, and --posted-by-me all merge into the same posted_by filter; --mentioning-member / --mentioning-company merge into mentioning; --author-industry / --author-company / --author-keywords merge into author. Resolve member/company/industry ids with search parameters --type PEOPLE|COMPANY|INDUSTRY.

search jobs

# Search LinkedIn jobs (POST, paginated)
curviate search jobs \
  [--keywords <k>] \
  [--location <id>] \
  [--location-within-area <miles>] \
  [--industry <ids>] \
  [--seniority <executive|director|mid_senior|associate|entry|intern>] \
  [--function <ids>] \
  [--job-type <full_time|part_time|contract|temporary|volunteer|internship|other>] \
  [--company <ids>] \
  [--sort-by <relevance|recent>] \
  [--date-posted <max-age-days>] \
  [--title <ids>] \
  [--presence <on_site|hybrid|remote>] \
  [--benefits <ids>] \
  [--commitments <ids>] \
  [--has-verifications] \
  [--under-10-applicants] \
  [--in-your-network] \
  [--fair-chance-employer] \
  [--filters '<json>'] \
  [--filters-file <path>] \
  [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] \
  --account <account_id>

--location takes a single geo region id (resolve via search parameters --type LOCATION) and maps to the region filter; --location-within-area is a radius in miles and requires --location. --date-posted here is a maximum job age in days (a number, e.g. 7), unlike search posts --date-posted which is an enum window. --title is ID-based (resolve via search parameters --type JOB_TITLE) — unlike search people --title, which is free text. --seniority and --job-type are closed enums passed directly, not resolved through search parameters.

search parameters

Resolves human-readable terms (company names, locations, industries) to the opaque IDs the search commands expect. Not paginated — --all is not accepted.

# Resolve filter IDs by type and keyword (GET, not paginated)
curviate search parameters --type <TYPE> --keywords <k> [--limit <n>] --account <account_id>

--type is one of LOCATION, PEOPLE, CONNECTIONS, COMPANY, SCHOOL, INDUSTRY, SERVICE, JOB_FUNCTION, JOB_TITLE, EMPLOYMENT_TYPE, SKILL. Both --type and --keywords are required for every type, including EMPLOYMENT_TYPE.

search groups

Keyword search for LinkedIn groups — the simplest search, keyword-only with no filter-id resolution step. A no-match search is an empty list, not an error.

# Keyword search for groups (paginated read)
# <keywords> is a positional — quote multi-word terms, e.g. "gtm engineering".
curviate search groups <keywords> [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] --account <account_id>

search services

Searches the LinkedIn Services vertical (people who offer services), filtered by category, location, connection degree, and language. At least one of --keywords, --service-category, or --location is required.

# Search the Services vertical (POST, paginated)
# --service-category and --location take opaque ids from `search service-parameters`.
# --connections is a comma-separated degree filter: 1=1st, 2=2nd, 3=3rd+.
curviate search services \
  [--keywords <k>] \
  [--service-category <ids>] \
  [--location <ids>] \
  [--connections <1,2,3>] \
  [--language <codes>] \
  [--filters '<json>'] \
  [--filters-file <path>] \
  [--limit <n>] [--cursor <token>] [--all] [--max-pages <n>] \
  --account <account_id>

--service-category and --location accept comma-separated or repeated ids (resolve them with search service-parameters). --language takes ISO 639-1 codes (e.g. en,de). The --filters / --filters-file escape hatch works the same as the other search commands — named flags merge over it.

search service-parameters

Resolves a typed term into service-filter option ids for search services — the "Add a service category / Add a location" typeahead. Not paginated (--all is not accepted).

# Resolve a service-filter term to option ids (GET, not paginated)
# --type is service_category (default) or location; --keywords is required.
curviate search service-parameters --keywords <k> [--type service_category|location] --account <account_id>

Examples

Find people by keyword and location

# Get the location ID first
curviate search parameters --type LOCATION --keywords "Berlin" --account acc_YOUR_ACCOUNT_ID
 
# Search people using that ID
curviate search people --keywords "AI engineer" --location 106967730 --account acc_YOUR_ACCOUNT_ID

Run a pasted search URL directly

curviate search "https://www.linkedin.com/search/results/people/?keywords=ai%20engineer" --account acc_YOUR_ACCOUNT_ID

Stream all results as NDJSON

curviate search people \
  --keywords "machine learning" \
  --location 90009551 \
  --network-distance 2 \
  --all \
  --account acc_YOUR_ACCOUNT_ID

Search companies with the filter escape hatch

curviate search companies \
  --filters '{"follower_count_range":{"min":500,"max":5000}}' \
  --location 106967730 \
  --account acc_YOUR_ACCOUNT_ID

Find recent AI posts from your network

curviate search posts \
  --keywords "large language models" \
  --sort-by date \
  --date-posted past-week \
  --account acc_YOUR_ACCOUNT_ID

Search jobs posted in the last week, remote only

curviate search jobs \
  --keywords "prompt engineer" \
  --location 90009551 \
  --job-type full_time \
  --presence remote \
  --date-posted 7 \
  --all \
  --account acc_YOUR_ACCOUNT_ID

Find groups by keyword

curviate search groups "gtm engineering" --account acc_YOUR_ACCOUNT_ID

Search the Services vertical

# Resolve a service category first, then search
curviate search service-parameters --type service_category --keywords "marketing" --account acc_YOUR_ACCOUNT_ID
 
curviate search services --service-category 100 --location 106967730 --connections 1,2 --account acc_YOUR_ACCOUNT_ID
COMPANY · LEGAL

Privacy Policy

Redmer Holding GmbHLast updated July 25, 2026

Who we are

Curviate is operated by Redmer Holding GmbH ("Curviate", "we", "us"), a German GmbH registered at Amtsgericht Bonn, HRB 29957, registered address Hostertstraße 16, 53332 Bornheim, Germany. Full company details are on our Imprint. We haven't appointed a statutory Data Protection Officer, since our processing doesn't reach the scale or sensitivity that requires one. Privacy questions go to privacy@curviate.com.

The two roles we play

When you create an account and use Curviate, we process your own data (identity, billing, API keys, connector authorizations). For that data, we are the controller.

When you use Curviate to act on your own connected LinkedIn account, viewing profiles, sending messages, managing engagement, that content and those contacts belong to that account and its people. You are the controller of that data; we are the processor, acting only on your instructions, under the Data Processing Agreement between us. If one of your contacts has a question about being reached through Curviate, you're who they should contact first; email privacy@curviate.com if you need help routing it.

What we collect, and why

DataWhy
Account identity (name, email, sign-in method)Create and secure your account
Your LinkedIn credentialsOperate the actions you request
LinkedIn content returned by an API callFulfil that specific request, nothing more
API keys and connector (OAuth) authorizationsAuthenticate your API, CLI, MCP, or SDK requests
Billing detailsCharge you correctly and meet our tax obligations
Usage and security logsKeep the service reliable and abuse-free
Support messagesRespond to you
Website analytics, only if you opt inUnderstand how the site is used

We rely on our contract with you, our legitimate interest in running and securing the service, our legal obligations (tax law, for example), and, for analytics, your consent. We never sell your data or use it to train models.

Where it's processed, and who else touches it

Our infrastructure runs in the EU. Hosting: Railway. Database and auth: Supabase, Ireland. Email: Resend. Payments: Stripe. Network security: a DDoS-protection provider sits in front of our app and never sees or stores request content. LinkedIn connectivity: a third-party infrastructure provider that lets us execute LinkedIn actions on your behalf. Error tracking: Sentry, Frankfurt. Product analytics: PostHog, Frankfurt. Uptime monitoring: Better Stack.

We give the current, named list of every provider above, plus our Data Processing Agreement, to any customer who asks: security@curviate.com.

Outside the EU

All customer LinkedIn data, account data, and telemetry are processed and stored exclusively in EU regions of our sub-processors. A few providers we rely on (Stripe and Sentry, for example) are headquartered outside the EU/EEA; where that applies, it's covered by their own GDPR safeguards, typically the EU Standard Contractual Clauses.

How long we keep it

DataRetention
Account and workspace dataWhile your account is active
Closed accountRecoverable for 7 days, then deleted on day 8
LinkedIn credentialsUntil you disconnect that account
LinkedIn contentNot stored; any transient cache clears within 1 hour, never indexed, never used for training
API keysUntil you revoke or rotate them
Connector (OAuth) authorizationsAccess token ~1 hour; refresh token up to ~12 months, or until you revoke it, whichever comes first
Billing recordsAs required by German tax law, currently up to 10 years
LogsA short operational window; metadata only, never message content

The 12-month figure above is a server-side credential for a connected AI agent or app. It is not a cookie and doesn't touch your browser session; see Cookies below for that. You can see and revoke every connector from Authorized applications in your dashboard at any time.

Cookies

We keep cookies to a minimum, and ask before anything beyond the essentials runs.

Strictly necessary, no consent needed:

NamePurposeExpiry
cc_cookieRemembers your cookie choice12 months
curviate-themeRemembers light/dark mode (local storage, not a cookie)Persistent
sb-*-auth-tokenKeeps you signed inWhile active; cleared on sign-out

Analytics, only if you accept:

NamePurposeExpiry
_gaGoogle Analytics: distinguishes visitors2 years
_gidGoogle Analytics: distinguishes visitors24 hours
_ga_<container id>Google Analytics: persists session state2 years

No advertising cookies, ever. Accept and reject are equally easy, and you can change your mind any time via Cookie Preferences in the footer; we won't ask again for 12 months unless something material changes. Our LinkedIn connect flow and OAuth authorization screen never set anything beyond the essentials, so no banner appears there.

Connecting an AI agent or app

Curviate is built for AI agents and automated clients as much as for people. If you connect an app like Claude, or your own code, via an API key or an OAuth connector, it can act on your workspace within the access you gave it. What it does with anything it receives back, including what it sends to its own AI model, is between you and that provider; review its practices before connecting it. Review and revoke any connection any time from your dashboard.

Your rights

You can access, correct, delete, restrict, or object to your data, port it elsewhere, and withdraw consent at any time: email privacy@curviate.com. Closing your account starts the 7-day recoverable window above. We don't make automated decisions about you that have a legal or similarly significant effect. You can also complain to a supervisory authority; ours is the Landesbeauftragte für Datenschutz und Informationsfreiheit Nordrhein-Westfalen (LDI NRW), www.ldi.nrw.de, though you're free to complain to the one in your own country instead.

Keeping it secure

Credentials are encrypted and never logged, returned, or shared. LinkedIn actions run through native, humanized flows; full detail is on our Security & Compliance page. If a breach puts your rights at risk, we'll notify the authorities and you, as GDPR requires. Curviate isn't directed at, or offered to, anyone under 16.

Changes

We'll update this page when our practices change, and reset the cookie prompt if the change is material.

Contact