diff --git a/src/services/index.ts b/src/services/index.ts index 1e7c9c4..38eb661 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -2,6 +2,9 @@ export * from './clearbit-client.js' export * from './dexa-client.js' export * from './diffbot-client.js' export * from './exa-client.js' +export * from './people-data-labs-client.js' +export * from './perigon-client.js' +export * from './predict-leads-client.js' export * from './proxycurl-client.js' export * from './scraper-client.js' export * from './serpapi-client.js' diff --git a/src/services/people-data-labs-client.ts b/src/services/people-data-labs-client.ts new file mode 100644 index 0000000..7385c1a --- /dev/null +++ b/src/services/people-data-labs-client.ts @@ -0,0 +1,525 @@ +import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' + +import { assert, getEnv, throttleKy } from '../utils.js' + +const peopleDataLabsAPIThrottle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true +}) + +export namespace peopledatalabs { + export const BASE_URL = 'https://api.peopledatalabs.com/v5/' + + export const JobTitleLevels = [ + 'cxo', + 'director', + 'entry', + 'manager', + 'owner', + 'partner', + 'senior', + 'training', + 'unpaid', + 'vp' + ] + + export const JobTitleRoles = [ + 'customer_service', + 'design', + 'education', + 'engineering', + 'finance', + 'health', + 'human_resources', + 'legal', + 'marketing', + 'media', + 'operations', + 'public_relations', + 'real_estate', + 'sales', + 'trades' + ] + + // TODO configure this type to make pdl_id or name or profile or ticker or website required. + // Only one is required + export interface CompanyLookupOptions { + pdl_id?: string + name?: string + profile?: string + ticker?: string + website?: string + location?: string[] + locality?: string + region?: string + country?: string + street_address?: string + postal_code?: string + data_include?: string + pretty?: boolean + } + + export interface Naics { + naics_code: string + sector: string + sub_sector: string + industry_group: string + naics_industry: string | null + national_industry: string | null + } + + export interface Sic { + sic_code: string + major_group: string + industry_group: string + industry_sector: string | null + } + + export interface Location { + name: string + locality: string + region: string + metro: string + country: string + continent: string + street_address: string + address_line_2: string | null + postal_code: string + geo: string + } + + export interface EmployeeCountByCountry { + [country: string]: number + } + + export interface CompanyLookupResponse { + status: number + name: string + display_name: string + size: string + employee_count: number + id: string + founded: number + industry: string + naics: Naics[] + sic: Sic[] + location: Location + linkedin_id: string + linkedin_url: string + facebook_url: string + twitter_url: string + profiles: string[] + website: string + ticker: string + gics_sector: string | null + mic_exchange: string | null + type: string + summary: string + tags: string[] + headline: string + alternative_names: string[] + alternative_domains: string[] + affiliated_profiles: string[] + employee_count_by_country: EmployeeCountByCountry + likelihood: number + } + + export interface CompanySearchOptions { + limit?: number + query: { + website?: string + tags?: string + industry?: string + 'location.country'?: string + 'location.metro'?: string + summary?: string + size?: string[] + affiliated_profiles?: string + } + } + + export type CompanySearchOptionsQueryKeys = + keyof CompanySearchOptions['query'] + + export interface CompanySearchResponse { + status: number + data: { + name: string + display_name: string + size: string + employee_count: number + id: string + founded: number + industry: string + naics: Naics[] + sic: Sic[] + location: Location + linkedin_id: string + linkedin_url: string + facebook_url: string + twitter_url: string + profiles: string[] + website: string + ticker: string + gics_sector: string | null + mic_exchange: string | null + type: string + summary: string + tags: string[] + headline: string + alternative_names: string[] + alternative_domains: string[] + affiliated_profiles: string[] + employee_count_by_country: EmployeeCountByCountry + }[] + scroll_token: string + total: number + } + + export interface PersonSearchOptions { + limit?: number + query: { + first_name?: string + full_name?: string + last_name?: string + job_company_website?: string + job_title_role?: string + /** + * The docs says this property should be an array of strings. + * But when sending the array a 404 error is returned. + * See: https://docs.peopledatalabs.com/docs/fields#job_title_levels + */ + job_title_levels?: string + job_company_name?: string + job_company_location_country?: string + } + } + + export type PersonSearchOptionsQueryKeys = keyof PersonSearchOptions['query'] + + // Person response + export interface SearchPersonApiResponse { + id: string + full_name: string + first_name: string + middle_initial: null | string + middle_name: null | string + last_initial: string + last_name: string + gender: string + birth_year: null | number + birth_date: null | string + linkedin_url: string + linkedin_username: string + linkedin_id: string + facebook_url: null | string + facebook_username: null | string + facebook_id: null | string + twitter_url: string + twitter_username: string + github_url: null | string + github_username: null | string + work_email: string + personal_emails: string[] + recommended_personal_email: null | string + mobile_phone: null | string + industry: null | string + job_title: string + job_title_role: null | string + job_title_sub_role: null | string + job_title_levels: string[] + job_onet_code: string + job_onet_major_group: string + job_onet_minor_group: string + job_onet_broad_occupation: string + job_onet_specific_occupation: string + job_onet_specific_occupation_detail: string + job_company_id: string + job_company_name: string + job_company_website: string + job_company_size: string + job_company_founded: number + job_company_industry: string + job_company_linkedin_url: string + job_company_linkedin_id: string + job_company_facebook_url: string + job_company_twitter_url: string + job_company_type: string + job_company_ticker: null | string + job_company_location_name: string + job_company_location_locality: string + job_company_location_metro: string + job_company_location_region: string + job_company_location_geo: string + job_company_location_street_address: string + job_company_location_address_line_2: string + job_company_location_postal_code: string + job_company_location_country: string + job_company_location_continent: string + job_last_updated: string + job_start_date: string + job_summary: null | string + location_name: null | string + location_locality: null | string + location_metro: null | string + location_region: null | string + location_country: null | string + location_continent: null | string + location_street_address: null | string + location_address_line_2: null | string + location_postal_code: null | string + location_geo: null | string + location_last_updated: null | string + linkedin_connections: number + facebook_friends: null | string + inferred_salary: string + inferred_years_experience: number + summary: null | string + phone_numbers: string[] + phones: string[] + emails: Email[] + interests: string[] + skills: string[] + location_names: string[] + regions: string[] + countries: string[] + street_addresses: string[] + experience: Experience[] + education: Education[] + profiles: Profile[] + name_aliases: string[] + possible_emails: PossibleEmail[] + possible_profiles: PossibleProfile[] + possible_phones: PossiblePhone[] + possible_street_addresses: string[] + possible_location_names: string[] + possible_birth_dates: string[] + job_history: JobHistory[] + certifications: string[] + languages: string[] + first_seen: string + num_sources: number + num_records: number + version_status: VersionStatus + } + + export interface Email { + address: string + type: null | string + first_seen: string + last_seen: string + num_sources: number + } + + export interface Experience { + company: Company + start_date: null | string + end_date: null | string + title: Title + location_names: string[] + is_primary: boolean + summary: null | string + num_sources: number + first_seen: string + last_seen: string + } + + export interface Company { + name: string + size: string + id: string + founded: number + industry: string + location: Location + linkedin_url: string + linkedin_id: string + facebook_url: null | string + twitter_url: string + website: string + ticker: null | string + type: string + raw: string[] + fuzzy_match: boolean + } + + export interface Title { + name: string + raw: string[] + role: null | string + sub_role: null | string + levels: string[] + } + + export interface Education { + school: School + degrees: string[] + start_date: string + end_date: string + majors: string[] + minors: string[] + gpa: null | string + raw: string[] + summary: null | string + } + + export interface School { + name: string + type: string + id: string + location: Location + linkedin_url: string + facebook_url: string + twitter_url: string + linkedin_id: string + website: string + domain: string + raw: string[] + } + + export interface Profile { + network: string + id: null | string + url: string + username: string + num_sources: number + first_seen: string + last_seen: string + } + + export interface PossibleEmail { + address: string + type: null | string + first_seen: string + last_seen: string + num_sources: number + } + + export interface PossibleProfile { + network: string + id: null | string + url: string + username: null | string + num_sources: number + first_seen: string + last_seen: string + } + + export interface PossiblePhone { + number: string + first_seen: string + last_seen: string + num_sources: number + } + + export interface VersionStatus { + status: string + contains: string[] + previous_version: string + current_version: string + } + + export interface JobHistory { + company_id: string + company_name: string + title: string + first_seen: string + last_seen: string + num_sources: number + } +} + +export class PeopleDataLabsClient { + readonly ky: KyInstance + readonly apiKey: string + readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('PEOPLE_DATA_LABS_API_KEY'), + apiBaseUrl = peopledatalabs.BASE_URL, + timeoutMs = 30_000, + throttle = true, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + timeoutMs?: number + throttle?: boolean + ky?: KyInstance + } = {}) { + assert(apiKey, 'PeopleDataLabsClient missing required "apiKey"') + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + const throttledKy = throttle + ? throttleKy(ky, peopleDataLabsAPIThrottle) + : ky + + this.ky = throttledKy.extend({ + prefixUrl: apiBaseUrl, + timeout: timeoutMs, + headers: { + 'X-Api-Key': `${this.apiKey}` + } + }) + } + + async companyLookup(options: peopledatalabs.CompanySearchOptions) { + const terms = options.query + const termsQuery = [] + + for (const term of Object.keys( + terms + ) as peopledatalabs.CompanySearchOptionsQueryKeys[]) { + termsQuery.push({ term: { [term]: terms[term] } }) + } + + return this.ky + .get('company/search', { + searchParams: { + size: options.limit || 1, + query: JSON.stringify({ + bool: { + must: termsQuery + } + }) + } + }) + .json() + } + + async companyProfile(options: peopledatalabs.CompanyLookupOptions) { + return this.ky + .get('company/enrich', { + // @ts-expect-error location is a string[] and searchparams shows a TS error heres + searchParams: { ...options } + }) + .json() + } + + async personSearch(options: peopledatalabs.PersonSearchOptions) { + const terms = options.query + const termsQuery = [] + + for (const term of Object.keys( + terms + ) as peopledatalabs.PersonSearchOptionsQueryKeys[]) { + termsQuery.push({ term: { [term]: terms[term] } }) + } + + return this.ky + .get('person/search', { + searchParams: { + size: options.limit || 10, + query: JSON.stringify({ + bool: { + must: termsQuery + } + }) + } + }) + .json() + } +} diff --git a/src/services/perigon-client.ts b/src/services/perigon-client.ts new file mode 100644 index 0000000..2886504 --- /dev/null +++ b/src/services/perigon-client.ts @@ -0,0 +1,304 @@ +import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' + +import { assert, getEnv, throttleKy } from '../utils.js' + +const perigonAPIThrottle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true +}) + +export namespace perigon { + export type ArticleLabel = + | 'Opinion' + | 'Non-news' + | 'Paid News' + | 'Fact Check' + | 'Pop Culture' + | 'Roundup' + | 'Press Release' + + export type Categories = + | 'Politics' + | 'Tech' + | 'Sports' + | 'Business' + | 'Finance' + | 'Entertainment' + | 'Health' + | 'Weather' + | 'Lifestyle' + | 'Auto' + | 'Science' + | 'Travel' + | 'Environment' + | 'World' + | 'General' + | 'none' + + export type ArticlesOptions = { + q: string + title?: string + desc?: string + content?: string + url?: string + from?: string | Date + to?: string | Date + addDateFrom?: string | Date + addDateTo?: string | Date + refreshDateFrom?: string | Date + refreshDateTo?: string | Date + articleId?: string + clusterId?: string + medium?: 'article' | 'video' + source?: string + sourceGroup?: + | 'top10' + | 'top100' + | 'top500English' + | 'top25crypto' + | 'top25finance' + | 'top50tech' + | 'top100sports' + | 'top100leftUS' + | 'top100rightUS' + | 'top100centerUS' + excludeSource?: string + paywall?: boolean + country?: string + language?: string + label?: ArticleLabel + excludeLabel?: ArticleLabel | 'Low Content' + byline?: string + topic?: string + category?: Categories + journalistId?: string + state?: string + city?: string + area?: string + location?: string + sortBy?: 'date' | 'relevance' | 'addDate' | 'pubDate' | 'refreshDate' + relevance?: number + size?: number + showReprints?: boolean + showNumResults?: boolean + type?: 'all' | 'local' | 'world' + linkTo?: string + reprintGroupId?: string + personWikidataId?: string[] + personName?: string[] + companyId?: string[] + companyName?: string + companyDomain?: string[] + companySymbol?: string[] + maxDistance?: number + lat?: number + lon?: number + searchTranslation?: boolean + } + + export type ArticlesResponse = { + status: number + numResults: number + articles: { + url: string + authorsByline: string + articleId: string + clusterId: string + source: { + domain: string + } + imageUrl: string + country: string + language: string + pubDate: string + addDate: string + refreshDate: string + score: number + title: string + description: string + content: string + medium: string + links: string[] + labels: string[] + matchedAuthors: string[] + claim: string + verdict: string + keywords: { + name: string + weight: number + }[] + topics: { + name: string + }[] + categories: { + name: string + }[] + entities: { + data: string + type: string + mentions: number + }[] + sentiment: { + positive: number + negative: number + neutral: number + } + summary: string + translation: string + locations: string[] + reprint: boolean + reprintGroupId: string + places: null + }[] + } + + export type StoriesOptions = { + clusterId?: string + topic?: string + category?: Categories + name?: string + nameExists?: boolean + from?: string + to?: string + initializedFrom?: string + initializedTo?: string + updatedFrom?: string + updatedTo?: string + minClusterSize?: number + maxClusterSize?: number + state?: string + city?: string + area?: string + page?: number + size?: number + sortBy?: 'count' | 'createdAt' | 'updatedAt' + showNumResults?: boolean + } + + export type StoriesResponse = { + status: number + numResults: number + results: Array<{ + createdAt: string + updatedAt: string + initializedAt: string + id: string + name: string + summary: string + summaryReferences: Array + keyPoints: Array<{ + point: string + references: Array + }> + sentiment: { + positive: number + negative: number + neutral: number + } + uniqueCount: number + reprintCount: number + totalCount: number + countries: Array<{ + name: string + count: number + }> + topCountries: Array + topics: Array<{ + name: string + count: number + }> + topTopics: Array<{ name: string }> + categories: Array<{ + name: string + count: number + }> + topCategories: Array<{ name: string }> + people: Array<{ wikidataId: string; name: string; count: number }> + topPeople: Array<{ wikidataId: string; name: string }> + companies: Array<{ + id: string + name: string + domains: Array + symbols: Array + count: number + }> + topCompanies: Array<{ + id: string + name: string + domains: Array + symbols: Array + }> + locations: Array<{ + state: string + city?: string + area?: string + county?: string + count: number + }> + topLocations: Array<{ + state: string + city?: string + area?: string + county?: string + }> + }> + } +} + +export class PerigonClient { + readonly ky: KyInstance + readonly apiKey: string + readonly _maxPageSize = 10 + + constructor({ + apiKey = getEnv('PERIGON_API_KEY'), + timeoutMs = 30_000, + throttle = true, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + throttle?: boolean + timeoutMs?: number + ky?: KyInstance + } = {}) { + assert(apiKey, 'Error perigon client missing required "apiKey"') + + this.apiKey = apiKey + + const throttledKy = throttle ? throttleKy(ky, perigonAPIThrottle) : ky + + this.ky = throttledKy.extend({ + prefixUrl: 'https://api.goperigon.com/v1/', + timeout: timeoutMs + }) + } + + async articles(options: perigon.ArticlesOptions) { + return this.ky + .get('all', { + // @ts-expect-error there are multiple query params that array of strings + // and KY SearchParamsOption shows a TS error for those types + searchParams: { + apiKey: this.apiKey, + ...options, + size: Math.min(this._maxPageSize, options.size || this._maxPageSize) + } + }) + .json() + } + + async stories(options: perigon.StoriesOptions) { + return this.ky + .get('stories/all', { + searchParams: { + apiKey: this.apiKey, + ...options, + size: Math.min(this._maxPageSize, options.size || this._maxPageSize) + } + }) + .json() + } +} diff --git a/src/services/predict-leads-client.ts b/src/services/predict-leads-client.ts new file mode 100644 index 0000000..b69599c --- /dev/null +++ b/src/services/predict-leads-client.ts @@ -0,0 +1,478 @@ +import defaultKy, { type KyInstance } from 'ky' +import pThrottle from 'p-throttle' + +import type { DeepNullable } from '../types.js' +import { assert, getEnv, throttleKy } from '../utils.js' + +const predictionLeadsAPIThrottle = pThrottle({ + limit: 20, + interval: 60 * 1000, + strict: true +}) + +export namespace predictleads { + export type Meta = DeepNullable<{ + count: number + message?: string | null + message_type?: string + }> + + export type GenericSuccessResponse = { + success: { + type: string + message: string + } + } + + export type FollowedCompaniesResponse = { + data: DeepNullable< + Array<{ + domain: string + custom_company_identifier: string | null + }> + > + meta: Meta + } + + export type Relationship = Record< + string, + { + data: { + id: string + type: string + } + } + > + + export type AdditionalData = { + relationships: { + companies: [string, string] + } + date: string + location: string + location_data: { + region?: string + continent?: string + country?: string + state?: string + zip_code?: string + city?: string + fuzzy_match?: boolean + } + contact?: string + job_title?: string + product?: string + product_tags?: string[] + amount?: number + recognition?: string + assets?: string + asset_tags?: string[] + headcount?: number + award?: string + financing_type?: string + financing_type_tags?: string[] + funding_round?: string + division?: string + conference?: string + vulnerability?: string + planning?: boolean + article_title?: string + article_sentence?: string + article_body?: string + article_source?: string + article_published_at?: string + article_image_url?: string + } + + export type Event = { + id: string + type: string + attributes: { + categories: string[] + title: string + url: string + found_at: string + additional_data: AdditionalData + domain: string + location: string + location_data: { + state: string + country: string + } + company_name: string + friendly_company_name: string + ticker: null + meta_title: string + meta_description: string + published_at: string + post_type: string + post_url: string + company_domain: string + fuzzy_match: boolean + } + relationships: Relationship + } + + export type Response = DeepNullable<{ + data: Event[] + included: Relationship + meta: Meta + }> + + export type JobOpeningData = { + id: string + type: string + attributes: { + title: string + url: string + description: string + salary: string + salary_data: { + salary_low: number + salary_high: number + salary_currency: string + salary_low_usd: number + salary_high_usd: number + salary_time_unit: string + } + job_opening_closed: boolean + location: string + contract_types: string[] + first_seen_at: string + last_seen_at: string + last_processed_at: string + categories: string[] + onet_code: string + additional_data: { + job_title_seniority: string + tags: string[] + location_data: { + country: string + city: string + fuzzy_match: boolean + } + } + } + relationships: { + company: { + data: { + id: string + type: string + } + } + } + } + + export type CompanyData = { + id: string + type: string + attributes: { + domain: string + company_name: string + ticker: string | null + } + } + + export type JobOpeningResponse = DeepNullable<{ + data: JobOpeningData[] + included: CompanyData[] + meta: { + count: number + } + }> + + export type JobOpeningByIdResponse = Omit +} + +export class PredictLeadsClient { + readonly ky: KyInstance + readonly apiKey: string + readonly apiToken: string + readonly _maxPageSize = 100 + + constructor({ + apiKey = getEnv('PREDICT_LEADS_API_KEY'), + apiToken = getEnv('PREDICT_LEADS_API_TOKEN'), + timeoutMs = 30_000, + throttle = true, + ky = defaultKy + }: { + apiKey?: string + apiToken?: string + apiBaseUrl?: string + timeoutMs?: number + throttle?: boolean + ky?: KyInstance + } = {}) { + assert(apiKey, 'PredictLeadsClient missing required "apiKey"') + assert(apiToken, 'PredictLeadsClient missing required "apiToken"') + + this.apiKey = apiKey + this.apiToken = apiToken + + const throttledKy = throttle + ? throttleKy(ky, predictionLeadsAPIThrottle) + : ky + + this.ky = throttledKy.extend({ + timeout: timeoutMs, + headers: { + 'X-Api-Key': apiKey, + 'X-Api-Token': apiToken + } + }) + } + + async followCompany(domain: string, customCompanyIdentifier?: string) { + return this.ky + .post( + `https://predictleads.com/api/v2/companies/${domain}/follow`, + customCompanyIdentifier + ? { + json: { customCompanyIdentifier } + } + : undefined + ) + .json() + } + + async getFollowingCompanies(limit: number = this._maxPageSize) { + return this.ky + .get(`https://predictleads.com/api/v2/followings`, { + searchParams: { limit } + }) + .json() + } + + async unfollowCompany(domain: string, customCompanyIdentifier?: string) { + return this.ky + .post( + `https://predictleads.com/api/v2/companies/${domain}/unfollow`, + customCompanyIdentifier + ? { + json: { customCompanyIdentifier } + } + : undefined + ) + .json() + } + + async events( + domain: string, + params: { + categories?: string + found_at_from?: string + found_at_until?: string + page?: number + limit?: string + with_news_article_bodies?: boolean + } = {} + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/events`, { + searchParams: { page: 1, ...params } + }) + .json() + } + + async eventById(id: string) { + return this.ky + .get(`https://predictleads.com/api/v2/events/${id}`) + .json() + } + + async financingEvents(domain: string) { + return this.ky + .get( + `https://predictleads.com/api/v2/companies/${domain}/financing_events` + ) + .json() + } + + async jobOpenings( + domain: string, + params: { + categories?: string + with_job_descriptions?: boolean + active_only?: boolean + not_closed?: boolean + limit?: string + } = {} + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/job_openings`, { + searchParams: params + }) + .json() + } + + async jobOpeningById(id: string) { + return this.ky + .get(`https://predictleads.com/api/v2/job_openings/${id}`) + .json() + } + + async technologies( + domain: string, + params: { + categories: string + limit?: string + } + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/technologies`, { + searchParams: params + }) + .json() + } + + async connections( + domain: string, + params?: { + categories: string + limit?: string + } + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/connections`, { + searchParams: params + }) + .json() + } + + async websiteEvolution( + domain: string, + { limit = 100 }: { limit?: number } = {} + ) { + return this.ky + .get( + `https://predictleads.com/api/v2/companies/${domain}/website_evolution`, + { + searchParams: { limit } + } + ) + .json() + } + + async githubRepositories( + domain: string, + { limit = 100 }: { limit?: number } = {} + ) { + return this.ky + .get( + `https://predictleads.com/api/v2/companies/${domain}/github_repositories`, + { + searchParams: { limit } + } + ) + .json() + } + + async products( + domain: string, + params?: { + sources: string + limit?: number + } + ) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}/products`, { + searchParams: params + }) + .json() + } + + async company(domain: string) { + return this.ky + .get(`https://predictleads.com/api/v2/companies/${domain}`) + .json() + } + + async discoverStartupJobs(params?: { + post_datetime_from?: string + post_datetime_until?: string + min_score?: string + limit?: string + }) { + return this.ky + .get( + `https://predictleads.com/api/v2/discover/startup_platform/jobs_hn`, + { + searchParams: params + } + ) + .json() + } + + async discoverStartupShow(params?: { + post_datetime_from?: string + post_datetime_until?: string + min_score?: string + limit?: string + }) { + return this.ky + .get( + `https://predictleads.com/api/v2/discover/startup_platform/show_hn`, + { + searchParams: params + } + ) + .json() + } + + /* + TODO this returns 500 error, even using the curl example from docs. + Also for this reason I couldn't test the other segments endpoints + curl -X POST "https://predictleads.com/api/v2/segments" + -d '{"technologies":"Salesforce", "job_categories":"sales"}' + -H "Content-Type: application/json" \ + -H 'X-Api-Key: ' \ + -H 'X-Api-Token: ' + */ + async createSegment(params: { + webhook_url?: string + locations?: string + headquarters_locations?: string + job_categories?: string + technologies?: string + found_at_from?: string + found_at_until?: string + active?: string + limit?: string + }) { + return this.ky + .post(`https://predictleads.com/api/v2/segments`, { + json: params + }) + .json() + } + + async updateSegment(params: { + id: string + webhook_url: string + active: string + }) { + return this.ky + .put( + `https://predictleads.com/api/v2/discover/startup_platform/show_hn`, + { + json: params + } + ) + .json() + } + + async showSegment(id: string) { + return this.ky + .get(`https://predictleads.com/api/v2/segments/${id}`) + .json() + } + + async showAllSegment(limit = 100) { + return this.ky + .get(`https://predictleads.com/api/v2/segments`, { + searchParams: { limit } + }) + .json() + } +}