import {z} from 'zod' export type GetApiApiV1UsersIdentifierArgs = {linkedin_sections?: (Array<'*' | '*_preview' | 'about' | 'experience' | 'education' | 'languages' | 'skills' | 'certifications' | 'volunteering_experience' | 'projects' | 'recommendations_received' | 'recommendations_given' | 'recruiting_activity' | 'experience_preview' | 'education_preview' | 'languages_preview' | 'skills_preview' | 'certifications_preview' | 'volunteering_experience_preview' | 'projects_preview' | 'recommendations_received_preview' | 'recommendations_given_preview'>) | undefined, linkedin_api?: ('recruiter' | 'sales_navigator') | undefined, notify?: boolean | undefined, account_id: string, identifier: string}; export type GetApiApiV1UsersIdentifierOptions = {baseUrl?: string | undefined, AccessToken?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiApiV1UsersIdentifierResponse = z.union([z.object({provider: z.literal("LINKEDIN"), provider_id: z.string(), public_identifier: z.union([z.string(), z.unknown()]), first_name: z.union([z.string(), z.unknown()]), last_name: z.union([z.string(), z.unknown()]), pronoun: z.string().optional(), headline: z.string(), summary: z.string().optional(), contact_info: z.object({emails: z.array(z.string()).optional(), phones: z.array(z.string()).optional(), adresses: z.array(z.string()).optional(), socials: z.array(z.object({type: z.string(), name: z.string()})).optional()}).optional(), birthdate: z.object({month: z.number(), day: z.number()}).optional(), primary_locale: z.object({country: z.string(), language: z.string()}).optional(), location: z.string().optional(), websites: z.array(z.string()), creator_website: z.object({url: z.string(), description: z.string()}).optional(), profile_picture_url: z.string().optional(), profile_picture_url_large: z.string().optional(), background_picture_url: z.string().optional(), hashtags: z.array(z.string()).optional(), can_send_inmail: z.boolean().optional(), connected_at: z.number().optional(), is_open_profile: z.boolean().optional(), is_premium: z.boolean().optional(), is_influencer: z.boolean().optional(), is_creator: z.boolean().optional(), is_hiring: z.boolean().optional(), is_open_to_work: z.boolean().optional(), is_saved_lead: z.boolean().optional(), is_crm_imported: z.boolean().optional(), is_relationship: z.boolean().optional(), is_self: z.boolean().optional(), invitation: z.object({type: z.union([z.literal("SENT"), z.literal("RECEIVED")]), status: z.union([z.literal("PENDING"), z.literal("IGNORED"), z.literal("WITHDRAWN")])}).optional(), work_experience: z.array(z.object({id: z.string().optional(), position: z.string(), company_id: z.string().optional(), company_url: z.string().optional(), company_picture_url: z.string().optional(), industry: z.array(z.string()).optional(), company: z.string(), location: z.string().optional(), description: z.string().optional(), skills: z.array(z.string()), current: z.boolean().optional(), status: z.string().optional(), start: z.union([z.string(), z.unknown()]), end: z.union([z.string(), z.unknown()])})).optional(), work_experience_total_count: z.number().optional(), volunteering_experience: z.array(z.object({company: z.string(), description: z.string(), role: z.string(), cause: z.string(), start: z.union([z.string(), z.unknown()]), end: z.union([z.string(), z.unknown()])})).optional(), volunteering_experience_total_count: z.number().optional(), education: z.array(z.object({id: z.string().optional(), degree: z.string().optional(), grade: z.string().optional(), description: z.string().optional(), activities: z.string().optional(), school: z.string(), school_id: z.string().optional(), school_url: z.string().optional(), school_picture_url: z.string().optional(), skills: z.array(z.string()).optional(), field_of_study: z.string().optional(), start: z.union([z.string(), z.unknown()]), end: z.union([z.string(), z.unknown()])})).optional(), education_total_count: z.number().optional(), skills: z.array(z.object({name: z.string(), endorsement_count: z.number(), endorsement_id: z.union([z.number(), z.unknown()]), insights: z.array(z.string()), endorsed: z.boolean()})).optional(), skills_total_count: z.number().optional(), languages: z.array(z.object({name: z.string(), proficiency: z.string().optional()})).optional(), languages_total_count: z.number().optional(), certifications: z.array(z.object({name: z.string(), organization: z.string(), url: z.string().optional()})).optional(), certifications_total_count: z.number().optional(), projects: z.array(z.object({name: z.string(), description: z.string(), skills: z.array(z.string()), start: z.union([z.string(), z.unknown()]), end: z.union([z.string(), z.unknown()])})).optional(), projects_total_count: z.number().optional(), recommendations: z.object({received: z.array(z.object({text: z.string(), caption: z.string(), actor: z.object({first_name: z.string(), last_name: z.string(), provider_id: z.string(), headline: z.string(), public_identifier: z.string(), public_profile_url: z.string(), profile_picture_url: z.string().optional()})})).optional(), received_total_count: z.number().optional(), given: z.array(z.object({text: z.string(), caption: z.string(), actor: z.object({first_name: z.string(), last_name: z.string(), provider_id: z.string(), headline: z.string(), public_identifier: z.string(), public_profile_url: z.string(), profile_picture_url: z.string().optional()})})).optional(), given_total_count: z.number().optional()}).optional(), tags: z.array(z.object({id: z.string(), name: z.string()})).optional(), notes: z.array(z.object({project_id: z.string(), content: z.string(), created_at: z.number(), author: z.object({id: z.string(), seat_id: z.string(), first_name: z.string(), last_name: z.string(), public_profile_url: z.boolean()})})).optional(), candidate_id: z.string().optional(), recruiting_activity: z.array(z.union([z.object({created_at: z.string(), created_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}), updated_at: z.string().optional(), updated_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}).optional(), event: z.literal("MESSAGE"), content: z.string(), status: z.union([z.literal("PENDING"), z.literal("ACCEPTED"), z.literal("DECLINED"), z.literal("AWAITING_REPLY")])}), z.object({created_at: z.string(), created_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}), updated_at: z.string().optional(), updated_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}).optional(), event: z.enum(["NOTE_ADDED", "NOTE_EDITED", "NOTE_DELETED"]), content: z.string().optional()}), z.object({created_at: z.string(), created_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}), updated_at: z.string().optional(), updated_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}).optional(), event: z.enum(["LINK_ADDED", "LINK_DELETED"]), content: z.string()}), z.object({created_at: z.string(), created_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}), updated_at: z.string().optional(), updated_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}).optional(), event: z.enum(["CANDIDATE_ADDED", "CANDIDATE_MOVED"]), project_id: z.string(), project_name: z.string(), state: z.string()}), z.object({created_at: z.string(), created_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}), updated_at: z.string().optional(), updated_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}).optional(), event: z.literal("PROFILE_VIEW")}), z.object({created_at: z.string(), created_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}), updated_at: z.string().optional(), updated_by: z.object({provider_id: z.string(), full_name: z.string(), picture_url: z.string().optional()}).optional(), event: z.literal("UNHANDLED_EVENT")})])).optional(), throttled_sections: z.array(z.union([z.literal("experience"), z.literal("education"), z.literal("languages"), z.literal("skills"), z.literal("certifications"), z.literal("volunteering_experience"), z.literal("projects"), z.literal("recommendations_received"), z.literal("recommendations_given")])).optional(), follower_count: z.number().optional(), connections_count: z.number().optional(), shared_connections_count: z.number().optional(), network_distance: z.union([z.literal("FIRST_DEGREE"), z.literal("SECOND_DEGREE"), z.literal("THIRD_DEGREE"), z.literal("OUT_OF_NETWORK")]).optional(), public_profile_url: z.string().optional(), locked: z.boolean().optional(), unlock_credit: z.number().optional(), object: z.literal("UserProfile")}), z.object({provider: z.literal("WHATSAPP"), id: z.string(), name: z.string().optional(), phone_number: z.string().optional(), profile_picture_url: z.string().optional(), is_business: z.boolean().optional(), object: z.literal("UserProfile")}), z.object({provider: z.literal("INSTAGRAM"), provider_id: z.string(), provider_messaging_id: z.string().optional(), public_identifier: z.string(), full_name: z.string(), profile_picture_url: z.string().optional(), profile_picture_url_large: z.string().optional(), biography: z.string().optional(), category: z.string().optional(), followers_count: z.number(), mutual_followers_count: z.number(), following_count: z.number(), posts_count: z.number(), profile_type: z.union([z.literal("PERSONNAL"), z.literal("BUSINESS"), z.literal("PROFESSIONNAL")]), is_verified: z.boolean(), is_private: z.boolean(), external_links: z.array(z.string()), relationship_status: z.object({following: z.boolean(), followed_by: z.boolean(), has_sent_invitation: z.boolean(), has_received_invitation: z.boolean()}), business: z.object({category: z.union([z.string(), z.unknown()]), address_street: z.union([z.string(), z.unknown()]), address_city: z.union([z.string(), z.unknown()]), address_zipcode: z.union([z.string(), z.unknown()]), phone_number: z.union([z.string(), z.unknown()]), email: z.union([z.string(), z.unknown()])}).optional(), object: z.literal("UserProfile")}), z.object({provider: z.literal("TELEGRAM"), provider_id: z.string(), self: z.union([z.boolean(), z.unknown()]).optional(), contact: z.union([z.boolean(), z.unknown()]).optional(), mutual_contact: z.union([z.boolean(), z.unknown()]).optional(), deleted: z.union([z.boolean(), z.unknown()]).optional(), bot: z.union([z.boolean(), z.unknown()]).optional(), verified: z.union([z.boolean(), z.unknown()]).optional(), restricted: z.union([z.boolean(), z.unknown()]).optional(), fake: z.union([z.boolean(), z.unknown()]).optional(), premium: z.union([z.boolean(), z.unknown()]).optional(), close_friend: z.union([z.boolean(), z.unknown()]).optional(), first_name: z.union([z.string(), z.unknown()]).optional(), last_name: z.union([z.string(), z.unknown()]).optional(), username: z.union([z.string(), z.unknown()]).optional(), phone: z.union([z.string(), z.unknown()]).optional(), profile_picture_url: z.string(), status: z.union([z.object({name: z.string(), expires: z.number().optional(), was_online: z.number().optional()}), z.unknown()]).optional(), restriction_reason: z.union([z.array(z.object({platform: z.string(), reason: z.string(), text: z.string()})), z.unknown()]).optional(), lang_code: z.union([z.string(), z.unknown()]).optional(), object: z.literal("UserProfile")}), z.object({provider: z.literal("TWITTER"), id: z.string(), name: z.string(), screen_name: z.string(), location: z.string(), description: z.union([z.unknown(), z.string()]), url: z.union([z.unknown(), z.string()]), entities: z.object({description: z.object({urls: z.array(z.unknown())})}), protected: z.boolean(), verified: z.boolean(), followers_count: z.number(), friends_count: z.number(), listed_count: z.number(), favourites_count: z.number(), statuses_count: z.number(), created_at: z.string(), profile_banner_url: z.union([z.string(), z.unknown()]).optional(), profile_image_url_https: z.string(), default_profile: z.boolean(), default_profile_image: z.boolean(), withheld_in_countries: z.array(z.string()), followed_by: z.union([z.unknown(), z.boolean()]).optional(), following: z.union([z.unknown(), z.boolean()]).optional(), follow_request_sent: z.union([z.unknown(), z.boolean()]).optional(), has_extended_profile: z.union([z.unknown(), z.boolean()]).optional(), notifications: z.union([z.unknown(), z.boolean()]).optional(), advertiser_account_type: z.union([z.unknown(), z.string()]).optional(), business_profile_state: z.union([z.unknown(), z.string()]).optional(), require_some_consent: z.union([z.unknown(), z.boolean()]).optional(), object: z.literal("UserProfile")})]); 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 }; /** * Retrieve a profile * * GET /api/v1/users/{identifier} */ export const getApiApiV1UsersIdentifier = async (args: GetApiApiV1UsersIdentifierArgs, options?: GetApiApiV1UsersIdentifierOptions) => { const {baseUrl = "https://api1.unipile.com:13111", fetch: fetchFn = fetch, AccessToken} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") for (const item of args.linkedin_sections ?? []) query.append("linkedin_sections", String(item)) if (args.linkedin_api != null) query.append("linkedin_api", String(args.linkedin_api)) if (args.notify != null) query.append("notify", String(args.notify)) if (args.account_id != null) query.append("account_id", String(args.account_id)) if (AccessToken !== undefined) headers.set("X-API-KEY", AccessToken) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/users/${encodeURIComponent(String(args.identifier))}${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(getApiApiV1UsersIdentifierResponse, await res.json()) };