import {z} from 'zod' export type GetApiApiV1LinkedinCompanyIdentifierArgs = {account_id: string, identifier: string}; export type GetApiApiV1LinkedinCompanyIdentifierOptions = {baseUrl?: string | undefined, AccessToken?: string | undefined, fetch?: typeof fetch | undefined}; export const getApiApiV1LinkedinCompanyIdentifierResponse = z.object({object: z.literal("CompanyProfile"), id: z.string(), name: z.string(), description: z.string(), entity_urn: z.string(), public_identifier: z.string(), profile_url: z.string(), tagline: z.string().optional(), followers_count: z.number().optional(), is_following: z.boolean().optional(), is_employee: z.boolean().optional(), hashtags: z.array(z.object({title: z.string()})), messaging: z.object({is_enabled: z.boolean(), id: z.string().optional(), entity_urn: z.string().optional()}), claimed: z.boolean(), viewer_permissions: z.object({canMembersInviteToFollow: z.boolean(), canReadContentSuggestions: z.boolean(), canReadMessages: z.boolean(), canUpdateOrganizationProfile: z.boolean(), canCreateOrganicShare: z.boolean(), canReadAdminDashboard: z.boolean(), canReadOrganizationActivity: z.boolean(), canEditCurators: z.boolean(), canManageOrganizationalPageFollow: z.boolean(), canReadOrganizationFollowerAnalytics: z.boolean(), canInviteMemberToFollow: z.boolean(), canReadOrganizationLeadsAnalytics: z.boolean(), canEditPendingAdministrators: z.boolean(), canManageMessagingAccess: z.boolean(), canSeeEmployeeExperienceAsMember: z.boolean(), canEmployeesInviteToFollow: z.boolean(), canSeeOrganizationAdministrativePage: z.boolean(), canManageAdminRoles: z.boolean(), canEditOrganizationDetails: z.boolean(), canApproveContent: z.boolean(), canViewTeamPerformance: z.boolean(), canManageOrganizationSettings: z.boolean(), canAccessAdvancedAnalytics: z.boolean(), canModerateComments: z.boolean(), canCreateAds: z.boolean(), canManageAdBudgets: z.boolean(), canEditPageTheme: z.boolean(), canPublishNewsletters: z.boolean(), canEditCustomTabs: z.boolean(), canManageIntegrations: z.boolean(), canAssignRoles: z.boolean(), canApprovePendingMembers: z.boolean(), canEditCareerPageSettings: z.boolean(), canViewBillingInformation: z.boolean()}), organization_type: z.union([z.literal("PUBLIC_COMPANY"), z.literal("EDUCATIONAL"), z.literal("SELF_EMPLOYED"), z.literal("GOVERNMENT_AGENCY"), z.literal("NON_PROFIT"), z.literal("SELF_OWNED"), z.literal("PRIVATELY_HELD"), z.literal("PARTNERSHIP"), z.unknown()]), locations: z.array(z.object({is_headquarter: z.boolean(), country: z.string(), city: z.string(), postalCode: z.string().optional(), street: z.array(z.string()), description: z.string().optional(), area: z.string().optional()})), logo: z.string().optional(), localized_description: z.array(z.record(z.string(), z.unknown())).optional(), localized_name: z.array(z.record(z.string(), z.unknown())).optional(), localized_tagline: z.array(z.record(z.string(), z.unknown())).optional(), industry: z.array(z.string()).optional(), activities: z.array(z.string()).optional(), employee_count: z.number().optional(), employee_count_range: z.object({from: z.number(), to: z.number()}).optional(), website: z.string().optional(), foundation_date: z.string().optional(), phone: z.string().optional(), insights: z.object({employeesCount: z.object({totalCount: z.number(), averageTenure: z.string(), employeesCountGraph: z.array(z.object({date: z.string(), count: z.number()})), growthGraph: z.array(z.object({monthRange: z.number(), growthPercentage: z.number()}))}).optional()}).optional(), acquired_by: z.object({id: z.string(), name: z.string(), public_identifier: z.string(), profile_url: z.string()}).optional(), crunchbase_funding: z.object({last_updated_at: z.string(), company_url: z.string(), rounds: z.object({url: z.string(), total_count: z.number(), last_round: z.object({announced_on: z.string(), url: z.string(), funding_type: z.string(), investors_count: z.number(), lead_investors: z.array(z.object({name: z.string(), url: z.string(), logo: z.string().optional()})), money_raised: z.object({amount: z.number(), currency: z.string()}).optional()})})}).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 }; /** * Retrieve a company profile * * GET /api/v1/linkedin/company/{identifier} */ export const getApiApiV1LinkedinCompanyIdentifier = async (args: GetApiApiV1LinkedinCompanyIdentifierArgs, options?: GetApiApiV1LinkedinCompanyIdentifierOptions) => { 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") 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/linkedin/company/${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(getApiApiV1LinkedinCompanyIdentifierResponse, await res.json()) };