openapi: 3.2.0 info: title: Datacircle Harvest API version: '1' description: Datacircle is a data co-op. termsOfService: https://datacircle.dev/terms contact: name: Datacircle url: https://datacircle.dev email: wayne@datacircle.dev x-logo: url: https://datacircle.dev/favicon.png altText: Datacircle servers: - url: https://api.datacircle.dev security: - token: [] tags: - name: HarvestAPI description: 'LinkedIn Profile API: HarvestAPI''s own request, sent to api.datacircle.dev with your Datacircle key and `X-Data-Provider: harvestapi`.' paths: /linkedin/profile: get: tags: - HarvestAPI summary: Get one LinkedIn profile description: 'Send HarvestAPI''s own request (`GET https://api.harvest-api.com/linkedin/profile`) to api.datacircle.dev, with your Datacircle key in `Authorization` and `X-Data-Provider: harvestapi`. The path and the query stay the same. We charge $0.0037 per profile HarvestAPI finds, with no markup. A profile HarvestAPI doesn''t find costs $0.0023.' parameters: - name: url in: query required: true description: The profile's LinkedIn URL, e.g. `https://www.linkedin.com/in/williamhgates`. The only HarvestAPI parameter Datacircle passes on. schema: type: string example: https://www.linkedin.com/in/williamhgates - name: X-Data-Provider in: header required: true description: 'Names the provider: `harvestapi`. This header and the host are the only changes from the provider''s own request.' schema: type: string enum: - harvestapi default: harvestapi example: harvestapi x-codeSamples: - lang: bash label: curl source: "curl \"https://api.datacircle.dev/linkedin/profile?url=https://www.linkedin.com/in/williamhgates\" \\\n -H \"Authorization: Token $DATACIRCLE_API_KEY\" \\\n -H \"X-Data-Provider: harvestapi\"" - lang: python label: Python source: "import os\n\nimport requests\n\nresponse = requests.get(\n \"https://api.datacircle.dev/linkedin/profile\",\n headers={\"Authorization\": f\"Token {os.environ['DATACIRCLE_API_KEY']}\", \"X-Data-Provider\": \"harvestapi\"},\n params={'url': 'https://www.linkedin.com/in/williamhgates'},\n)\nprint(response.json())" responses: '200': description: 'HarvestAPI''s answer plus `datacircle_meta`, as HarvestAPI sends it: a `200` whether it found the profile (`status: 200`, \$0.0037) or not (`element: null`, `status: 404`, `error: Profile not found`, \$0.0023: HarvestAPI bills the lookup)' content: application/json: schema: $ref: '#/components/schemas/HarvestApiProfileResponse' example: element: id: … publicIdentifier: … linkedinUrl: https://www.linkedin.com/in/williamhgates firstName: … lastName: … emails: [] headline: … websites: - … openToWork: false hiring: false premium: true influencer: true memorialized: false creator: true location: linkedinText: … countryCode: … parsed: text: … countryCode: … regionCode: null country: … countryFull: … state: … city: … objectUrn: … registeredAt: … topSkills: [] connectionsCount: 0 followerCount: 0 verified: true about: … industry: id: 0 name: … currentPosition: - position: … location: null employmentType: null workplaceType: null companyName: … companyUniversalName: … companyLinkedinUrl: … companyId: … duration: … description: null skills: null startDate: year: 0 text: … endDate: text: … companyLogo: url: … sizes: - url: … width: 0 height: 0 profileTopEducation: - schoolName: … description: null insights: null skills: null schoolLinkedinUrl: … schoolId: … degree: null fieldOfStudy: null period: … startDate: year: 0 text: … endDate: year: 0 text: … schoolLogo: url: … sizes: - url: … width: 0 height: 0 profileActions: - label: … url: … profilePicture: url: … sizes: - url: … width: 0 height: 0 coverPicture: url: … sizes: - url: … width: 0 height: 0 photo: … profileLocales: - country: … language: … primaryLocale: country: … language: … multiLocaleHeadline: - headline: … locale: … services: null experience: - position: … location: null employmentType: null workplaceType: null companyName: … companyUniversalName: … companyLinkedinUrl: … companyId: … duration: … description: null skills: null startDate: year: 0 text: … endDate: text: … companyLogo: url: … sizes: - url: … width: 0 height: 0 education: - schoolName: … description: null insights: null skills: null schoolLinkedinUrl: … schoolId: … degree: null fieldOfStudy: null period: … startDate: year: 0 text: … endDate: year: 0 text: … schoolLogo: url: … sizes: - url: … width: 0 height: 0 certifications: [] projects: [] volunteering: [] receivedRecommendations: [] skills: [] publications: [] courses: [] patents: [] honorsAndAwards: [] languages: [] organizations: [] causes: [] featured: images: [] link: null title: null subtitle: null slides: - title: … subtitle: … description: null url: … image: url: … composeOptionType: null moreProfiles: - id: … firstName: … lastName: … position: … publicIdentifier: … linkedinUrl: … sectionTotals: experience: 0 education: 0 certifications: 0 receivedRecommendations: 0 skills: 0 courses: 0 languages: 0 projects: 0 volunteering: 0 publications: 0 patents: 0 organizations: 0 honorsAndAwards: 0 causes: 0 interests: - interestName: … elements: - title: … subtitle: … link: … caption: … image: url: … query: url: https://www.linkedin.com/in/williamhgates publicIdentifier: … profileId: … status: 200 retries: 0 payments: - linkedinProfile originalQuery: url: https://www.linkedin.com/in/williamhgates cost: 0.0037 entityId: … datacircle_meta: provider: harvestapi cost_usd: 0.0037 balance_usd: 4.9963 '400': description: 'Not charged, nothing sent to HarvestAPI: no `url`, a `url` that isn''t a LinkedIn profile URL (`https://www.linkedin.com/in/`), a query parameter other than `url`, or an `X-Data-Provider` value that isn''t `up2data`, `harvestapi` or `fetchin`' content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Missing or invalid API key content: application/json: schema: $ref: '#/components/schemas/Error' '402': description: Balance too low content: application/json: schema: type: object required: - error - balance_usd properties: error: type: string description: 'Why the call was refused: your balance can''t cover it. Not charged.' balance_usd: type: number description: Your balance now, in dollars (`balance_usd` in `GET /balance/`). `POST /checkout/` adds funds. additionalProperties: false '404': description: 'No `X-Data-Provider` header, or a path Datacircle doesn''t call for that provider (e.g. `X-Data-Provider: up2data` on `/linkedin/profile`). Not charged' content: application/json: schema: $ref: '#/components/schemas/Error' '502': description: 'HarvestAPI''s own server failed: its error passes on as it came, with its status (`503` and `504` too). Not charged. Send the same request again.' '503': description: 'HarvestAPI hasn''t answered within 45 s, can''t be reached, or refused Datacircle''s own account with it: Datacircle stops waiting. Not charged. Send the same request again.' content: application/json: schema: type: object description: Datacircle's own answer when the provider hasn't answered within 45 s, retries included, or can't be reached. Not charged. required: - error - balance_usd properties: error: type: string description: What went wrong, in plain words. balance_usd: type: number description: Your balance now, in dollars (`balance_usd` in `GET /balance/`). additionalProperties: false operationId: getLinkedinProfile x-operation-id-source: derived components: schemas: HarvestApiProfile: type: object properties: about: type: - string - 'null' description: The profile's About section. causes: type: array items: type: string description: The causes the member cares about, e.g. `Education`. certifications: type: array items: type: object properties: issuedAt: type: - string - 'null' description: When, as LinkedIn shows it, e.g. `Issued Jul 1998 · Expired Jul 2018`. issuedBy: type: - string - 'null' description: Who issued it. issuedByLink: type: - string - 'null' description: The issuer's LinkedIn page. issuedByLogo: type: object properties: sizes: type: array items: type: object properties: height: type: integer description: Height, in pixels. url: type: string description: The image's URL. width: type: integer description: Width, in pixels. required: - height - url - width additionalProperties: false description: Every size LinkedIn serves. url: type: - string - 'null' description: The image's URL. required: - sizes - url additionalProperties: false description: 'The issuer''s logo: `url` (the largest image) and `sizes`, every size LinkedIn serves.' link: type: - string - 'null' description: The certificate's own URL. title: type: string description: The certification. required: - issuedAt - issuedBy - issuedByLogo - title additionalProperties: false description: Licenses and certifications. composeOptionType: type: - string - 'null' description: How LinkedIn lets someone not connected write to the member, e.g. `PREMIUM_INMAIL`. connectionsCount: type: - integer - 'null' description: The member's connections, as LinkedIn counts them (it shows `500+` past 500). courses: type: array items: type: object properties: associatedWith: type: - string - 'null' description: The job or school it came with. associatedWithLink: type: - string - 'null' description: That job's or school's LinkedIn page. number: type: - string - 'null' description: The course's number. title: type: string description: The course. required: - associatedWith - associatedWithLink - number - title additionalProperties: false description: Courses. coverPicture: type: - object - 'null' properties: sizes: type: array items: type: object properties: height: type: integer description: Height, in pixels. url: type: string description: The image's URL. width: type: integer description: Width, in pixels. required: - height - url - width additionalProperties: false description: Every size LinkedIn serves. url: type: - string - 'null' description: The image's URL. required: - sizes - url additionalProperties: false description: 'The banner image behind the photo: `url` (the largest image) and `sizes`, every size LinkedIn serves.' creator: type: boolean description: '`true` when the member has creator mode on.' currentPosition: type: array items: type: object properties: companyId: type: - string - 'null' description: LinkedIn's numeric id of the company. companyLinkedinUrl: type: - string - 'null' description: The company's LinkedIn page. companyLogo: type: - object - 'null' properties: sizes: type: array items: type: object properties: height: type: integer description: Height, in pixels. url: type: string description: The image's URL. width: type: integer description: Width, in pixels. required: - height - url - width additionalProperties: false description: Every size LinkedIn serves. url: type: string description: The image's URL. required: - sizes - url additionalProperties: false description: 'The company''s logo: `url` (the largest image) and `sizes`, every size LinkedIn serves.' companyName: type: string description: The company's name. companyUniversalName: type: - string - 'null' description: 'The company''s slug: `linkedin.com/company/`.' description: type: - string - 'null' description: Its description, as written on the profile. duration: type: - string - 'null' description: How long, as LinkedIn shows it, e.g. `16 yrs 4 mos`. employmentType: type: - string - 'null' description: Employment type, e.g. `Full-time` or `Self-employed`. endDate: type: object properties: text: type: string description: The date as LinkedIn shows it. required: - text additionalProperties: false description: 'When it ended. `text` is `Present` for a current one: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' experienceGroupId: type: - string - 'null' description: 'Groups several jobs at the same company: equal on each.' location: type: - string - 'null' description: Where the job is. position: type: string description: The job title. skills: type: - array - 'null' items: type: string description: The skills listed with it. startDate: type: - object - 'null' properties: month: type: string description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text - year additionalProperties: false description: 'When it started: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' workplaceType: type: - string - 'null' description: Where the role is worked, e.g. `On-site`, `Hybrid` or `Remote`. required: - companyId - companyLinkedinUrl - companyLogo - companyName - companyUniversalName - description - duration - employmentType - endDate - location - position - skills - startDate - workplaceType additionalProperties: false description: The member's current jobs, the same shape as `experience`. education: type: array items: type: object properties: degree: type: - string - 'null' description: The degree. description: type: - string - 'null' description: Its description, as written on the profile. endDate: type: - object - 'null' properties: month: type: - string - 'null' description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text - year additionalProperties: false description: 'When it ended. `text` is `Present` for a current one: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' fieldOfStudy: type: - string - 'null' description: The field of study. insights: type: - string - 'null' description: Activities and societies, as written on the profile. period: type: - string - 'null' description: When, as LinkedIn shows it, e.g. `1981 - 1985`. schoolId: type: - string - 'null' description: LinkedIn's numeric id of the school. schoolLinkedinUrl: type: - string - 'null' description: The school's LinkedIn page. schoolLogo: type: - object - 'null' properties: sizes: type: array items: type: object properties: height: type: integer description: Height, in pixels. url: type: string description: The image's URL. width: type: integer description: Width, in pixels. required: - height - url - width additionalProperties: false description: Every size LinkedIn serves. url: type: - string - 'null' description: The image's URL. required: - sizes - url additionalProperties: false description: 'The school''s logo: `url` (the largest image) and `sizes`, every size LinkedIn serves.' schoolName: type: string description: The school. skills: type: - array - 'null' items: type: string description: The skills listed with it. startDate: type: - object - 'null' properties: month: type: - string - 'null' description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text - year additionalProperties: false description: 'When it started: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' required: - degree - description - endDate - fieldOfStudy - insights - period - schoolId - schoolLinkedinUrl - schoolLogo - schoolName - skills - startDate additionalProperties: false description: Every school on the profile. emails: type: array items: type: string maxItems: 0 description: 'Always empty: Datacircle sends HarvestAPI the profile lookup only, without its email search.' experience: type: array items: type: object properties: companyId: type: - string - 'null' description: LinkedIn's numeric id of the company. companyLinkedinUrl: type: - string - 'null' description: The company's LinkedIn page. companyLogo: type: - object - 'null' properties: sizes: type: array items: type: object properties: height: type: integer description: Height, in pixels. url: type: string description: The image's URL. width: type: integer description: Width, in pixels. required: - height - url - width additionalProperties: false description: Every size LinkedIn serves. url: type: string description: The image's URL. required: - sizes - url additionalProperties: false description: 'The company''s logo: `url` (the largest image) and `sizes`, every size LinkedIn serves.' companyName: type: string description: The company's name. companyUniversalName: type: - string - 'null' description: 'The company''s slug: `linkedin.com/company/`.' description: type: - string - 'null' description: Its description, as written on the profile. duration: type: - string - 'null' description: How long, as LinkedIn shows it, e.g. `16 yrs 4 mos`. employmentType: type: - string - 'null' description: Employment type, e.g. `Full-time` or `Self-employed`. endDate: type: - object - 'null' properties: month: type: - string - 'null' description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text additionalProperties: false description: 'When it ended. `text` is `Present` for a current one: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' experienceGroupId: type: - string - 'null' description: 'Groups several jobs at the same company: equal on each.' location: type: - string - 'null' description: Where the job is. position: type: string description: The job title. skills: type: - array - 'null' items: type: string description: The skills listed with it. startDate: type: - object - 'null' properties: month: type: - string - 'null' description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text - year additionalProperties: false description: 'When it started: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' workplaceType: type: - string - 'null' description: Where the role is worked, e.g. `On-site`, `Hybrid` or `Remote`. required: - companyId - companyLinkedinUrl - companyLogo - companyUniversalName - description - duration - employmentType - endDate - location - position - skills - startDate - workplaceType additionalProperties: false description: Every job on the profile, the newest first. featured: type: - object - 'null' properties: images: type: array items: type: string description: Empty in every answer we hold. link: type: 'null' description: Always `null` in every answer we hold. slides: type: array items: type: object properties: description: type: 'null' description: Always `null` in every answer we hold. image: type: object properties: url: type: - string - 'null' description: The image's URL. required: - url additionalProperties: false description: Its image. subtitle: type: - string - 'null' description: Its subtitle. title: type: - object - string - 'null' properties: accessibilityText: type: 'null' description: Always `null` in every answer we hold. attributesV2: type: array items: type: object description: LinkedIn's formatting of the title. text: type: string description: The title. textDirection: type: string description: The text's direction, e.g. `USER_LOCALE`. required: - accessibilityText - attributesV2 - text - textDirection additionalProperties: false description: 'The item''s title: a string, or LinkedIn''s text object (`text`, `attributesV2`, `textDirection`, `accessibilityText`).' url: type: string description: The item's URL (a post, an article, a link). required: - description - image - subtitle - title - url additionalProperties: false description: Each featured item. subtitle: type: 'null' description: Always `null` in every answer we hold. title: type: 'null' description: Always `null` in every answer we hold. required: - images - link - slides - subtitle - title additionalProperties: false description: The profile's Featured section. `null` when it has none. firstName: type: string description: The member's first name. followerCount: type: integer description: How many people follow the member. headline: type: string description: The line under the member's name on the profile. hiring: type: boolean description: '`true` when the profile shows #Hiring.' honorsAndAwards: type: array items: type: object properties: associatedWith: type: - string - 'null' description: The job or school it came with. associatedWithLink: type: - string - 'null' description: That job's or school's LinkedIn page. description: type: - string - 'null' description: Its description, as written on the profile. issuedAt: type: - string - 'null' description: When, as LinkedIn shows it. issuedBy: type: string description: Who gave it. title: type: string description: The award. required: - associatedWith - associatedWithLink - description - issuedAt - title additionalProperties: false description: Honors and awards. id: type: string description: The profile's LinkedIn member id (`ACoAA…`, case-sensitive). influencer: type: boolean description: '`true` when LinkedIn marks the member as an influencer (Top Voice).' interests: type: array items: type: object properties: elements: type: array items: type: object properties: caption: type: string description: Its audience as LinkedIn shows it, e.g. `224,329 followers`. image: type: object properties: url: type: - string - 'null' description: The image's URL. required: - url additionalProperties: false description: Its image. link: type: string description: Its LinkedIn URL. subtitle: type: - string - 'null' description: Its headline or tagline. title: type: string description: Its name. required: - caption - image - link - subtitle - title additionalProperties: false description: What the member follows of that kind. interestName: type: string description: The kind, e.g. `Top Voices`, `Companies` or `Groups`. required: - elements - interestName additionalProperties: false description: What the member follows, by kind. languages: type: array items: type: object properties: name: type: string description: The language. proficiency: type: string description: How well, as LinkedIn words it, e.g. `Native or bilingual proficiency`. required: - name additionalProperties: false description: The languages the member speaks. lastName: type: string description: The member's last name. linkedinUrl: type: string description: The profile's LinkedIn URL. location: type: object properties: countryCode: type: string description: The country's ISO 3166-1 alpha-2 code, e.g. `US`. linkedinText: type: string description: The location exactly as LinkedIn shows it. parsed: type: object properties: city: type: string description: City. country: type: string description: Country name, e.g. `United States`. countryCode: type: string description: The country's ISO 3166-1 alpha-2 code, e.g. `US`. countryFull: type: string description: The country's full name, e.g. `United States of America`. regionCode: type: 'null' description: Always `null` in every answer we hold. state: type: string description: State or region. text: type: string description: The parsed location as one line, e.g. `Miami, FL, United States`. required: - country - countryCode - countryFull - regionCode - text additionalProperties: false description: The location, parsed. required: - countryCode - linkedinText - parsed additionalProperties: false description: 'Where the member is: `linkedinText` as LinkedIn shows it, and `parsed` into city, state and country.' memorialized: type: boolean description: '`true` when LinkedIn has memorialized the profile (the member died).' moreProfiles: type: array items: type: object properties: firstName: type: string description: The member's first name. id: type: string description: That member's LinkedIn member id (`ACoAA…`). lastName: type: string description: The member's last name. linkedinUrl: type: string description: The member's LinkedIn URL. position: type: string description: That member's headline. publicIdentifier: type: string description: The member's slug. required: - firstName - id - lastName - linkedinUrl - position - publicIdentifier additionalProperties: false description: The profiles LinkedIn suggests next to this one ("More profiles for you"). multiLocaleHeadline: type: array items: type: object properties: headline: type: string description: The headline in that language. locale: type: string description: The language, e.g. `en_US`. required: - headline - locale additionalProperties: false description: The headline in each language the profile is written in. objectUrn: type: string description: LinkedIn's numeric id of the member. openToWork: type: boolean description: '`true` when the profile shows #OpenToWork.' organizations: type: array items: type: object properties: companyLinkedinUrl: type: - string - 'null' description: The organization's LinkedIn page. description: type: - string - 'null' description: Its description, as written on the profile. endDate: type: - object - 'null' properties: month: type: string description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text additionalProperties: false description: 'When it ended. `text` is `Present` for a current one: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' logo: type: - string - 'null' description: The organization's logo URL. name: type: string description: The organization. positionHeld: type: - string - 'null' description: The member's position there. startDate: type: - object - 'null' properties: month: type: string description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text additionalProperties: false description: 'When it started: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' required: - companyLinkedinUrl - description - endDate - logo - name - positionHeld - startDate additionalProperties: false description: Organizations the member belongs to. patents: type: array items: type: object properties: description: type: - string - 'null' description: Its description, as written on the profile. issuedAt: type: - string - 'null' description: When it was issued, as LinkedIn shows it. number: type: string description: The patent's number. title: type: string description: The patent. url: type: 'null' description: Always `null` in every answer we hold. required: - description - issuedAt - number - title - url additionalProperties: false description: Patents. photo: type: - string - 'null' description: The profile photo's URL (the largest size). premium: type: boolean description: '`true` when the member has LinkedIn Premium.' primaryLocale: type: object properties: country: type: string description: The country code, e.g. `US`. language: type: string description: The language code, e.g. `en`. required: - country - language additionalProperties: false description: The profile's main language. profileActions: type: array items: type: object properties: label: type: string description: The button's label. url: type: string description: Where it goes. required: - label - url additionalProperties: false description: The buttons the member added to the profile, e.g. `Visit my website`. profileLocales: type: array items: type: object properties: country: type: string description: The country code, e.g. `US`. language: type: string description: The language code, e.g. `en`. required: - country - language additionalProperties: false description: Every language the profile is written in. profilePicture: type: - object - 'null' properties: sizes: type: array items: type: object properties: height: type: integer description: Height, in pixels. url: type: string description: The image's URL. width: type: integer description: Width, in pixels. required: - height - url - width additionalProperties: false description: Every size LinkedIn serves. url: type: - string - 'null' description: The image's URL. required: - sizes - url additionalProperties: false description: 'The profile photo: `url` (the largest image) and `sizes`, every size LinkedIn serves.' profileTopEducation: type: array items: type: object properties: degree: type: - string - 'null' description: The degree. description: type: - string - 'null' description: Its description, as written on the profile. endDate: type: - object - 'null' properties: month: type: - string - 'null' description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text - year additionalProperties: false description: 'When it ended. `text` is `Present` for a current one: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' fieldOfStudy: type: - string - 'null' description: The field of study. insights: type: - string - 'null' description: Activities and societies, as written on the profile. period: type: - string - 'null' description: When, as LinkedIn shows it, e.g. `1981 - 1985`. schoolId: type: - string - 'null' description: LinkedIn's numeric id of the school. schoolLinkedinUrl: type: - string - 'null' description: The school's LinkedIn page. schoolLogo: type: - object - 'null' properties: sizes: type: array items: type: object properties: height: type: integer description: Height, in pixels. url: type: string description: The image's URL. width: type: integer description: Width, in pixels. required: - height - url - width additionalProperties: false description: Every size LinkedIn serves. url: type: - string - 'null' description: The image's URL. required: - sizes - url additionalProperties: false description: 'The school''s logo: `url` (the largest image) and `sizes`, every size LinkedIn serves.' schoolName: type: string description: The school. skills: type: - array - 'null' items: type: string description: The skills listed with it. startDate: type: - object - 'null' properties: month: type: - string - 'null' description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text - year additionalProperties: false description: 'When it started: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' required: - degree - description - endDate - fieldOfStudy - insights - period - schoolId - schoolLinkedinUrl - schoolLogo - schoolName - skills - startDate additionalProperties: false description: The school the profile shows under the member's name, the same shape as `education`. projects: type: array items: type: object properties: description: type: - string - 'null' description: Its description, as written on the profile. duration: type: - string - 'null' description: When, as LinkedIn shows it, e.g. `Dec 2016 - Present`. endDate: type: - object - 'null' properties: month: type: string description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text additionalProperties: false description: 'When it ended. `text` is `Present` for a current one: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' startDate: type: - object - 'null' properties: month: type: string description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - month - text - year additionalProperties: false description: 'When it started: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' title: type: string description: The project. required: - description - duration - endDate - startDate - title additionalProperties: false description: Projects. publicIdentifier: type: string description: 'The profile''s slug: linkedin.com/in/.' publications: type: array items: type: object properties: description: type: - string - 'null' description: Its description, as written on the profile. link: type: - string - 'null' description: The publication's URL. publishedAt: type: - string - 'null' description: Where and when, as LinkedIn shows it, e.g. `Springer · Dec 1, 2014`. title: type: string description: The publication. required: - description - link - publishedAt - title additionalProperties: false description: Publications. receivedRecommendations: type: array items: type: object properties: description: type: - string - 'null' description: Its description, as written on the profile. givenAt: type: string description: When, as LinkedIn shows it, e.g. `June 13, 2026`. givenBy: type: string description: Who wrote it. givenByHeadline: type: string description: Their headline. givenByLink: type: string description: Their LinkedIn URL. givenByPicture: type: - object - 'null' properties: sizes: type: array items: type: object properties: height: type: integer description: Height, in pixels. url: type: string description: The image's URL. width: type: integer description: Width, in pixels. required: - height - url - width additionalProperties: false description: Every size LinkedIn serves. url: type: string description: The image's URL. required: - sizes - url additionalProperties: false description: 'Their photo: `url` (the largest image) and `sizes`, every size LinkedIn serves.' required: - description - givenAt - givenBy - givenByHeadline - givenByLink - givenByPicture additionalProperties: false description: Recommendations the member received. registeredAt: type: - string - 'null' description: When the member joined LinkedIn (ISO 8601). sectionTotals: type: object properties: causes: type: integer description: Causes on the profile, counted by LinkedIn. certifications: type: integer description: Certifications on the profile, counted by LinkedIn. courses: type: integer description: Courses on the profile, counted by LinkedIn. education: type: integer description: Education on the profile, counted by LinkedIn. experience: type: integer description: Jobs on the profile, counted by LinkedIn. honorsAndAwards: type: integer description: Honors and awards on the profile, counted by LinkedIn. languages: type: integer description: Languages on the profile, counted by LinkedIn. organizations: type: integer description: Organizations on the profile, counted by LinkedIn. patents: type: integer description: Patents on the profile, counted by LinkedIn. projects: type: integer description: Projects on the profile, counted by LinkedIn. publications: type: integer description: Publications on the profile, counted by LinkedIn. receivedRecommendations: type: integer description: Recommendations received on the profile, counted by LinkedIn. skills: type: integer description: The skills listed with it on the profile, counted by LinkedIn. volunteering: type: integer description: Volunteering on the profile, counted by LinkedIn. required: - causes - certifications - courses - education - experience - honorsAndAwards - languages - organizations - patents - projects - publications - receivedRecommendations - skills - volunteering additionalProperties: false description: How many entries each section of the profile has on LinkedIn. A list above may hold fewer. services: type: - object - 'null' properties: description: type: - string - 'null' description: The member's description of them. media: type: array items: type: object properties: image: type: object properties: sizes: type: array items: type: object properties: url: type: string description: The image's URL. width: type: integer description: Width, in pixels. height: type: integer description: Height, in pixels. required: - url - width - height additionalProperties: false description: Every size LinkedIn serves. url: type: - string - 'null' description: The image's URL. required: - sizes - url additionalProperties: false description: Its image. subtitle: type: - string - 'null' description: Its subtitle. title: type: 'null' description: Its title. url: type: string description: The image's URL. required: - image - subtitle - title - url additionalProperties: false description: Media on the Services page. rating: type: - string - 'null' description: The services' rating. requestUrl: type: - string - 'null' description: The LinkedIn URL to request a proposal. servicesList: type: array items: type: string description: The services, e.g. `Business Consulting`. required: - description - media - rating - requestUrl - servicesList additionalProperties: false description: The services the member offers (LinkedIn's Services page). `null` when none. skills: type: array items: type: object properties: endorsements: type: string description: The endorsements as LinkedIn shows them, e.g. `51 endorsements`. name: type: string description: The skill. positions: type: array items: type: string description: Where the skill shows on the profile and who endorsed it, as LinkedIn words it, e.g. `Endorsed by 2 colleagues at Acme`. required: - name additionalProperties: false description: Every skill on the profile. topSkills: type: - array - 'null' items: type: string description: The skills the member put at the top of the profile. verified: type: boolean description: '`true` when LinkedIn shows the member as verified.' volunteering: type: array items: type: object properties: cause: type: - string - 'null' description: The cause, e.g. `Health`. description: type: - string - 'null' description: Its description, as written on the profile. duration: type: - string - 'null' description: How long, as LinkedIn shows it. endDate: type: - object - 'null' properties: month: type: string description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - text additionalProperties: false description: 'When it ended. `text` is `Present` for a current one: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' organizationLinkedinUrl: type: string description: The organization's LinkedIn page. organizationName: type: string description: The organization. role: type: string description: The member's role. startDate: type: - object - 'null' properties: month: type: string description: The month, e.g. `Jun`. text: type: string description: The date as LinkedIn shows it. year: type: integer description: The year. required: - month - text - year additionalProperties: false description: 'When it started: `text` as LinkedIn shows it (e.g. `Jun 2010`), with `year` and `month` when LinkedIn gives them.' required: - cause - duration - endDate - organizationName - role - startDate additionalProperties: false description: Volunteering. websites: type: array items: type: string description: The websites listed on the profile. industry: type: - object - 'null' properties: id: type: integer description: LinkedIn's industry id. name: type: string description: The industry's name, e.g. `Philanthropic Fundraising Services`. required: - id - name additionalProperties: false description: 'The member''s industry, as LinkedIn classifies it: its `id` and `name`.' required: - about - causes - certifications - connectionsCount - courses - coverPicture - creator - currentPosition - education - emails - experience - featured - firstName - followerCount - headline - hiring - honorsAndAwards - id - influencer - languages - lastName - linkedinUrl - location - memorialized - moreProfiles - multiLocaleHeadline - objectUrn - openToWork - photo - premium - primaryLocale - profileActions - profileLocales - profilePicture - profileTopEducation - projects - publicIdentifier - publications - receivedRecommendations - services - skills - topSkills - volunteering additionalProperties: false description: A LinkedIn profile, as HarvestAPI answers it. Error: type: object required: - error properties: error: type: string description: What went wrong, in plain words. DatacircleMeta: type: object description: Datacircle's only addition to the provider's answer required: - provider - cost_usd - balance_usd properties: provider: type: string enum: - up2data - harvestapi - fetchin description: Which provider answered cost_usd: type: number description: 'What this call cost, in dollars: the provider''s price, no markup' balance_usd: type: number description: Your balance after this call, in dollars (`balance_usd` in `GET /balance/`) additionalProperties: false HarvestApiProfileResponse: type: object properties: element: anyOf: - $ref: '#/components/schemas/HarvestApiProfile' - type: 'null' description: The profile. `null` when HarvestAPI can't find it (`status` `404`) or refuses the request (`status` `400`). cost: type: number description: What HarvestAPI billed for the call, e.g. `0.0037` for a profile, `0.0023` for a profile it can't find. Datacircle charges you the same amount in dollars (`datacircle_meta.cost_usd`). entityId: type: - string - 'null' description: The profile's LinkedIn member id (`ACoAA…`), as `element.id`. `null` when not found. error: type: string description: HarvestAPI's message when `element` is `null`, e.g. `Profile not found`. free: type: boolean description: '`true` when HarvestAPI didn''t bill the call (a request it refuses).' originalQuery: type: object properties: url: type: string description: The profile URL HarvestAPI got. required: - url additionalProperties: false description: The request HarvestAPI got. payments: type: array items: type: string description: 'What HarvestAPI billed, by name: `linkedinProfile` for a profile, `linkedinProfileShort` for a lookup that found nothing.' query: type: object properties: profileId: type: - string - 'null' description: The profile's LinkedIn member id (`ACoAA…`). `null` when not found. publicIdentifier: type: - string - 'null' description: The profile's slug, linkedin.com/in/. `null` when not found. url: type: string description: The profile URL HarvestAPI read. required: - url additionalProperties: false description: 'The request as HarvestAPI understood it: the `url` it read, with the `publicIdentifier` and `profileId` it resolved.' retries: type: integer description: How many times HarvestAPI retried LinkedIn for this answer. status: type: integer description: 'HarvestAPI''s own status, inside an HTTP `200`: `200` found, `404` not found, `400` a request it refuses.' datacircle_meta: $ref: '#/components/schemas/DatacircleMeta' required: - cost - element - entityId - originalQuery - payments - query - retries - status - datacircle_meta additionalProperties: false description: HarvestAPI's own answer to `GET /linkedin/profile`, minus `user` and `requestId` (our account with HarvestAPI), plus `datacircle_meta`. securitySchemes: token: type: http scheme: bearer description: 'Your API key: `Authorization: Bearer `. `Authorization: Token ` works too.' externalDocs: description: Datacircle docs url: https://docs.datacircle.dev