import {z} from 'zod' export type ColumnSortCompanySearch = {desc?: boolean | undefined, field: 'relevance' | 'name' | 'num_jobs' | 'num_jobs_last_30_days' | 'num_jobs_found' | 'employee_count' | 'alexa_ranking' | 'founded_year' | 'annual_revenue_usd' | 'total_funding_usd' | 'last_funding_round_date' | 'confidence' | 'jobs' | 'first_date_found'}; export type WorkplaceType = 'on_site' | 'hybrid' | 'remote'; export type JobExportKey = {neg_posted_at_timestamp: number, url_hashed: number, company_name_slug: string}; export type JobLocationFilter = {id?: (number | null) | undefined}; export type Commitment = 'full_time' | 'part_time' | 'temporary' | 'internship' | 'contract' | 'freelance' | 'co_founder' | 'apprenticeship' | 'seasonal' | 'volunteer' | 'other'; export type JobFiltersInput = {job_title_or?: Array | undefined, job_title_not?: Array | undefined, job_title_pattern_and?: Array | undefined, job_title_pattern_or?: Array | undefined, job_title_pattern_not?: Array | undefined, job_country_code_or?: Array | undefined, job_country_code_not?: Array | undefined, posted_at_max_age_days?: (number | null) | undefined, posted_at_gte?: (string | null) | undefined, posted_at_lte?: (string | null) | undefined, discovered_at_max_age_days?: (number | null) | undefined, discovered_at_min_age_days?: (number | null) | undefined, discovered_at_gte?: (string | string | null) | undefined, discovered_at_lte?: (string | string | null) | undefined, job_description_pattern_or?: Array | undefined, job_description_pattern_not?: Array | undefined, job_description_pattern_and?: Array | undefined, job_description_pattern_is_case_insensitive?: (boolean | null) | undefined, job_description_contains_or?: Array | undefined, job_description_contains_not?: Array | undefined, job_description_pattern_case_sensitive_or?: Array | undefined, remote?: (boolean | null) | undefined, workplace_types_or?: (Array | null) | undefined, only_jobs_with_reports_to?: (boolean | null) | undefined, reports_to_exists?: (boolean | null) | undefined, final_url_exists?: (boolean | null) | undefined, only_jobs_with_hiring_managers?: (boolean | null) | undefined, hiring_managers_exists?: (boolean | null) | undefined, job_id_or?: Array | undefined, job_id_not?: Array | undefined, job_export_key_or?: Array | undefined, job_ids?: Array | undefined, job_seniority_or?: (Array<'c_level' | 'staff' | 'senior' | 'junior' | 'mid_level'>) | undefined, min_salary_usd?: (number | null) | undefined, max_salary_usd?: (number | null) | undefined, job_technology_slug_or?: Array | undefined, job_technology_slug_not?: Array | undefined, job_technology_slug_and?: Array | undefined, job_keyword_slug_or?: Array | undefined, job_keyword_slug_and?: Array | undefined, job_keyword_slug_not?: Array | undefined, job_location_pattern_or?: Array | undefined, job_location_pattern_not?: Array | undefined, job_location_or?: Array | undefined, job_location_not?: Array | undefined, url_domain_or?: Array | undefined, url_domain_not?: Array | undefined, scraper_name_pattern_or?: Array | undefined, easy_apply?: (boolean | null) | undefined, easy_apply_or_null?: (boolean | null) | undefined, employment_statuses_or?: (Array | null) | undefined, is_closed?: (boolean | null) | undefined, closed_at_gte?: (string | null) | undefined, closed_at_lte?: (string | null) | undefined, property_exists_or?: (Array<'final_url' | 'hiring_team' | 'employment_statuses'>) | undefined, property_exists_and?: (Array<'final_url' | 'hiring_team' | 'employment_statuses'>) | undefined}; export type KeywordFilters = {keyword_slug_or?: Array | undefined, keyword_category_slug_or?: Array | undefined, keyword_parent_category_slug_or?: Array | undefined, technology_slug_or?: Array | undefined, technology_category_slug_or?: Array | undefined, technology_parent_category_slug_or?: Array | undefined, max_rank?: (number | null) | undefined, min_jobs?: (number | null) | undefined, max_jobs?: (number | null) | undefined, min_relative_occurrence?: (number | null) | undefined, first_date_found_gte?: (string | null) | undefined, first_date_found_lte?: (string | null) | undefined, last_date_found_gte?: (string | null) | undefined, last_date_found_lte?: (string | null) | undefined, confidence_or?: (Array<'low' | 'medium' | 'high'>) | undefined}; export type CompanySearchFiltersInput = {expand_technology_slugs?: Array | undefined, order_by?: Array | undefined, company_name_or?: Array | undefined, company_name_case_insensitive_or?: Array | undefined, company_id_or?: Array | undefined, company_id_not?: Array | undefined, company_domain_or?: Array | undefined, company_domain_not?: Array | undefined, company_name_not?: Array | undefined, company_name_partial_match_or?: Array | undefined, company_name_partial_match_not?: Array | undefined, company_linkedin_url_or?: Array | undefined, blur_company_data?: boolean | undefined, property_exists_or?: (Array<'domain' | 'linkedin_url'>) | undefined, property_exists_and?: (Array<'domain' | 'linkedin_url'>) | undefined, offset?: number | undefined, page?: number | undefined, limit?: number | undefined, cursor?: (string | null) | undefined, company_description_pattern_or?: Array | undefined, company_description_pattern_not?: Array | undefined, company_description_pattern_accent_insensitive?: (boolean | null) | undefined, min_revenue_usd?: (number | null) | undefined, max_revenue_usd?: (number | null) | undefined, min_revenue_usd_or_null?: (number | null) | undefined, max_revenue_usd_or_null?: (number | null) | undefined, min_employee_count?: (number | null) | undefined, max_employee_count?: (number | null) | undefined, min_employee_count_or_null?: (number | null) | undefined, max_employee_count_or_null?: (number | null) | undefined, min_funding_usd?: (number | null) | undefined, max_funding_usd?: (number | null) | undefined, funding_stage_or?: Array | undefined, industry_or?: Array | undefined, industry_not?: Array | undefined, industry_id_or?: Array | undefined, industry_id_not?: Array | undefined, industry_id_not_or_null?: Array | undefined, company_tags_or?: Array | undefined, company_type?: ('recruiting_agency' | 'direct_employer' | 'all' | null) | undefined, company_investors_or?: Array | undefined, company_investors_partial_match_or?: Array | undefined, company_technology_slug_or?: Array | undefined, company_technology_slug_and?: Array | undefined, company_technology_slug_not?: Array | undefined, company_keyword_slug_or?: Array | undefined, company_keyword_slug_and?: Array | undefined, company_keyword_slug_not?: Array | undefined, only_yc_companies?: (boolean | null) | undefined, company_location_pattern_or?: Array | undefined, company_country_code_or?: Array | undefined, company_country_code_not?: Array | undefined, company_country_code_not_or_null?: Array | undefined, company_list_id_or?: Array | undefined, company_list_id_not?: Array | undefined, company_crm_status_or?: Array | undefined, company_crm_status_not?: Array | undefined, company_linkedin_url_exists?: (boolean | null) | undefined, revealed_company_data?: (boolean | null) | undefined, company_revealed_at_gte?: (string | null) | undefined, company_revealed_at_lte?: (string | null) | undefined, company_not_revealed_at_gte?: (string | null) | undefined, company_not_revealed_at_lte?: (string | null) | undefined, company_revealed_within_hours?: (number | null) | undefined, company_not_revealed_within_hours?: (number | null) | undefined, last_funding_round_date_lte?: (string | null) | undefined, last_funding_round_date_gte?: (string | null) | undefined, include_total_results?: boolean | undefined, job_filters?: (JobFiltersInput | null) | undefined, min_num_jobs_found?: (number | null) | undefined, tech_filters?: (KeywordFilters | null) | undefined}; export type CreateApiV1CompaniesSearchArgs = {body: CompanySearchFiltersInput}; export type CreateApiV1CompaniesSearchOptions = {baseUrl?: string | undefined, Bearer?: string | undefined, fetch?: typeof fetch | undefined}; export const metadata = z.object({total_results: z.number().int().nullable().optional(), truncated_results: z.number().int().nullable().optional(), truncated_companies: z.number().int().nullable().optional(), total_companies: z.number().int().nullable().optional()}); export const fundingStage = z.enum(["angel", "convertible_note", "debt_financing", "equity_crowdfunding", "other", "private_equity", "seed", "series_a", "series_b", "series_c", "series_d", "series_e", "series_f", "series_g", "series_h", "venture_round_not_specified", "series_i", "series_j", "undisclosed", "series_unknown", "pre_seed", "post_ipo_secondary", "post_ipo_equity", "post_ipo_debt", "non_equity_assistance", "late_vc", "initial_coin_offering", "growth_equity_vc", "grant", "early_vc", "corporate_round", "secondary_market", "product_crowdfunding"]); export const keywordType = z.enum(["technology", "software_product", "technology_concept", "operational_activity", "strategic_initiative", "metric_or_concept", "product_or_service_offered", "regulation", "threat_or_risk", "event", "commodity", "industry_vertical", "physical_equipment", "medical_research", "government_body"]); export const keywordExtended = z.object({name: z.string(), category: z.string().nullable().optional(), type: keywordType.nullable().optional(), slug: z.string(), category_slug: z.string().nullable().optional(), parent_category: z.string().nullable().optional(), parent_category_slug: z.string().nullable().optional(), logo: z.string().nullable().optional(), logo_thumbnail: z.string().nullable().optional()}); export const keywordFoundV0 = z.object({technology: keywordExtended, confidence: z.enum(["low", "medium", "high"]), jobs: z.number().int(), jobs_last_7_days: z.number().int(), jobs_last_30_days: z.number().int(), jobs_last_180_days: z.number().int(), first_date_found: z.string(), last_date_found: z.string(), rank_within_category: z.number().int(), relative_occurrence_within_category: z.number(), theirstack_score: z.number().nullable().optional(), company_name: z.string()}); export const jobBaseOut = z.object({id: z.number().int().nullable().optional(), job_title: z.string().nullable().optional(), url: z.string().nullable().optional(), source_url: z.string().nullable().optional(), date_posted: z.string().nullable().optional(), has_blurred_data: z.boolean().optional(), company: z.string()}); export const companyWithTechnologiesAndJobs = z.object({id: z.string(), name: z.string(), domain: z.string().nullable().optional(), industry: z.string().nullable().optional(), country: z.string().nullable().optional(), country_code: z.string().nullable().optional(), employee_count: z.number().int().nullable().optional(), logo: z.string().nullable().optional(), num_jobs: z.number().int().optional(), num_technologies: z.number().int().optional(), num_keywords: z.number().int().optional(), num_buying_intent_topics: z.number().int().optional(), possible_domains: z.array(z.string()).optional(), url: z.string().nullable().optional(), industry_id: z.number().int().nullable().optional(), linkedin_url: z.string().nullable().optional(), num_jobs_last_30_days: z.number().int().optional(), num_jobs_found: z.number().int().nullable().optional(), yc_batch: z.string().nullable().optional(), apollo_id: z.string().nullable().optional(), linkedin_id: z.string().nullable().optional(), url_source: z.string().nullable().optional(), is_recruiting_agency: z.boolean().nullable().optional(), founded_year: z.number().int().nullable().optional(), annual_revenue_usd: z.number().nullable().optional(), annual_revenue_usd_readable: z.string().nullable().optional(), total_funding_usd: z.number().int().nullable().optional(), last_funding_round_date: z.string().nullable().optional(), last_funding_round_amount_readable: z.string().nullable().optional(), employee_count_range: z.string().nullable().optional(), long_description: z.string().nullable().optional(), seo_description: z.string().nullable().optional(), city: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), company_keywords: z.array(z.string()).nullable().optional(), company_tags: z.array(z.string()).optional(), alexa_ranking: z.number().int().nullable().optional(), publicly_traded_symbol: z.string().nullable().optional(), publicly_traded_exchange: z.string().nullable().optional(), investors: z.array(z.string()).nullable().optional(), funding_stage: fundingStage.nullable().optional(), has_blurred_data: z.boolean().optional(), keyword_slugs: z.array(z.string()).optional(), technology_slugs: z.array(z.string()).nullable().optional(), technology_names: z.array(z.string()).nullable().optional(), technologies_found: z.array(keywordFoundV0).optional(), jobs_found: z.array(jobBaseOut).optional(), keywords_found: z.array(keywordFoundV0).optional()}); export const companySearchResponse = z.object({metadata: metadata, data: z.array(companyWithTechnologiesAndJobs)}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Search Companies * * POST /v1/companies/search */ export const createApiV1CompaniesSearch = async (args: CreateApiV1CompaniesSearchArgs, options?: CreateApiV1CompaniesSearchOptions) => { const {baseUrl = "https://api.theirstack.com", fetch: fetchFn = fetch, Bearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (Bearer !== undefined) headers.set('authorization', `Bearer ${Bearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/companies/search${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(companySearchResponse, await res.json()) };