# Authentication Source: https://docs.datamagnet.co/api-reference/authentication Authenticate Datamagnet API requests with bearer tokens. Learn how to generate API keys, attach them to requests, and rotate credentials safely. # Authentication You need to authenticate your requests to access any of the endpoints in the Datamagnet API. This guide explains how authentication works. Datamagnet uses bearer tokens to authenticate your API requests. ## Authentication with bearer token The recommended way to authenticate with the Datamagnet API is by using OAuth2. When you establish a connection using OAuth2, you need your access token — you can find it in the [Datamagnet dashboard → API Keys](https://datamagnet.co/app/api-keys). Here's how to add the token to the request header using cURL: ```bash Example request with bearer token theme={null} curl https://api.datamagnet.co/api/v1/person \ -H "Authorization: Bearer {token}" ``` Always keep your token safe and reset it if you suspect it has been compromised. # Company Profile Source: https://docs.datamagnet.co/api-reference/endpoints/company POST https://api.datamagnet.co/api/v1/company Fetch structured data for a LinkedIn company profile including name, industry, headcount, headquarters, specialties, and recent updates. # Company **Cost:** `1` credit / successful request. (Extra charges might be incurred if premium optional parameters are used. Please read the description of the parameters that you intend to use) The `company_insights` flag costs an additional **10 credits**, charged only when the insights request succeeds. The `get_funding_rounds` flag costs an additional **5 credits**, charged only when the funding rounds request succeeds. Get structured data of a Company Profile. ## Company profile endpoint This endpoint allows you to get structured data of a LinkedIn Company Profile. ### Required attributes **url** `string` *required* The LinkedIn URL of the company. ### Optional attributes **use\_cache** `string` Alters the caching behavior. * `if-present` - The default behavior. Fetches profile from cache regardless of age of profile. If the profile is not available in cache, the API fetches it live. * `if-recent` - API will make a best effort to return a fresh profile no older than 29 days. * `never` - Do not ever read profile from cache. **lang** `string` The language in which you need your response. **company\_insights** `boolean` Appends LinkedIn-native company insights (headcount trends, hiring trends, notable alumni, job openings by function, and median employee tenure) to `insights`. `false` by default. Costs an additional `10` credit, subject to data availability, on top of the base endpoint cost. **get\_funding\_rounds** `boolean` Looks up the company's funding round history (using the `website` from the company profile) and appends it to `funding_rounds`. `false` by default. Costs an additional `5` credits, subject to data availability, on top of the base endpoint cost. Same data as the standalone [Funding Rounds](/api-reference/endpoints/funding-rounds) endpoint. ### Response ```json Response theme={null} { "message": { "company_id": "1441", "company_name": "Google", "universal_name_id": "google", "formatted_url": "https://www.linkedin.com/company/google", "url": "https://www.linkedin.com/company/google", "company_type": "Public Company", "company_size": "10,001+ employees", "employee_count": "327,095", "description": "A problem isn't truly solved until it's solved for all...", "info": "Google | 39,995,212 followers on LinkedIn...", "tagline": null, "industry": "Software Development", "about_industry": "Software Development", "headquarters": "Mountain View, CA", "location": "Mountain View, CA", "country_code": "US", "hq_address": { "address": "1600 Amphitheatre Parkway, Mountain View, CA 94043, US", "city_state": "Mountain View, CA 94043, US", "is_primary": true, "map_url": "https://www.bing.com/maps?where=...", "street_address": "1600 Amphitheatre Parkway" }, "all_locations": [ "1600 Amphitheatre Parkway, Mountain View, CA 94043, US", "111 8th Ave, New York, NY 10011, US" ], "locations": [ { "address": "1600 Amphitheatre Parkway, Mountain View, CA 94043, US", "city_state": "Mountain View, CA 94043, US", "is_primary": true, "map_url": "https://www.bing.com/maps?where=...", "street_address": "1600 Amphitheatre Parkway" } ], "get_directions_url": [ { "directions_url": "https://www.bing.com/maps?where=..." } ], "founded_year": "1998", "followers": "39,995,212", "website": "https://goo.gle/3DLEokh", "profile_pic_url": "https://media.licdn.com/dms/image/...", "background_cover_image_url": "https://media.licdn.com/dms/image/...", "specialties": [ "search", "ads", "mobile", "android", "online video" ], "additional_information": "Google jobs 127,126 open jobs...", "crunchbase_url": "https://www.crunchbase.com/organization/google...", "stock_info": null, "funding": { "crunchbase_url": "https://www.crunchbase.com/organization/google...", "investors": [ { "logo_url": "https://media.licdn.com/dms/image/...", "name": "Kleiner Perkins", "url": "https://www.crunchbase.com/organization/..." } ], "last_round": { "amount": "US$ 25.0M", "date": "Wed, 07 Jul 1999 00:00:00 GMT", "type": "Series unknown" }, "total_rounds": 3 }, "investors": [ { "logo_url": "https://media.licdn.com/dms/image/...", "name": "Kleiner Perkins", "url": "https://www.crunchbase.com/organization/..." } ], "jobs": [ { "open_jobs_count": 127126, "title": "Google jobs", "url": "https://www.linkedin.com/jobs/google-jobs..." } ], "employees": [ { "image_url": "https://media.licdn.com/dms/image/...", "name": "Linus Upson", "profile_url": "https://www.linkedin.com/in/linusupson?trk=org-employees" } ], "affiliated_pages": [ { "category": "Technology, Information and Internet", "location": "Mountain View, CA", "logo_url": "https://media.licdn.com/dms/image/...", "name": "Google for Developers", "url": "https://www.linkedin.com/showcase/googledevelopers/..." } ], "similar_pages": [ { "industry": "Software Development", "location": "Redmond, Washington", "logo_url": "https://media.licdn.com/dms/image/...", "name": "Microsoft", "url": "https://www.linkedin.com/company/microsoft..." } ], "update_data": [ { "comments": "48", "content": "This week, we expanded the Gemini 3 model family...", "posted_time": "Sat, 20 Dec 2025 16:22:15 GMT", "reaction_types": ["LIKE", "PRAISE", "EMPATHY"], "reactions": "624" } ], "input": "https://www.linkedin.com/company/google", "extracted_contacts": { "emails": [], "personal_emails": [], "professional_emails": [], "phone_numbers": [] } }, "credit_used": 1 } ``` ```json Not found theme={null} { "error": "Company does not exist.", "retryable": false, "credit_used": 1 } ``` ```json Could not fetch theme={null} { "error": "Could not fetch the page. Try again after some time", "retryable": true, "credit_used": 0 } ``` ### Not found and failed lookups Both answer HTTP `200` with an `error` and a `retryable` flag instead of `message`: * `retryable: false`: LinkedIn has no company page at this URL (a removed page, or a slug that was never claimed). The lookup ran, so it costs `1` credit. Repeating it gives the same answer. * `retryable: true`: we could not get an answer in time. Nothing is charged; retry later. Fields a company page does not show (a founding year, a website, a headquarters) are `null`. Small or placeholder pages often leave several of them out. ## The company model This contains the structured data of a company's LinkedIn profile. ### Properties #### Basic information **company\_id** `string` Unique LinkedIn identifier for the company. **company\_name** `string` Company name. **universal\_name\_id** `string` Universal LinkedIn identifier (vanity URL). **formatted\_url** `string` Formatted LinkedIn company page URL. **url** `string` LinkedIn company page URL. **company\_type** `string` Type of company (e.g., "Public Company", "Private Company", "Partnership"). **company\_size** `string` Employee headcount range (e.g., "10,001+ employees"). **employee\_count** `string` Number of employees on LinkedIn, as a string with thousands separators (e.g. `"4,040"`). `null` when the page does not show it. **tagline** `string` Company tagline or slogan. #### Company description **description** `string` Detailed company description. **info** `string` Additional information about the company. **additional\_information** `string` Extended information including job listings and other details. #### Industry and specialties **industry** `string` Primary industry of the company. **about\_industry** `string` Detailed industry classification. **specialties** `array` List of company specialties and focus areas. #### Location information **headquarters** `string` Headquarters location (city, state/country). **location** `string` Primary geographic location. **country\_code** `string` ISO country code (e.g., "US", "UK"). **hq\_address** `object` Detailed headquarters address. **HQ Address object** **address** `string` Full address string. **street\_address** `string` Street address. **city\_state** `string` City, state, and postal code. **is\_primary** `boolean` Whether this is the primary location. **map\_url** `string` Bing Maps URL for directions. **all\_locations** `array` List of all company locations (addresses as strings). **locations** `array` Detailed list of all company locations. **Location object** **address** `string` Full address. **street\_address** `string` Street address. **city\_state** `string` City and state information. **is\_primary** `boolean` Primary location flag. **map\_url** `string` Map URL for this location. **get\_directions\_url** `array` List of map/directions URLs for all locations. **Directions object** **directions\_url** `string` URL to get directions. #### Company statistics **founded\_year** `string` Year the company was founded. `null` when the page does not list one. **followers** `string` Number of LinkedIn followers. #### Online presence **website** `string` Company website URL. **profile\_pic\_url** `string` Company logo URL. **background\_cover\_image\_url** `string` Company cover/banner image URL. **crunchbase\_url** `string` The funding-profile link shown on the company's LinkedIn page. When the page shows none and `get_funding_rounds` is `true`, this is filled from `funding_rounds.crunchbase_url` (unless `funding_rounds.name_verified` is `false`). #### Funding information **stock\_info** `object` Stock market information (if publicly traded). **funding** `object` Funding information shown on the company's LinkedIn page. **Funding object** **crunchbase\_url** `string` Funding-profile link. **total\_rounds** `number` Total funding rounds. **last\_round** `object` Details of most recent funding round. **Last round object** **amount** `string` Funding amount. **date** `string` Date of funding round. **type** `string` Type of funding round. **investors** `array` List of investors. **Investor object** **name** `string` Investor name. **logo\_url** `string` Investor logo URL. **url** `string` Investor profile URL. **investors** `array` Direct list of company investors. #### Jobs and employees **jobs** `array` Available job listings on LinkedIn. **Job object** **title** `string` Job category title. **open\_jobs\_count** `number` Number of open positions. **url** `string` URL to view jobs. **employees** `array` Sample of company employees on LinkedIn. **Employee object** **name** `string` Employee name. **image\_url** `string` Employee profile picture URL. **profile\_url** `string` Employee LinkedIn profile URL. #### Related pages **affiliated\_pages** `array` List of affiliated company pages (subsidiaries, products, etc.). **Affiliated page object** **name** `string` Page name. **category** `string` Industry category. **location** `string` Location. **logo\_url** `string` Page logo URL. **url** `string` LinkedIn page URL. **similar\_pages** `array` List of similar companies. **Similar page object** **name** `string` Company name. **industry** `string` Company industry. **location** `string` Company location. **logo\_url** `string` Company logo URL. **url** `string` LinkedIn company page URL. #### Recent updates **update\_data** `array` Recent company posts and updates. **Update object** **content** `string` Post content text. **posted\_time** `string` When the update was posted. **reactions** `string` Total reaction count. **comments** `string` Number of comments. **reaction\_types** `array` Types of reactions (LIKE, PRAISE, EMPATHY, etc.). #### Insights **insights** `object` Present only when the `company_insights` request flag is `true`. On failure this contains `{ "error": "Unable to fetch this data at this time." }` instead of data, and no extra credit is charged. **Insights object** **headcount\_insights** `object` Total employee count and headcount growth over time. **Headcount insights object** **title** `string` Section title. **total\_employees** `number` Current total employee count. **growth\_periods** `array` Headcount change over different lookback windows (`month_difference`, `month_difference_str`, `change_percentage`, `change_percentage_str`). **headcount\_growth** `array` Monthly headcount history (`employee_count`, `date`). **function\_headcount\_insights** `object` Employee distribution and headcount growth broken down by job function. **Function headcount insights object** **title** `string` Section title. **latest\_headcount\_by\_function** `object` Most recent snapshot: `headcount_by_function` (array of `percentage`, `urn`, `employee_count`, `name`), `total_count`, `year_month_on`. **headcount\_growth\_by\_function** `array` Per-function headcount growth (`urn`, `name`, `growth_periods`). **hires\_insights** `object` Hiring trends over time. **Hires insights object** **title** `string` Section title. **total\_hires** `number` Total hires tracked. **hire\_counts** `array` Monthly hire counts (`all_employee_hire_count`, `year_month_on`). **alumni\_insights** `object` Notable people who previously worked at the company. **Alumni insights object** **title** `string` Section title. **total\_number\_of\_alumni** `number` Total tracked alumni. **alumni** `array` List of alumni (`exited_position`, `exit_year_month_on`, `profile` with `full_name`/`url`/`username`). **job\_openings\_insights** `object` Job openings by function and their growth trends. **Job openings insights object** **title** `string` Section title. **job\_openings\_by\_function** `array` Snapshots of open roles by function over time (`total_count`, `year_month_on`, `count_by_function`). **job\_openings\_growth\_all\_functions** `array` Overall job openings growth (`month_difference`, `month_difference_str`, `change_percentage`, `change_percentage_str`). **jobs\_openings\_growth\_unselected\_functions** `array` Job openings growth for functions not individually broken out. **job\_openings\_growth\_by\_function** `array` Per-function job openings growth (`urn`, `name`, `growth_periods`). **median\_employee\_tenure** `number` Median employee tenure in years. #### Funding rounds **funding\_rounds** `object` Present only when the `get_funding_rounds` request flag is `true`. On failure this contains `{ "error": "Unable to fetch this data at this time." }` instead of data, and no extra credit is charged. See the [Funding Rounds](/api-reference/endpoints/funding-rounds) endpoint for the full field reference. **Funding rounds object** **domain** `string` Company domain that was looked up. **crunchbase\_url** `string` Link to the company's public funding profile. `null` if no funding data was found. **matched\_via** `string` How the company was found: `domain` or `company_name`. **name\_verified** `boolean` Whether the matched company's name lines up with the profile's `company_name`. **total\_rounds** `integer` Number of funding rounds returned. **total\_raised\_usd** `integer` Total amount raised across all rounds, in USD. **total\_raised\_formatted** `string` Human-readable total raised (e.g. `$11.60B`). **rounds** `array` List of funding rounds, most recent first. #### Request echo and contacts **input** `string` The LinkedIn URL the profile was collected from. **extracted\_contacts** `object` Email addresses and phone numbers the company published on its page (About section, page description, its own posts). LinkedIn has no structured contact field for companies, so this is often empty. No extra credit is charged. **Contacts object** **emails** `array` Every address found: `email`, `type`, `domain`, `sources`. **personal\_emails** `array` The subset on consumer mailboxes (Gmail, Outlook and the like). **professional\_emails** `array` Every other address. **phone\_numbers** `array` Numbers found: `number` (as written), `e164` (normalised, `null` when it cannot be resolved), `raw`, `sources`, and `country_code`, `region`, `line_type`, `is_valid`. # Company Search DB Source: https://docs.datamagnet.co/api-reference/endpoints/company-db-search POST https://api.datamagnet.co/api/v1/company/search/db Search Datamagnet's own database of company profiles by industry, location, headcount, type, founding year and LinkedIn identity — firmographic filters over previously collected records. # Company Search DB **Cost:** `10` credits/search. Search Datamagnet's internal database of company profiles by firmographics. Like [People Search DB](/api-reference/endpoints/people-db-search), this queries records already collected rather than fetching live, so it returns instantly and doesn't consume collection capacity. Each page returns up to `500` companies. ## Company search DB endpoint Every list field is OR'd within itself and AND'd across fields — `industries: ["Retail", "Restaurants"]` with `countries: ["US"]` means retail **or** restaurants, in the US. **At least one filter is required.** A search with none is refused with a `422`, uncharged: there is no useful answer to "return anything" over 38 million companies. > [!WARNING] > > Most of these filters match the stored value **exactly**, not as a substring — that is what lets an index answer them on a table this size. Exact means exact: `company_types: ["Privately Held"]` matches, `["private"]` matches nothing. Where a field has more than one spelling in the data, pass every spelling you want, and see the coverage table at the end for how much of the database each field is filled on. > > `industries` is the exception. It is resolved against a known vocabulary before it is matched, so one name finds every spelling of that industry and a shorthand widens rather than matching nothing — `["software"]` becomes the nine industries with "software" in the name. Still exact against the index, just not against your word. See below. ### Industry and type **industries** `string[]` Filter by industry. Pass one of the [443 industry names](/api-reference/values/employer-industries) — `Medical Practices`, `Construction`, `Restaurants`, `Retail`, `Real Estate`, `Insurance`, `Software Development`. **One name finds every spelling of the industry.** Three things used to split one industry across several values here, and all three are now folded: the 2022 LinkedIn rename (`Computer Software` is the legacy spelling of `Software Development`), the casing (`telecommunications` and `Telecommunications` are separate stored values), and the punctuation (`Information Technology & Services` versus `information technology and services`). `Software Development` alone now matches 908,623 companies where it used to match 660,254. A shorthand of 4+ characters widens to the industries containing it. A word we don't recognise is a `422` with near misses, never an empty result. Example: `["Software Development"]` **company\_types** `string[]` Filter by company type, matched exactly. Values seen in the data: `Privately Held`, `Public Company`, `Nonprofit`, `Self-Owned`, `Self-Employed`, `Partnership`, `Government Agency`, `Educational`. Example: `["Privately Held", "Public Company"]` **entity\_types** `string[]` What kind of LinkedIn page this is: `company`, `school` or `showcase`. Case-insensitive. Example: `["company"]` ### Location **countries** `string[]` Filter by country as an ISO-3166-1 alpha-2 code, not a name — `US`, not `United States`. Case-insensitive. Example: `["US", "GB", "DE"]` **regions** `string[]` State, province or other first-level region, matched exactly as stored. Example: `["California", "Texas"]` **cities** `string[]` City, matched exactly as stored. Example: `["San Francisco", "Austin"]` ### Size **min\_employees** `integer` Minimum employee count. This is the numeric headcount, filled on about 42% of companies — for broader coverage use `size_bands`, which is filled on 98%. Example: `50` **max\_employees** `integer` Maximum employee count. Example: `500` **size\_bands** `string[]` Filter by LinkedIn's headcount band, matched exactly as stored: `1 employee`, `2-10 employees`, `11-50 employees`, `51-200 employees`, `201-500 employees`, `501-1,000 employees`, `1,001-5,000 employees`, `5,001-10,000 employees`, `10,001+ employees`. Older records carry shorter spellings of the same bands (`1-10`, `11-50`) and a few carry `0+ employees`. Pass every spelling you want matched — these are exact comparisons, not ranges. Example: `["11-50 employees", "51-200 employees"]` ### Age and reach **founded\_min** `integer` Founded in or after this year. Example: `2010` **founded\_max** `integer` Founded in or before this year. The founding year is stored as free text, so it is read as the first four digits of the value — `1998-2000 (relocated 2015)` reads as 1998, `2,024` reads as 2024. A company whose stored value holds no year at all never matches either bound. Example: `2020` **min\_followers** `integer` Minimum LinkedIn follower count. Example: `1000` ### Web presence **has\_website** `boolean` `true` returns only companies we hold a website for, `false` only those we hold none for. Like the contactability filters on the people search, this describes our records rather than the company. Example: `true` ### LinkedIn identity **linkedin\_ids** `string[]` Filter by numeric LinkedIn company ID. Exact match, and the fastest way to hydrate a list of companies you already know. Example: `["1035", "1441"]` **linkedin\_usernames** `string[]` Filter by LinkedIn universal name — the last path segment of the company URL. Case-insensitive, exact match. Example: `["stripe", "plaid"]` ### Paging > [!NOTE] > > Results are **not ordered**. Nothing worth sorting by is indexed on a table this size, so a sort would mean collecting every match before returning a page of them. Paging with `limit`/`offset` is therefore best-effort: it walks the result set, but the order it walks in is not guaranteed to be stable between calls. **limit** `integer` (default: 50) Maximum number of companies to return per page, from `1` to `500`. A value outside that range is rejected rather than quietly reduced. **offset** `integer` (default: 0) Number of results to skip, for pagination. ### Unrecognised fields A field name this endpoint doesn't know is not applied. The search still runs, and the response carries an `ignored_filters` array naming what was dropped — so a mistyped `industry` (for `industries`) shows up as a named mistake instead of a page of results that looks filtered but isn't. If **every** filter in the request was unrecognised, the search is refused with a `422` and no credits are charged. *** ## Response ```json Request theme={null} { "industries": ["Software Development"], "countries": ["US"], "regions": ["California"], "size_bands": ["51-200 employees", "201-500 employees"], "company_types": ["Privately Held"], "founded_min": 2010, "min_followers": 1000, "has_website": true, "limit": 50, "offset": 0 } ``` ```json Response theme={null} { "message": [ { "id": 84210, "linkedin_id": "1035", "username": "examplesoft", "linkedin_url": "https://www.linkedin.com/company/examplesoft", "entity_type": "company", "name": "ExampleSoft", "industry": "Software Development", "headcount_range": "51-200 employees", "employee_count": 138, "company_type": "Privately Held", "founded": "2013", "followers": 8421, "domain": "https://examplesoft.com", "headquarters": "San Francisco, California, United States", "hq_city_state": "San Francisco, California", "country_code": "US", "region": "California", "city": "San Francisco", "updated_at": "2026-08-02T09:14:55" } ], "credit_used": 10, "total": 1 } ``` ## The response model Results never carry the company description, the long-form `info` block or the raw collected payload. Those three are the bulk of the stored record, and a search that returned them would spend its whole budget fetching them. Use [Company](/api-reference/endpoints/company) on a result's `linkedin_url` for the full profile. **message** `array` List of matching companies. **Company object** **id** `integer` Internal Datamagnet company ID. **linkedin\_id** `string` Numeric LinkedIn company ID. **username** `string` LinkedIn universal name (the last segment of the company URL). **linkedin\_url** `string` LinkedIn company page URL. **entity\_type** `string` `company`, `school` or `showcase`. **name** `string` Company name. **industry** `string` LinkedIn industry taxonomy string. **headcount\_range** `string` LinkedIn headcount band, e.g. `51-200 employees`. **employee\_count** `integer` Numeric employee count, when available. **company\_type** `string` e.g. `Privately Held`, `Public Company`, `Nonprofit`. **founded** `string` Founding year as stored. Free text: usually a year, occasionally a range. **followers** `integer` LinkedIn follower count. **domain** `string` Company website. **headquarters** `string` Full headquarters location string. **hq\_city\_state** `string` Headquarters city and region. **country\_code** `string` ISO-3166-1 alpha-2 country code. **region** `string` State, province or first-level region. **city** `string` City. **updated\_at** `string` When this record was last refreshed. Every figure above is as old as this timestamp — read it beside `employee_count` and `followers` in particular. **credit\_used** `integer` Number of credits used for this request. Example: `10` **total** `integer` Number of results returned in this response. **ignored\_filters** `string[]` Present only when the request contained field names this endpoint doesn't recognise. Names them, so a typo shows up as a typo rather than as results that look filtered but aren't. ## Field coverage A filter can only return companies whose record holds that field, so coverage is the real ceiling on any search. Measured across 38.4M companies on 2026-09-22: | Filter | Field is filled on | | - | - | | `size_bands` | 97.8% | | `countries` | 87.8% | | `industries` | 85.3% | | `regions` | 77.3% | | `cities` | 73.1% | | `has_website` | 72.0% | | `min_followers` | 64.2% | | `company_types` | 43.3% | | `min_employees` / `max_employees` | 41.8% | | `founded_min` / `founded_max` | 37.4% | Combining a well-covered filter with a sparse one narrows twice: `min_employees` with `founded_min` can only return the companies that carry both. ## Errors | Status | Meaning | What to do | | - | - | - | | `400` | The body was not a JSON object, or `limit` was outside `1`–`500`, or `offset` was negative. `message` names the problem. | Fix the request. | | `422` | The request carried no filters at all, every filter in it was an unrecognised field name, or `industries` named something that is none of the [443](/api-reference/values/employer-industries). `message` lists what is accepted, with near misses for an industry. | Add a filter, or correct the name or value. | | `504` | The search ran too long to answer. | Narrow it and retry — a country or a size band alongside the industry. | Nothing is charged on any error. # Company Posts Source: https://docs.datamagnet.co/api-reference/endpoints/company-posts POST https://api.datamagnet.co/api/v1/company/posts Retrieve posts published on a LinkedIn company page by URL, including text, media, engagement counts, and timestamps for content monitoring. # Company Posts **Cost:** `10` credits / successful request. This endpoint retrieves posts from a LinkedIn company page based on the provided company URL. The response includes details about the company's posts, including text content, attachments, reactions, comments, and more. ## Company posts endpoint This endpoint allows you to get structured data of posts from a LinkedIn Company Profile. ### Required attributes **url** `string` *required* The LinkedIn company URL whose posts you want to retrieve. ### Optional attributes **type** `string` Alters the type of posts to be fetched. * `all` - The default behavior. Fetches all types of posts. * `articles` - Fetch only articles posted by the company. * `documents` - Fetch only document posts. **cursor** `string` Use this parameter to paginate through results. Use the cursor returned from your previous request. ### Response ```json Response theme={null} { "cursor": "eyJjb3VudCI6MTAwLCJzdGFydCI6MTAwLCJ0b3RhbCI6MzY1...", "total": 365, "message": [ { "attachments": [ { "subtitle": "Google", "title": "Gemini 3 Flash is rolling out now — hear from the Googlers who helped make it", "type": "Article", "url": "https://www.linkedin.com/pulse/gemini-3-flash...", "urn": "urn:li:linkedInArticle:7407901974379008000" } ], "author": { "followers": 39995212, "logo": "https://media.licdn.com/dms/image/...", "name": "Google", "public_identifier": "google", "type": "Company", "url": "https://www.linkedin.com/company/google", "urn": "urn:li:fsd_company:1441" }, "comments": 48, "created_at": "2025-12-20T16:06:30.020Z", "is_repost": false, "likes": 624, "mentions": [], "reactions": [ { "count": 552, "reaction_type": "LIKE" }, { "count": 33, "reaction_type": "PRAISE" }, { "count": 21, "reaction_type": "EMPATHY" } ], "shared_post": null, "shares": 52, "text": "This week, we expanded the Gemini 3 model family with the release of Gemini 3 Flash...", "url": "https://www.linkedin.com/feed/update/urn:li:activity:7408175976368472064/", "urn": "urn:li:activity:7408175976368472064" }, { "attachments": [], "author": { "background_image": null, "first_name": "Kent", "followers": null, "image_url": "https://media.licdn.com/dms/image/...", "last_name": "Walker", "occupation": "President, Global Affairs at Google & Alphabet", "public_identifier": "kent-walker-5963bb198", "type": "Member", "url": "https://www.linkedin.com/in/kent-walker-5963bb198", "urn": "urn:li:fsd_profile:ACoAAC5VbIIBM7MqyDczwsY_EinOMS5UTJRqITo" }, "comments": 24, "created_at": "2025-12-19T19:30:50.350Z", "is_repost": true, "likes": 295, "mentions": [], "original_post_urn": "urn:li:ugcPost:7407823617180340224", "reactions": [ { "count": 254, "reaction_type": "LIKE" }, { "count": 21, "reaction_type": "INTEREST" } ], "repost_user": {}, "shared_post": null, "shares": 29, "text": "As we close out another year, I've been thinking a lot about perceptions of AI...", "url": "https://www.linkedin.com/feed/update/urn:li:activity:7407865012054142977/", "urn": "urn:li:activity:7407865012054142977" } ] } ``` ### How far back posts go A company page's posts go back about 12 months. Older posts are not available, and the `cursor` is empty once the feed reaches that point. ### Empty and failed responses * A company page with no posts answers `200` with `"message": []` and no cursor, charged as a normal request. * A company page that does not exist answers HTTP `404` with `"message": "Company does not exist."` and `"retryable": false`. The lookup ran, so it is charged like a successful request; repeating it gives the same answer. * When the posts could not be fetched for a temporary reason, the response is HTTP `400` with `"status": "failed"`, a `message` string and a `request_id`. Nothing is charged; retry later. ## The company posts model ### Properties **cursor** `string` Pagination token for fetching more posts. Use this in the next request to get the next page. `null` when there are no more posts. A page can hold fewer than 100 posts and still be the last one (posts LinkedIn no longer serves are dropped), so read the end of the feed from `cursor`, not from the page length. **total** `integer` How many posts LinkedIn reports for the company's feed. LinkedIn serves roughly the last twelve months of a company's posts, so this can be lower than the number the company has ever published. `null` when the count is not available. **message** `array` List of company posts. **Post object** #### Post Content **text** `string` Text content of the post. **url** `string` LinkedIn URL of the post. **urn** `string` Unique LinkedIn URN identifier for the post. **created\_at** `string` ISO 8601 timestamp when the post was created. #### Post Type **is\_repost** `boolean` Whether this post is a repost/share of another post. **original\_post\_urn** `string` URN of the original post (if this is a repost). **original\_post\_url** `string` LinkedIn URL of the original post (if this is a repost). A repost is its own post with its own URL, so use this URL, not `url`, to read the original's reactions with [Post Reactions](/api-reference/endpoints/post-reactions). **repost\_user** `object` Information about the user who reposted (for company reposts of member content). Often an empty object. **shared\_post** `object` The original post, when the company quoted it with commentary of its own. A plain repost has no commentary: the post itself carries the original's content and `shared_post` is `null`. Either way, `original_post_urn` names the original. #### Post Author **author** `object` Details about the post author (company or person). **Author object - Company** **name** `string` Company name. **type** `string` Author type ("Company" or "Member"). **url** `string` LinkedIn company page URL. **public\_identifier** `string` Company vanity URL identifier. **logo** `string` Company logo URL. **followers** `number` Number of company followers. **urn** `string` Company URN identifier. Can be an empty string; use `url` or `public_identifier` to identify the author. **Author object - Member** **first\_name** `string` Author's first name (for member posts). **last\_name** `string` Author's last name (for member posts). **occupation** `string` Author's LinkedIn headline. **type** `string` Author type ("Member"). **url** `string` LinkedIn profile URL. **public\_identifier** `string` Profile vanity URL identifier. **image\_url** `string` Profile picture URL. **background\_image** `string` Profile background image URL. **followers** `number` Number of profile followers (may be null). **urn** `string` Profile URN identifier. #### Attachments **attachments** `array` List of media attachments (images, videos, articles, documents). **Attachment object** **type** `string` Type of attachment ("Image", "Video", "Document", "Article", etc.). **url** `string` URL of the attachment or article. **title** `string` Title of the attachment. **subtitle** `string` Subtitle or source of the attachment. **text** `string` Description or caption text. **urn** `string` URN identifier for the attachment. #### Engagement Metrics **likes** `number` Total number of likes/reactions. **comments** `number` Number of comments on the post. **shares** `number` Number of times the post was shared/reposted. **reactions** `array` Breakdown of reactions by type. **Reaction object** **count** `number` Number of this reaction type. **reaction\_type** `string` Type of reaction: "LIKE", "PRAISE", "EMPATHY", "INTEREST", "APPRECIATION", "ENTERTAINMENT", "MAYBE", "FUNNY". #### Mentions **mentions** `array` List of @mentioned users or companies in the post. # Credit Balance Source: https://docs.datamagnet.co/api-reference/endpoints/credits GET https://api.datamagnet.co/api/v1/credit-check Check your current Datamagnet API credit balance to monitor usage and avoid running out of credits during high-volume data collection runs. # Credit Balance **Cost:** `0` credit. Get your current credit(s) balance ## View credit balance endpoint ### Response ```json Response theme={null} { "remaining_credits": 10000, "total_credits": 10000, "used_credits": 0, "api_key": "xxxxxx" } ``` ## The credit model ### Properties **remaining\_credits** `integer` The number of credits remaining in the account. **total\_credits** `integer` The total number of credits in the account. **used\_credits** `integer` The number of credits used in the account. **api\_key** `string` API key used in the request. # Funding Rounds Source: https://docs.datamagnet.co/api-reference/endpoints/funding-rounds POST https://api.datamagnet.co/api/v1/company/funding-rounds Retrieve a company's funding history by domain, with structured data on each round including amount raised, round type, and announcement date. # Funding Rounds **Cost:** `5` credits / successful request. Get a company's funding round history by domain. This same data can also be attached directly to a [Company Profile](/api-reference/endpoints/company) response via the `get_funding_rounds` flag. ## Funding rounds endpoint This endpoint identifies the company from its domain and returns its funding round history. ### Required attributes **domain** `string` *required* Company domain (e.g. `openai.com`). A full website URL also works. ### Optional attributes **company\_name** `string` Company name. Providing this improves match accuracy. ### Response ```json Response theme={null} { "message": { "domain": "openai.com", "crunchbase_url": "https://www.crunchbase.com/organization/openai", "company": "OpenAI", "matched_via": "domain", "name_verified": true, "total_rounds": 3, "total_raised_usd": 11600000000, "total_raised_formatted": "$11.60B", "rounds": [ { "round_name": "Corporate Round", "round_type": "corporate_round", "date": "2023-01-23", "amount_usd": 10000000000, "amount_formatted": "$10.00B", "currency": "USD", "company": "OpenAI" }, { "round_name": "Secondary Market", "round_type": "secondary_market", "date": "2019-07-23", "amount_usd": 1000000000, "amount_formatted": "$1.00B", "currency": "USD", "company": "OpenAI" } ] }, "credit_used": 5 } ``` If no funding data is found for the company, `crunchbase_url` is `null` and `rounds` is an empty array — this is still a `200` response, with `credit_used: 0`. A company that is found but has no rounds yet is charged normally. If the data can't be fetched at this time, the response contains `{ "error": "Unable to fetch this data at this time." }` in `message` with `credit_used: 0`, and no credits are charged. ## The funding rounds model ### Properties **domain** `string` Company domain that was looked up. **crunchbase\_url** `string` Link to the company's public funding profile. `null` if no funding data was found. **company** `string` Company name as recorded in the funding record. **matched\_via** `string` How the company was found: `domain` or `company_name`. `null` if no funding data was found. **name\_verified** `boolean` Whether the matched company's name lines up with the `company_name` you provided. `null` if `company_name` wasn't provided. **total\_rounds** `integer` Number of funding rounds returned. **total\_raised\_usd** `integer` Total amount raised across all rounds, in USD. **total\_raised\_formatted** `string` Human-readable total raised (e.g. `$11.60B`). **rounds** `array` List of funding rounds, most recent first. **Funding round object** **round\_name** `string` Human-readable round name (e.g. "Series A", "Corporate Round"). **round\_type** `string` Machine-readable investment type (e.g. `series_a`, `corporate_round`). **date** `string` Date the round was announced (YYYY-MM-DD). **amount\_usd** `integer` Amount raised in this round, converted to USD. **amount\_formatted** `string` Human-readable amount raised (e.g. `$1.2M`). **currency** `string` Currency of the original investment. **company** `string` Name of the funded company. # ICP Company Search Source: https://docs.datamagnet.co/api-reference/endpoints/icp-company-search POST https://api.datamagnet.co/api/v1/people-search/search/company Find target accounts with ICP filters for industry, headcount, revenue, technology, and location. Uses human-readable values — no IDs required. # ICP Company Search **Cost:** `10` credits per page. Search for companies using Datamagnet's ICP Search. Filter by industry, location, headcount, revenue, technology stack, and more. > [!TIP] > > Use `GET /api/v1/people-search/filters` to see all valid values for any filter. No credits consumed. ## Request body > [!NOTE] > > `keywords` is not supported here — company search ignores free-text queries. Use the structured filters below, or [ICP People Search](/api-reference/endpoints/icp-people-search), which does support `keywords`. Sending it returns `400`. **page** `integer` (default: 1) Page number. Minimum value is `1`. **industry** `string | string[]` Industry name(s). Over 300 industries supported. See [Filter Reference](/api-reference/endpoints/icp-search-filters#industry). Example: `"Software Development"` **location** `string | string[]` City, region, or country. Example: `"San Francisco"` or `["San Francisco", "London"]` **company\_headcount** `string | string[]` Company size range(s). Valid values: `1-10`, `11-50`, `51-200`, `201-500`, `501-1,000`, `1,001-5,000`, `5,001-10,000`, `10,001+`. Example: `["501-1,000", "1,001-5,000"]` **company\_type** `string | string[]` Company type(s). Valid values: `Public`, `Private`, `Non Profit`, `Educational`, `Government`. Example: `"Public"` **technology** `string | string[]` Technologies used by the company. Example: `"Salesforce"` or `["Salesforce", "HubSpot"]` **followers\_count** `string | string[]` LinkedIn follower count range. Valid values: `1-50`, `51-100`, `101-1000`, `1001-5000`, `5001+`. Example: `"1001-5000"` *** ## Response ```json Response theme={null} { "success": true, "results": [ { "company_id": "15285098", "company_name": "Stripe", "description": "Stripe is a technology company that builds economic infrastructure for the internet.", "industry": "Financial Services", "employee_count_range": "1001-5000", "employee_count": 4000, "company_url": "https://www.linkedin.com/company/stripe/", "logo_url": "https://media.licdn.com/dms/image/..." } ], "pagination": { "page": 1, "total": 134, "count": 25, "start": 0 }, "filters_applied": 3 } ``` ## Response fields **success** `boolean` `true` on success. **results** `array` List of matching companies. **Company object** **company\_id** `string` Internal company identifier. **company\_name** `string` Company name. **description** `string` Company description (nullable). **industry** `string` Industry (nullable). **employee\_count\_range** `string` Employee count range string (nullable). **employee\_count** `integer` Approximate employee count (nullable). **company\_url** `string` LinkedIn company profile URL (nullable). **logo\_url** `string` Company logo URL (nullable). **pagination** `object` **Pagination object** **page** `integer` Current page number. **total** `integer` Total results across all pages. **count** `integer` Results on this page. **start** `integer` Offset of the first result. **filters\_applied** `integer` Number of filters applied to this search. # ICP People Search Source: https://docs.datamagnet.co/api-reference/endpoints/icp-people-search POST https://api.datamagnet.co/api/v1/people-search/search Find decision-makers with ICP filters for job title, seniority, function, company name, LinkedIn URL, company ID, location, and industry. # ICP People Search **Cost:** `10` credits per page. Search for people using Datamagnet's ICP Search. Pass filter values as plain strings — the API handles all resolution internally. > [!TIP] > > Use `GET /api/v1/people-search/filters` to see all valid values for any filter. No credits consumed. ## Request body **page** `integer` (default: 1) Page number. Minimum value is `1`. **keywords** `string` Free-text query, matched across the whole profile (headline, summary, positions) rather than one attribute. Applied alongside the structured filters, so it narrows them rather than replacing them. Maximum 500 characters. Example: `"Representative Director"` **partial** `boolean` (default: false) What to do when a filter value cannot be resolved (a title LinkedIn's typeahead has no entry for, a company name that matches nothing). By default the search is refused with `422` and nothing is charged. With `true`, the search runs on everything that did resolve: only the refused values are dropped, never a whole field that resolved in part, and each dropped value is listed in `filter_errors`. A field whose values all fail is dropped entirely, so a `company_name` that matches nothing would search every company. Check `filter_errors` before trusting a partial result. **job\_title** `string | string[]` Job title(s) to filter by. Example: `"CTO"` or `["CTO", "Chief Technology Officer"]` **company\_name** `string | string[]` Company name(s). Resolved via Sales Navigator suggest API. Example: `"Stripe"` or `["Stripe", "Plaid"]` **company\_linkedin\_urls** `string | string[] | object[]` LinkedIn company page URL(s). The API scrapes each URL to extract the company's LinkedIn ID and name — no manual lookup needed. Supports include/exclude. ```json theme={null} "company_linkedin_urls": [ "https://www.linkedin.com/company/salesforce/", { "value": "https://www.linkedin.com/company/competitor/", "exclude": true } ] ``` **company\_ids** `integer | integer[] | object[]` Raw LinkedIn company numeric ID(s). Builds the filter with the ID directly — no text resolution needed. Must be integers; strings will return a validation error. Supports include/exclude. ```json theme={null} "company_ids": [1441, { "value": 9876, "exclude": true }] ``` **location** `string | string[]` City, region, or country. Example: `"San Francisco"` or `["San Francisco", "New York"]` **seniority** `string | string[]` Seniority level(s). See [Filter Reference](/api-reference/endpoints/icp-search-filters#seniority-level) for all valid values. Example: `["CXO", "Vice President"]` **company\_headcount** `string | string[]` Company size range(s). Valid values: `1-10`, `11-50`, `51-200`, `201-500`, `501-1,000`, `1,001-5,000`, `5,001-10,000`, `10,001+`. Example: `["501-1,000", "1,001-5,000"]` **industry** `string | string[]` Industry name(s). Over 300 industries supported. See [Filter Reference](/api-reference/endpoints/icp-search-filters#industry). Example: `"Software Development"` **company\_type** `string | string[]` Company type(s). Valid values: `Public`, `Private`, `Non Profit`, `Educational`, `Government`. Example: `"Public"` **function** `string | string[]` Department/function. Valid values include: `Engineering`, `Marketing`, `Sales`, `Finance`, `Operations`, `Product Management`, and more. Example: `"Engineering"` **school** `string | string[]` University or school name(s). Example: `"MIT"` **technology** `string | string[]` Technologies used by the person's company. Example: `"Salesforce"` **years\_in\_position** `string | string[]` Years in current role. Valid values: `Less than 1 year`, `1 to 2 years`, `3 to 5 years`, `6 to 10 years`, `More than 10 years`. Example: `"1 to 2 years"` **recently\_changed\_jobs** `string | boolean` People who recently started a new position — Sales Navigator's **Changed jobs** spotlight. One value, so a boolean works: send `true`, or the string `"Changed Jobs"`. `false` is the same as omitting the field — it does not ask for people who have *not* changed jobs. See [Filter Reference](/api-reference/endpoints/icp-search-filters#recently-changed-jobs). Example: `true` **posted\_on\_linkedin** `string | boolean` People who have recently posted on LinkedIn — Sales Navigator's **Posted on LinkedIn** spotlight. One value, so a boolean works: send `true`, or the string `"Posted on LinkedIn"`. `false` is the same as omitting the field — it does not ask for people who have *not* posted. See [Filter Reference](/api-reference/endpoints/icp-search-filters#posted-on-linkedin). Example: `true` **followers\_count** `string | string[]` LinkedIn follower count range. Valid values: `1-50`, `51-100`, `101-1000`, `1001-5000`, `5001+`. Example: `"1001-5000"` **profile\_language** `string | string[]` Language the profile is written in. Valid values include `English`, `Spanish`, `French`, `German`, and more. Example: `"English"` *** ## Company filter options Three ways to filter by company — use whichever fits your data: | Field | What you provide | | - | - | | `company_name` | Company name as a string | | `company_linkedin_urls` | LinkedIn company page URL(s) | | `company_ids` | LinkedIn numeric company ID(s) | > [!NOTE] > > All three fields can be combined in the same request. *** ## Include / exclude Every filter supports negative matching. Wrap a value in an object with `"exclude": true` to exclude it: ```json theme={null} { "company_linkedin_urls": [ "https://www.linkedin.com/company/salesforce/", { "value": "https://www.linkedin.com/company/competitor-co/", "exclude": true } ], "company_ids": [ 1441, { "value": 9876, "exclude": true } ], "seniority": "CXO" } ``` *** ## Refused values A value that cannot be resolved refuses that value, not the search as a whole. Unless `partial` is `true`, the response is `422`, costs nothing, and names every refused value, one entry each: ```json theme={null} { "success": false, "error": "Some filters could not be applied, so the search was not run.", "details": [ {"field": "job_title", "value": "CSM", "error": "No results found for 'CSM' in 'job_title'. Try a more specific query."}, {"field": "job_title", "value": "BD Executive", "error": "No results found for 'BD Executive' in 'job_title'. Try a more specific query."}, {"field": "company_name", "value": "Arzule", "error": "No results found for 'Arzule' in 'company_name'. Try a more specific query."} ], "hint": "Fix or remove these values. Send \"partial\": true to run the search without them; the rest of each filter still applies.", "credit_used": 0, "request_id": "..." } ``` Titles resolve against LinkedIn's own typeahead, so write them the way LinkedIn lists them: full words, in English, no abbreviations (`"Customer Success Manager"`, not `"CSM"`). A phrase LinkedIn does not standardise belongs in `keywords`. An unknown field *name* is reported in `filter_errors` but does not refuse the search. ## Response ```json Request theme={null} { "company_linkedin_urls": [ "https://www.linkedin.com/company/salesforce/", { "value": "https://www.linkedin.com/company/competitor-co/", "exclude": true } ], "company_ids": [1441, { "value": 9876, "exclude": true }], "seniority": ["CXO", "Vice President"], "keywords": "Representative Director", "page": 1 } ``` ```json Response theme={null} { "success": true, "results": [ { "full_name": "Jane Doe", "first_name": "Jane", "last_name": "Doe", "location": "San Francisco Bay Area", "title": "Chief Technology Officer", "company": "Stripe", "company_id": "2135371", "is_current": true, "started_on": { "month": 9, "year": 2022 }, "tenure_years": 3, "tenure_months": 2, "summary": null, "profile_url": "https://www.linkedin.com/sales/lead/ACwAAABcDeFgHiJkLmNoPqRsTuVwXyZ01234,NAME_SEARCH", "profile_picture": "https://media.licdn.com/dms/image/...", "open_link": false } ], "pagination": { "page": 1, "total": 247, "count": 25, "start": 0 }, "filters_applied": 4, "filter_errors": [], "credit_used": 10 } ``` ## Response fields **success** `boolean` `true` on success. **results** `array` List of matching people profiles. **Profile object** **full\_name** `string` Full name. **first\_name** `string` First name. **last\_name** `string` Last name. **location** `string` Geographic region. **title** `string` Current job title. **company** `string` Current company name. **company\_id** `string` LinkedIn company id of the role shown in `title` and `company` (nullable). A company filter matches a person's current roles, and the role shown here is their primary one, so compare this id with the company you searched for if you need exactly that role. **is\_current** `boolean` Whether the role shown is a current one (nullable). **started\_on** `object` Start of the role shown, as `{month, year}` (nullable). **tenure\_years** `integer` Years in current role (nullable). **tenure\_months** `integer` Months in current role (nullable). **summary** `string` Profile summary (nullable). **profile\_url** `string` Sales Navigator lead URL. The person is identified by URN rather than a vanity slug, so this URL does **not** resolve anonymously — fetching it unauthenticated returns HTTP `999` from LinkedIn. Treat it as a stable identifier for the lead, not as a page to fetch. **profile\_picture** `string` Profile picture URL (nullable). **open\_link** `boolean` Whether the profile is an OpenLink profile. **pagination** `object` **Pagination object** **page** `integer` Current page number. **total** `integer` Total results across all pages. **count** `integer` Results on this page. **start** `integer` Offset of the first result. **filters\_applied** `integer` Number of filters applied to this search. **filter\_errors** `array` Every value that was dropped from this search, one entry each with `field`, `value` and `error`, plus any unknown field names. Only non-empty on a `partial: true` request or when an unknown field name was sent; otherwise a refused value is a `422` (see Refused values above). **credit\_used** `integer` Credits actually charged for this request. A request that returns no results, or that fails before reaching the search, is charged `0`. # ICP Search — Filter Reference Source: https://docs.datamagnet.co/api-reference/endpoints/icp-search-filters Complete reference for every filter available in the Datamagnet ICP Search endpoints, including job title, seniority, industry, headcount, and location. # ICP Search Filter Reference All filter values are human-readable strings — no internal IDs required. Pass them directly in your search request. Use `GET /api/v1/people-search/filters` to retrieve all valid values at once — useful for populating dropdowns. No credits consumed. ```bash theme={null} curl https://api.datamagnet.co/api/v1/people-search/filters \ -H "Authorization: Bearer " ``` > [!NOTE] > > Filters come in two kinds, and `/people-search/filters` reports both. > > **Closed vocabularies** — seniority, headcount, company type, function, industry and the rest — have a fixed set of values, listed under `filters`. Pick from those exactly. > > **Free-text filters** — `location`, `job_title`, `company_name`, `school`, `technology` — are resolved from whatever string you send, so they have no value list. They are listed under `filters.dynamic_fields` with a description instead of values. Use [`/people-search/suggest`](/api-reference/endpoints/icp-suggest) to preview how a given string will resolve. *** ## Seniority level Filter people by their seniority level in the organization. | Value | Aliases | | - | - | | `Owner` | | | `Partner` | | | `CXO` | `C-Level` | | `Vice President` | `VP` | | `Director` | | | `Experienced Manager` | `Manager` | | `Entry Level Manager` | | | `Strategic` | | | `Senior` | | | `Entry Level` | | | `In Training` | `Intern` | **Example:** ```json theme={null} { "seniority": ["CXO", "Vice President", "Director"] } ``` *** ## Company headcount Filter by the number of employees at the company. | Value | | - | | `Self-Employed` | | `1-10` | | `11-50` | | `51-200` | | `201-500` | | `501-1,000` | | `1,001-5,000` | | `5,001-10,000` | | `10,001+` | **Example:** ```json theme={null} { "company_headcount": ["501-1,000", "1,001-5,000"] } ``` *** ## Company type | Value | Aliases | | - | - | | `Public` | `Public Company` | | `Private` | `Privately Held` | | `Non Profit` | `Nonprofit` | | `Educational` | `Educational Institution` | | `Partnership` | | | `Self Employed` | | | `Government` | `Government Agency` | **Example:** ```json theme={null} { "company_type": "Public" } ``` *** ## Company name Pass any company name as a string. Accepts a single value or an array. **Example:** ```json theme={null} { "company_name": "Stripe" } ``` ```json theme={null} { "company_name": ["Stripe", "Plaid"] } ``` *** ## Job title Pass any job title as a string. Accepts a single value or an array. **Example:** ```json theme={null} { "job_title": "CTO" } ``` ```json theme={null} { "job_title": ["CTO", "Chief Technology Officer"] } ``` *** ## Location City, region, or country. Accepts a single value or an array. **Example:** ```json theme={null} { "location": "San Francisco" } ``` ```json theme={null} { "location": ["San Francisco", "New York", "London"] } ``` *** ## Industry Over 300 industries are supported. Values are case-insensitive and partial matching is supported (e.g. `"software"` matches `"Software Development"`). Use `GET /api/v1/people-search/filters` to get the full sorted list. **Sample values:** ``` Software Development, Financial Services, Healthcare, Manufacturing, Retail, Education, Real Estate, Consulting, Marketing Services, IT Services and IT Consulting, Banking, Insurance, ... ``` **Example:** ```json theme={null} { "industry": "Software Development" } ``` *** ## School University or school name. Accepts a single value or an array. **Example:** ```json theme={null} { "school": "MIT" } ``` *** ## Technology Technologies used by the person's company. Accepts a single value or an array. **Example:** ```json theme={null} { "technology": ["Salesforce", "HubSpot"] } ``` *** ## Function / department Filter by the person's functional department. | Value | | - | | `Accounting` | | `Administrative` | | `Arts and Design` | | `Business Development` | | `Consulting` | | `Customer Success` | | `Education` | | `Engineering` | | `Entrepreneurship` | | `Finance` | | `Healthcare` | | `Human Resources` | | `Information Technology` | | `Legal` | | `Marketing` | | `Media` | | `Military` | | `Operations` | | `Product Management` | | `Program Management` | | `Purchasing` | | `Quality Assurance` | | `Real Estate` | | `Research` | | `Sales` | | `Support` | **Example:** ```json theme={null} { "function": ["Engineering", "Product Management"] } ``` *** ## Years in current position | Value | Aliases | | - | - | | `Less than 1 year` | `<1` | | `1 to 2 years` | `1-2` | | `3 to 5 years` | `3-5` | | `6 to 10 years` | `6-10` | | `More than 10 years` | `10+` | **Example:** ```json theme={null} { "years_in_position": "1 to 2 years" } ``` *** ## Followers count Filter by the number of LinkedIn followers. | Value | | - | | `1-50` | | `51-100` | | `101-1000` | | `1001-5000` | | `5001+` | **Example:** ```json theme={null} { "followers_count": "1001-5000" } ``` *** ## Recent activities Filter by recent company activity signals. | Value | Aliases | | - | - | | `Funding` | `Funding Events` | | `Leadership Changes` | `Senior Leadership Changes` | **Example:** ```json theme={null} { "recent_activities": "Funding" } ``` *** ## Job opportunities Filter to companies actively hiring. | Value | | - | | `Hiring` | **Example:** ```json theme={null} { "job_opportunities": "Hiring" } ``` *** ## Recently changed jobs Sales Navigator's **Changed jobs** spotlight: people who recently started a new position. LinkedIn decides what counts as recent — the filter carries no date range of its own. It is a single checkbox in Sales Navigator, so it has one value. | Value | Aliases | | - | - | | `Changed Jobs` | `Recently Changed Jobs`, `Job Change` | **Example:** ```json theme={null} { "recently_changed_jobs": "Changed Jobs" } ``` A boolean works too, which usually reads better for a one-value filter: ```json theme={null} { "recently_changed_jobs": true } ``` > [!NOTE] > > `false` means *do not filter on this* and is the same as leaving the field out — not "people who have **not** changed jobs". Sales Navigator offers this spotlight as an include-only checkbox, so there is no tested way to ask for the opposite. Combine it with the filters that describe who you are looking for: ```json theme={null} { "recently_changed_jobs": true, "seniority": ["CXO", "Owner", "Vice President"], "company_headcount": ["1-10", "11-50"], "industry": "Telecommunications", "location": "United States" } ``` *** ## Posted on LinkedIn Sales Navigator's **Posted on LinkedIn** spotlight: people who have recently posted on LinkedIn. LinkedIn decides what counts as recent — the filter carries no date range of its own. Like **Changed jobs**, it is a single checkbox in Sales Navigator with one value. | Value | Aliases | | - | - | | `Posted on LinkedIn` | `Recently Posted`, `Posted Recently` | **Example:** ```json theme={null} { "posted_on_linkedin": true } ``` > [!NOTE] > > `false` means *do not filter on this* and is the same as leaving the field out — not "people who have **not** posted". Sales Navigator offers this spotlight as an include-only checkbox, so there is no tested way to ask for the opposite. It combines with the other filters, including **Changed jobs**: ```json theme={null} { "posted_on_linkedin": true, "seniority": ["CXO", "Owner", "Vice President"], "company_headcount": ["1-10", "11-50"], "industry": "Telecommunications", "location": "United States" } ``` *** ## Profile language Filter by the language the person's profile is written in. | Value | Value | Value | | - | - | - | | `Arabic` | `English` | `Spanish` | | `Portuguese` | `Chinese` | `French` | | `Italian` | `Russian` | `German` | | `Dutch` | `Turkish` | `Tagalog` | | `Polish` | `Korean` | `Japanese` | | `Malay` | `Norwegian` | `Danish` | | `Romanian` | `Swedish` | `Indonesian` | | `Czech` | | | **Example:** ```json theme={null} { "profile_language": "English" } ``` *** ## Include / exclude syntax Every filter supports negative matching. To exclude a value, wrap it in an object with `"exclude": true`: ```json theme={null} { "company_name": [ "Stripe", { "value": "PayPal", "exclude": true } ] } ``` This returns people who work at Stripe **but not** PayPal. Explicit form using `selection`: ```json theme={null} { "value": "PayPal", "selection": "EXCLUDED" } ``` # ICP Search — Suggest Source: https://docs.datamagnet.co/api-reference/endpoints/icp-suggest GET https://api.datamagnet.co/api/v1/people-search/suggest/{suggest_type} Autocomplete suggestions for ICP Search filter fields including company name, job title, industry, and location for building typeahead UIs. # ICP Search Suggest **Cost:** `1` credit. Returns typeahead suggestions for filter fields such as company name, job title, location, school, and technology. Useful for building autocomplete dropdowns in your UI. Results are cached server-side for fast repeated lookups. ## Path parameters **suggest\_type** `string` *required* The type of suggestion to retrieve. Must be one of: | Value | Used for | | - | - | | `company` | `company_name` filter | | `job_title` | `job_title` filter | | `location` | `location` filter | | `school` | `school` filter | | `technology` | `technology` filter | | `function` | `function` filter | ## Query parameters **q** `string` *required* The search query string. Example: `?q=Stripe` ## Example ```bash theme={null} curl "https://api.datamagnet.co/api/v1/people-search/suggest/company?q=Stripe" \ -H "Authorization: Bearer " ``` ```json Response theme={null} { "success": true, "results": [ { "label": "Stripe", "value": "Stripe", "id": "15285098", "meta": { "employees": "1001-5000", "industry": "Financial Services", "location": "US", "logo": "https://media.licdn.com/dms/image/..." } }, { "label": "Stripe Japan", "value": "Stripe Japan", "id": "67890123", "meta": { "employees": "51-200", "industry": "Financial Services", "location": "JP", "logo": null } } ], "cached": false } ``` ## Response fields **success** `boolean` `true` on success. **results** `array` List of matching suggestions. The top result is the best match. **Suggestion object** **label** `string` Display label shown in UI. **value** `string` The string to pass in a search request. **id** `string` Internal identifier. **meta** `object` Additional context. Fields vary by type: * **company**: `employees`, `industry`, `location`, `logo` * **school**: `employees`, `location` * **location**: `headline` **cached** `boolean` `true` if the result was served from the server-side cache. # Job Change Search Source: https://docs.datamagnet.co/api-reference/endpoints/job-changes-search POST https://api.datamagnet.co/api/v1/job-changes/search Search job-change events — people starting a new role, leaving a company, or being promoted — filtered by company, title, location and recency. # Job Change Search **Cost:** `10` credits per page. A page with no matches costs `0`. Job changes are the highest-intent signal in B2B: a new VP of Engineering buys differently in week three than in month nine, and the person who just left your customer is the reason that account is about to churn. This endpoint returns those events as a feed you can poll. Each event says what happened (`joined`, `left`, `title_change`), when it happened, when we detected it, and who it happened to — with the person and the company already attached, so a single call gives you something you can act on without a second lookup. ## Freshness, and why staleness is ordered rather than hidden Results are sorted by freshness. The feed opens with same-day detections; events we detected long after the fact surface as you page deeper. Every real dated event is included — a stale one is ordered later, never dropped. Each event carries `detection_lag_days`, the number of days between the change happening and our detection of it. Lower is fresher. > [!TIP] > > Poll page `1` on a schedule and stop as soon as `detection_lag_days` exceeds what you have already processed. That gives you the new events without paging through history every run. ## Request body **event\_type** `string` Restrict to one kind of event. Omit to receive all three. | Value | Meaning | | - | - | | `joined` | The person started a new position at the company. | | `left` | The person is no longer at the company. | | `title_change` | The person's title changed at the same company. | **organization\_ids** `string | string[]` Filter to specific companies, by the `organization_id` returned on every event. Exact match, and more precise than a name search. Accepts an array or a comma-separated string. Up to 50 companies per request, counted across this field and `company_urls` together. ```json theme={null} "organization_ids": ["dm_org_edmab4ei56y3w6cgktcgegllpqrxdbnlt4aqk"] ``` **company\_urls** `string | string[]` Filter to specific companies by LinkedIn company URL, or by the slug at the end of one. Use this the first time you track a company, when you do not have its `organization_id` yet — the response gives you the id to use from then on. ```json theme={null} "company_urls": ["https://www.linkedin.com/company/stripe/", "figma"] ``` A company we do not yet track returns `400`. Resolving a URL is slower than passing an id, so prefer the id once you have it. **title** `string` Word-match on the new job title. Minimum 3 characters. Example: `"Engineering"` matches `VP of Engineering` and `Engineering Manager`. **geo\_city** `string` Partial match on the person's current city. Minimum 3 characters. Example: `"Berlin"` **geo\_country\_code** `string` Two-letter country code for the person's current location. Case-insensitive. Example: `"DE"` > [!NOTE] > > The two geo filters narrow the search but are not echoed back on the events — they filter on a location the event record does not carry. If you need the person's location, fetch their profile with `person.linkedin_url`. **days\_ago** `integer` Recency window on the **detection** time, in days. Range `1`–`365`. Omit it to search all events. Example: `7` returns everything detected in the last week, whenever the change itself happened. **page** `integer` (default: 1) Page number, 1-based. Maximum `10000`; anything higher returns `400`. **limit** `integer` (default: 25) Events per page. Range `1`–`50`. > [!NOTE] > > This endpoint also accepts `GET` with the same attributes as query parameters, e.g. > `GET /api/v1/job-changes/search?event_type=joined&days_ago=7&title=Engineering`. > > In a query string, list fields are comma-separated: `?organization_ids=dm_org_abc,dm_org_def`. *** ## Company filter options Two ways to name a company — use whichever you have: | Field | What you provide | Cost | | - | - | - | | `organization_ids` | An `organization_id` from a previous response | Fastest; no extra work | | `company_urls` | A LinkedIn company URL or slug | One resolution step the first time each company is seen | Both can be combined in the same request. A company named by both counts once. *** ## Working with ids Every event carries two Datamagnet ids: * `person.profile_id` — `dm_prsn_…` * `organization.organization_id` — `dm_org_…` They are stable: the same person and the same company are the same id in every response, for ever, so they work as keys in your own database. `organization_id` is Datamagnet's own identifier for that company — the same one our company records are keyed by — so an id you store today keeps working as we add more about that company. To pull the full record behind an event, use the LinkedIn URL that comes with it: * `person.linkedin_url` → [Person](/api-reference/endpoints/people) * `organization.linkedin_url` → [Company](/api-reference/endpoints/company) *** ## Response ```json Request theme={null} { "event_type": "joined", "title": "Engineering", "geo_country_code": "DE", "days_ago": 7, "page": 1, "limit": 25 } ``` ```json Response theme={null} { "success": true, "message": "Job change events retrieved successfully", "data": [ { "event_type": "title_change", "detected_at": "2026-05-01T17:20:04.389921Z", "changed_at": "2026-05-01T00:00:00Z", "detection_lag_days": 0, "title": { "current": "Data Engineer", "previous": "Data Analyst" }, "person": { "profile_id": "dm_prsn_tnd66ysw4lmt4yighsalfnmf2tcanlpmp3exh6q", "handle": "lecomte-quentin", "full_name": "Quentin Lecomte", "first_name": "Quentin", "last_name": "Lecomte", "headline": "Data Engineer @ Aktivco | Camusat Group", "linkedin_url": "https://linkedin.com/in/lecomte-quentin" }, "organization": { "organization_id": "dm_org_33u32yb3sh56d6jxiw3lzljselgver2p4ons6", "name": "AktivCo", "slug": "activco", "linkedin_url": "https://www.linkedin.com/company/activco" } } ], "pagination": { "page": 1, "limit": 25, "has_more": true }, "credit_used": 10 } ``` Every event returns the same set of keys. A field an event does not have comes back as `null` rather than being omitted, so your parsing code never has to branch. ### Dates, and the two of them `changed_at` is when the change took effect. `detected_at` is when we saw it. `detection_lag_days` is the gap, in days. `title.previous` is only meaningful on `title_change` and `left`; a `joined` event has no title to have replaced, so it comes back `null`. ### Pagination `pagination.has_more` tells you whether another page exists. Keep incrementing `page` while it is `true`, up to the `10000` page cap. An empty `data` array with `has_more: false` means you have reached the end of the feed for those filters — and costs `0` credits. *** ## Errors | Status | Meaning | What to do | | - | - | - | | `400` | A filter was invalid — an unknown `event_type`, a text filter under 3 characters, `days_ago` outside 1–365, `limit` above 50, a page above 10000, or a company we do not track. `message` names the problem. | Fix the request. Nothing is charged. | | `401` | Missing or invalid API key. | Send your key as `Authorization: Bearer YOUR_API_KEY` — see [Authentication](/api-reference/authentication). | | `403` | Your plan does not include job change data. | Contact us at [signals@datamagnet.co](mailto:signals@datamagnet.co). | | `429` | Rate limit for your plan exceeded. | Back off and retry; see the `X-RateLimit-*` response headers. | | `503` | Job change search is temporarily unavailable — temporary capacity limits, not a fault in your request. | Retry after the number of seconds in the `Retry-After` header: `60` when the search is being rate limited, longer when capacity is exhausted. Nothing is charged. | Nothing is charged on any error. # Job Details Source: https://docs.datamagnet.co/api-reference/endpoints/job-details POST https://api.datamagnet.co/api/v1/jobs/detail Fetch a LinkedIn job posting by job ID or URL — title, description, location, seniority, employment type, workplace type, apply links, application counts and the hiring company. # Job Details **Cost:** `1` credit / successful request. (`include_hiring_team` adds `1` credit, charged only when the section is returned.) Get structured data for a single LinkedIn job posting. Provide either the numeric job ID or any LinkedIn job URL — the API extracts the ID for you. `data` is the posting itself: its own fields, the apply counts and links alongside them, and the hiring company nested under `company_info`. Every request returns the same set of keys; a field a posting does not publish comes back as `null` rather than being omitted, so your parsing code never has to branch. ## Job details endpoint ### Required attributes **job\_id** `string` The numeric LinkedIn job posting ID, e.g. `"4443378596"`. Either `job_id` or `url` is required. If both are supplied, `job_id` wins. **url** `string` Any LinkedIn job URL. The posting ID is extracted automatically from all common formats: * `https://www.linkedin.com/jobs/view/4443378596` * `https://www.linkedin.com/jobs/view/generative-ai-engineer-at-hcltech-4443378596` * `https://www.linkedin.com/jobs/search/?currentJobId=4443378596` ### Optional attributes **include\_hiring\_team** `boolean` (default: false) Adds the `hiring_team` key: the job poster and any recruiters LinkedIn lists on the posting, with their name, headline, profile URL and photo. Costs an additional `1` credit, charged only when the section is returned. A posting with nobody listed returns an empty `members` array and is billed; a posting whose hiring team could not be retrieved omits the key entirely and is not billed. > [!NOTE] > > This endpoint also accepts `GET` with the same attributes as query parameters, e.g. > `GET /api/v1/jobs/detail?job_id=4443378596&include_hiring_team=true`. ### Response ```json Response theme={null} { "success": true, "message": "response retrieved successfully", "data": { "title": "Generative AI Engineer", "standardized_title": "Generative AI Engineer", "description": "🚀 HCLTech Exclusive Walk-In Drive | AIML Developer - Are you passionate about Artificial Intelligence, Machine Learning, and Generative AI?...", "description_html": "

