import {z} from 'zod' export type GetApiPersonsIdOrUrnArgs = {id_or_urn: number | string | string, company_context_urns?: Array | undefined}; export type GetApiPersonsIdOrUrnOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const schoolOutput = z.object({name: z.string().nullable().optional(), linkedin_url: z.string().nullable().optional(), logo_url: z.string().nullable().optional(), entity_urn: z.string(), requested_urn: z.string().nullable().optional()}); export const schoolInput = z.object({name: z.string().nullable().optional(), linkedin_url: z.string().nullable().optional(), logo_url: z.string().nullable().optional()}); export const standardizedDegree = z.enum(["PHD", "DOCTOR_OF_MEDICINE", "JURIS_DOCTOR", "OTHER_DOCTORATE", "MASTER_OF_BUSINESS_ADMINISTRATION", "MASTERS_DEGREE", "BACHELORS_DEGREE", "ASSOCIATES_DEGREE", "CERTIFICATE", "HIGH_SCHOOL", "OTHER", "UNKNOWN"]); export const educationMetadataOutput = z.object({school: z.union([schoolOutput, schoolInput, z.string()]), degree: z.string().nullable().optional(), standardized_degree: standardizedDegree.nullable().optional(), field: z.string().nullable().optional(), grade: z.string().nullable().optional(), start_date: z.string().nullable().optional(), end_date: z.string().nullable().optional()}); export const socialStatus = z.union([z.literal(1), z.literal(2)]); export const socialMetadata = z.object({url: z.string().nullable().optional(), follower_count: z.number().int().nullable().optional(), username: z.string().nullable().optional(), status: socialStatus.nullable().optional()}); export const contactMetadata = z.object({emails: z.array(z.string()).optional(), phone_numbers: z.array(z.string()).optional(), exec_emails: z.array(z.string()).optional(), primary_email: z.string().nullable().optional(), primary_email_person_id: z.number().int().nullable().optional()}); export const department = z.enum(["Advisor", "Customer Success", "Data", "Design", "Engineering", "Finance", "Legal", "Marketing", "Operations", "Other", "People", "Product", "Sales", "Support"]); export const roleType = z.enum(["FOUNDER", "CEO", "EXECUTIVE", "OPERATOR", "INTERN", "ALUMNI", "ADVISER", "EMPLOYEE", "INVESTOR", "FALSE_POSITION"]); export const experienceMetadataOutput = z.object({contact: contactMetadata.nullable().optional(), title: z.string().nullable().optional(), department: department.nullable().optional(), description: z.string().nullable().optional(), start_date: z.string().nullable().optional(), end_date: z.string().nullable().optional(), is_current_position: z.boolean().nullable().optional(), location: z.string().nullable().optional(), role_type: roleType.nullable().optional(), company: z.string(), company_name: z.string().nullable().optional()}); export const unstandardizedExperienceMetadataOutput = z.object({contact: contactMetadata.nullable().optional(), title: z.string().nullable().optional(), department: department.nullable().optional(), description: z.string().nullable().optional(), start_date: z.string().nullable().optional(), end_date: z.string().nullable().optional(), is_current_position: z.boolean().nullable().optional(), location: z.string().nullable().optional(), role_type: roleType.nullable().optional(), company: z.union([z.string(), z.string()])}); export const websiteMetadata = z.object({url: z.string().nullable().optional(), domain: z.string().nullable().optional(), is_broken: z.boolean().nullable().optional()}); export const languageMetadata = z.object({name: z.string(), proficiency: z.string().nullable().optional()}); export const personHighlightCategory = z.enum(["Seasoned Executive", "Seasoned Operator", "Seasoned Founder", "Seasoned Adviser", "Unicorn Executive", "Unicorn Operator", "Unicorn Founder", "Unicorn Adviser", "High Growth Startup Executive", "High Growth Startup Operator", "High Growth Startup Founder", "High Growth Startup Adviser", "Prior VC Backed Executive", "Prior VC Backed Operator", "Prior VC Backed Founder", "Prior VC Backed Adviser", "Current Student", "Top University", "HBCU Alum", "HBCU University", "Deep Technical Background", "Prior Exit", "Top Company Alum", "Unicorn Alum", "Major Tech Company Experience", "Legacy Tech Company Experience", "Elite Industry Experience", "Major Research Institution Experience", "Major Government Experience", "Major Financial Institution Experience", "Venture Background", "$5M Club", "$10M Club", "$15M Club", "$20M Club", "$25M Club", "$30M Club", "$30M Raised", "$35M Club", "$40M Club", "$45M Club", "$50M Club", "$50M+ Club", "$55M Club", "$60M Club", "$65M Club", "$70M Club", "$75M Club", "$80M Club", "$85M Club", "$90M Club", "$95M Club", "$100M Club", "$105M Club", "$110M Club", "$115M Club", "$120M Club", "$125M Club", "$130M Club", "$135M Club", "$140M Club", "$145M Club", "$150M Club", "$155M Club", "$160M Club", "$165M Club", "$170M Club", "$175M Club", "$180M Club", "$185M Club", "$190M Club", "$195M Club", "$200M Club", "$205M Club", "$210M Club", "$215M Club", "$220M Club", "$225M Club", "$230M Club", "$235M Club", "$240M Club", "$245M Club", "$250M Club", "$255M Club", "$260M Club", "$265M Club", "$270M Club", "$275M Club", "$280M Club", "$285M Club", "$290M Club", "$295M Club", "$300M Club", "Free Agent", "Founder Turned Operator", "Stealth Founder", "Vested Former Founder", "Jack of All Trades", "YC Backed Founder", "Top Web3 Experience", "Top AI Experience", "Notable Followers", "New Notable Followers"]); export const servicesMidtierSchemasPersonHighlightOutput = z.object({category: personHighlightCategory, date_added: z.string().nullable().optional(), text: z.string().nullable().optional(), company_urn: z.string().nullable().optional()}); export const notableFollowerOutput = z.object({follower_urn: z.union([z.string(), z.string()]), follower_name: z.string().nullable().optional(), firm_urn: z.string().nullable().optional(), firm_name: z.string().nullable().optional(), followed_urn: z.union([z.string(), z.string()]), followed_name: z.string().nullable().optional(), follow_observed_at: z.string().nullable().optional()}); export const personOutput = z.object({full_name: z.string().nullable().optional(), first_name: z.string().nullable().optional(), last_name: z.string().nullable().optional(), profile_picture_url: z.string().nullable().optional(), contact: z.object({emails: z.array(z.string()).optional(), phone_numbers: z.array(z.string()).optional(), exec_emails: z.array(z.string()).optional(), primary_email: z.string().nullable().optional(), primary_email_person_id: z.number().int().nullable().optional()}).nullable().optional(), location: z.object({address_formatted: z.string().nullable().optional(), location: z.string().nullable().optional(), street: z.string().nullable().optional(), city: z.string().nullable().optional(), state: z.string().nullable().optional(), zip: z.string().nullable().optional(), country: z.string().nullable().optional(), metro_areas: z.array(z.string()).nullable().optional()}).nullable().optional(), education: z.array(educationMetadataOutput).optional(), socials: z.record(z.string(), socialMetadata).nullable().optional(), experience: z.array(experienceMetadataOutput).optional(), unstandardized_experience__internal: z.array(unstandardizedExperienceMetadataOutput).optional(), websites: z.array(websiteMetadata).optional(), linkedin_connections: z.number().int().nullable().optional(), usurping_person_id: z.number().int().nullable().optional(), linkedin_headline: z.string().nullable().optional(), linkedin_profile_visibility_type: z.enum(["FULLY_PUBLIC", "EXPERIENCE_AND_EDUCATION_BLURRED", "EXPERIENCES_AND_EDUCATION_SECTIONS_HIDDEN", "PRIVATE_OR_NONEXISTENT"]).nullable().optional(), last_checked_at: z.string().nullable().optional(), languages: z.array(languageMetadata).optional(), requested_entity_urn: z.string().nullable().optional(), entity_urn: z.string(), id: z.union([z.string(), z.number().int()]), highlights: z.array(servicesMidtierSchemasPersonHighlightOutput).optional(), notable_followers: z.array(notableFollowerOutput).optional(), num_notable_followers: z.number().int().nullable().optional(), updated_at: z.string().nullable().optional(), awards__beta: z.array(z.string()).optional(), recommendations__beta: z.array(z.string()).optional(), current_company_urns: z.array(z.string()).optional(), last_refreshed_at: z.string().nullable().optional(), investor_urn: z.string().nullable().optional(), is_redacted: z.boolean().nullable().optional()}); 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 }; /** * Get Person By Id Or Urn * * GET /persons/{id_or_urn} */ export const getApiPersonsIdOrUrn = async (args: GetApiPersonsIdOrUrnArgs, options: GetApiPersonsIdOrUrnOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") for (const item of args.company_context_urns ?? []) query.append("company_context_urns", String(item)) const url = `${baseUrl.replace(/\/+$/, '')}/persons/${encodeURIComponent(String(args.id_or_urn))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(personOutput, await res.json()) };