🚀 HCLTech Exclusive Walk-In Drive | AIML Developer - Are you passionate about...

", "location": "Noida, Uttar Pradesh, India", "location_id": "104869687", "employment_status": "Full-time", "is_remote_allowed": false, "is_third_party_sourced": false, "listed_at": "2026-07-21T13:36:54Z", "expire_at": "2026-08-20T13:36:54Z", "closed_at": null, "job_url": "https://www.linkedin.com/jobs/view/4443378596", "experience_level": "Associate", "industries": ["IT Services and IT Consulting"], "job_functions": ["Engineering", "Research"], "is_new": false, "original_listed_at": "2026-07-21T13:36:54Z", "job_state": "LISTED", "workplace_types": ["ONSITE"], "country_code": "in", "job_posting_id": "4443378596", "is_reposted": false, "job_application_limit_reached": false, "eligible_for_referrals": false, "posted_time_ago": "3 weeks ago", "seniority_level": "Associate", "salary": null, "salary_min": null, "salary_max": null, "salary_currency": null, "salary_period": null, "benefits": null, "required_skills": [], "applicant_tracking_system": "LinkedIn", "total_applies": 0, "total_views": 0, "is_application_limit_reached": false, "application_url": "https://www.linkedin.com/job-apply/4443378596", "is_easy_apply": true, "applicant_count_text": null, "company_info": { "name": "HCLTech", "description": "HCLTech is a global technology company, home to more than 223,000 people across 60 countries...", "staff_count": 257915, "industries": ["IT Services and IT Consulting"], "specialities": ["Manufacturing", "Aerospace & Defense", "Financial Services", "Telecom"], "universal_name": "hcltech", "headquarters": { "line1": null, "city": "Noida", "geographicArea": "Uttar Pradesh", "postalCode": "201301", "country": "IN", "$type": "com.linkedin.common.Address" }, "url": "https://www.linkedin.com/company/hcltech", "logo_url": "https://media.licdn.com/dms/image/v2/C4D0BAQF-RIoeeMTMKQ/company-logo_200_200/...", "background_cover_url": "https://media.licdn.com/dms/image/v2/D4D3DAQEVwVTGwE1eXA/image-scale_191_1128/...", "company_id": "1756", "website": null, "followers": 9571613, "company_size": "10001+", "company_type": null, "founded_year": null } }, "credit_used": 1, "credit_addon": 0 } ``` ## The job details model ### Properties **success** `boolean` Whether the posting was retrieved. **message** `string` A human-readable status. On failure this explains what went wrong. **credit\_used** `integer` Credits charged for the posting itself. `0` on any error response. **credit\_addon** `integer` Extra credits charged for optional sections that were returned. **data** `object | null` The job posting. `null` on any error response. **Data object** #### Identity **title** `string` The job title as written on the posting. **standardized\_title** `string | null` LinkedIn's normalized title for the role, e.g. a posting titled `"Gen AI Engineer"` standardizes to `"Artificial Intelligence Engineer"`. Useful for grouping postings that describe the same job in different words. **job\_posting\_id** `string` The numeric posting ID, as a string. **job\_url** `string` Canonical LinkedIn URL for the posting, free of tracking parameters. #### Description **description** `string` The full job description as plain text, with paragraph and bullet breaks preserved. **description\_html** `string | null` The same description as HTML — `

`, `