import {z} from 'zod' export type BusinessSearchOptions = 'Order.WebsiteAnalysis' | 'Order.NaicsPrediction' | 'Order.Pep' | 'Order.Enhanced'; export type V1BusinessSearchRequest = {name: string, address: string, officer_names?: (Array | null) | undefined, website?: (string | null) | undefined, phone_number?: (string | null) | undefined, email?: (string | null) | undefined, alternative_names?: (Array | null) | undefined, tin?: (string | null) | undefined, options?: Array | undefined, reference_id?: (string | null) | undefined}; export type CreateApiSearchesArgs = {Prefer?: (string | null) | undefined, Accept?: (string | null) | undefined, body: V1BusinessSearchRequest}; export type CreateApiSearchesOptions = {baseUrl?: string | undefined, APIKeyHeader?: string | undefined, fetch?: typeof fetch | undefined}; export const v1OrderableType = z.enum(["WebsiteAnalysisRequest", "NAICSPredictionRequest"]); export const v1BusinessSearchOptionsOutput = z.enum(["Order.WebsiteAnalysis", "Order.NaicsPrediction", "Order.Pep", "Order.Enhanced"]); export const v1Orderable = z.object({type: v1OrderableType, id: z.string(), url: z.string(), option: v1BusinessSearchOptionsOutput}); export const v1UserAttributionResponse = z.object({id: z.string(), first_name: z.string(), last_name: z.string(), email: z.string()}); export const v1TaskState = z.enum(["PENDING", "EXECUTING", "COMPLETED", "FAILED", "CANCELLED"]); export const v1StateAbbreviation = z.enum(["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY", "PR", "VI", "AE", "AA", "AP", "GU", "AS"]); export const v1AddressRDI = z.enum(["Residential", "Commercial"]); export const v1USPSDeliveryType = z.enum(["FIRM", "GENERAL_DELIVERY", "HIGH_RISE", "POST_OFFICE", "RURAL_ROUTE", "STREET"]); export const v1AddressSummaryResponse = z.object({id: z.string(), street: z.string(), city: z.string(), state: v1StateAbbreviation, zip: z.string(), latitude: z.number(), longitude: z.number(), rdi: v1AddressRDI.nullable().optional(), deliverable: z.boolean().nullable().optional(), cmra: z.boolean().nullable().optional(), url: z.string().min(1).max(2083).nullable().optional(), delivery_type: v1USPSDeliveryType.nullable().optional()}); export const v1IRSTINMatchType = z.enum(["SSN", "EIN", "UNKNOWN"]); export const v1WatchlistDataSource = z.enum(["Death Master File", "Department of Treasury, Office of Foreign Assets Control", "Politically Exposed Persons", "IRS Exempt Organizations List", "FBI Wanted List", "Department of Commerce, Consolidated Screening List", "Consolidated Canadian Autonomous Sanctions List", "HHS OIG List of Excluded Individuals/Entities", "Baselayer Fraud Consortium"]); export const v1WatchlistHitResponse = z.object({code: z.string(), name: v1WatchlistDataSource, count: z.number().int(), details: z.array(z.record(z.string(), z.unknown())).nullable().optional()}); export const v1MatchType = z.enum(["NO_MATCH", "SIMILAR", "EXACT"]); export const v1AddressMatchType = z.enum(["NO_MATCH", "CITY", "STATE", "SIMILAR", "EXACT"]); export const v1AddressValidationLevel = z.enum(["FULL", "PARTIAL", "INVALID"]); export const v1ScoreType = z.enum(["fraud", "risk", "kyb"]); export const v1ScoreResponse = z.object({type: v1ScoreType, score: z.number(), rating: z.string()}); export const v1BusinessStructure = z.enum(["SOLE_PROPRIETORSHIP", "GENERAL_PARTNERSHIP", "LLC", "LLP", "LLLP", "LP", "C_CORPORATION", "S_CORPORATION", "B_CORPORATION", "NONPROFIT", "COOPERATIVE", "TRUST", "PROFESSIONAL_ASSOCIATION", "PROFESSIONAL_CORPORATION", "TRADE_NAME", "BANK", "CREDIT_UNION", "INSURANCE", "OTHER"]); export const v1EntitySource = z.enum(["SOS", "Online"]); export const v1AddressSummaryResponseWithSources = z.object({id: z.string(), street: z.string(), city: z.string(), state: v1StateAbbreviation, zip: z.string(), latitude: z.number(), longitude: z.number(), rdi: v1AddressRDI.nullable().optional(), deliverable: z.boolean().nullable().optional(), cmra: z.boolean().nullable().optional(), url: z.string().min(1).max(2083).nullable().optional(), delivery_type: v1USPSDeliveryType.nullable().optional(), sources: z.array(v1EntitySource).optional()}); export const v1ConfidenceLevel = z.enum(["high", "medium", "low"]); export const v1DiscoveredInstagramMetadata = z.object({is_private: z.boolean().nullable().optional(), is_business_account: z.boolean().nullable().optional(), has_business_address: z.boolean().nullable().optional(), bio: z.string().nullable().optional(), followers_count: z.number().int().nullable().optional(), phone_number: z.string().nullable().optional(), email: z.string().nullable().optional(), address: z.string().nullable().optional(), business_website: z.string().nullable().optional()}); export const v1DiscoveredLinkedInMetadata = z.object({company_size_range: z.string().nullable().optional(), industry: z.string().nullable().optional(), followers_count: z.number().int().nullable().optional(), phone_number: z.string().nullable().optional(), bio: z.string().nullable().optional(), email: z.string().nullable().optional(), number_of_employees: z.number().int().nullable().optional(), business_website: z.string().nullable().optional()}); export const v1DiscoveredFacebookMetadata = z.object({is_business_page: z.boolean().nullable().optional(), has_reviews: z.boolean().nullable().optional(), check_ins_count: z.number().int().nullable().optional(), followers_count: z.number().int().nullable().optional(), bio: z.string().nullable().optional(), phone_number: z.string().nullable().optional(), address: z.string().nullable().optional(), email: z.string().nullable().optional(), business_website: z.string().nullable().optional()}); export const v1DiscoveredXMetadata = z.object({is_verified: z.boolean().nullable().optional(), follower_count: z.number().int().nullable().optional(), bio: z.string().nullable().optional(), joined_date: z.string().nullable().optional(), address: z.string().nullable().optional(), phone_number: z.string().nullable().optional(), email: z.string().nullable().optional(), business_website: z.string().nullable().optional()}); export const v1DiscoveredYouTubeMetadata = z.object({is_verified: z.boolean().nullable().optional(), subscriber_count: z.number().int().nullable().optional(), channel_type: z.string().nullable().optional(), has_business_email: z.boolean().nullable().optional(), channel_description: z.string().nullable().optional(), followers_count: z.number().int().nullable().optional(), phone_number: z.string().nullable().optional(), email: z.string().nullable().optional(), business_website: z.string().nullable().optional()}); export const v1DiscoveredTikTokMetadata = z.object({is_verified: z.boolean().nullable().optional(), is_business_account: z.boolean().nullable().optional(), follower_count: z.number().int().nullable().optional(), bio: z.string().nullable().optional(), has_business_website: z.boolean().nullable().optional(), phone_number: z.string().nullable().optional(), email: z.string().nullable().optional(), business_website: z.string().nullable().optional()}); export const v1DiscoveredPinterestMetadata = z.object({follower_count: z.number().int().nullable().optional(), monthly_views: z.number().int().nullable().optional(), bio: z.string().nullable().optional(), has_business_website: z.boolean().nullable().optional(), phone_number: z.string().nullable().optional(), email: z.string().nullable().optional(), business_website: z.string().nullable().optional()}); export const v1DiscoveredSocialProfile = z.object({site: z.enum(["linked_in:personal", "linked_in:company", "twitter", "instagram", "facebook", "youtube", "tiktok", "pinterest", "x"]), username: z.string(), confidence: v1ConfidenceLevel.nullable().optional(), metadata: z.union([v1DiscoveredInstagramMetadata, v1DiscoveredLinkedInMetadata, v1DiscoveredFacebookMetadata, v1DiscoveredXMetadata, v1DiscoveredYouTubeMetadata, v1DiscoveredTikTokMetadata, v1DiscoveredPinterestMetadata]).nullable().optional(), found_on: z.array(z.enum(["INPUT_WEBSITE", "FOUND_WEBSITE"])).optional(), url: z.string()}); export const v1ReviewSource = z.enum(["yelp", "google", "trustpilot", "tripadvisor", "other"]); export const v1ReviewDetail = z.object({username: z.string(), text: z.string(), date: z.string(), rating: z.number().int()}); export const v1GoogleReviewMetadata = z.object({open_state: z.string().nullable().optional(), operating_hours: z.record(z.string(), z.unknown()).nullable().optional(), description: z.string().nullable().optional(), types: z.array(z.string()).nullable().optional(), service_options: z.record(z.string(), z.unknown()).nullable().optional()}); export const v1DiscoveredReview = z.object({source: v1ReviewSource.nullable().optional(), url: z.string(), confidence: v1ConfidenceLevel.nullable().optional(), rating: z.number().gte(0).lte(5).nullable().optional(), volume: z.number().int().gte(0).nullable().optional(), summary: z.string().nullable().optional(), phone_number: z.string().nullable().optional(), address: z.string().nullable().optional(), business_website: z.string().nullable().optional(), reviews: z.array(v1ReviewDetail).optional(), metadata: v1GoogleReviewMetadata.nullable().optional()}); export const v1DirectoryListingPerson = z.object({name: z.string(), title: z.string().nullable().optional()}); export const v1DirectoryListingResponse = z.object({source: z.string().nullable().optional(), url: z.string().nullable().optional(), category: z.string().nullable().optional(), business_name: z.string().nullable().optional(), phone_number: z.string().nullable().optional(), email: z.string().nullable().optional(), business_website: z.string().nullable().optional(), address: z.string().nullable().optional(), people: z.array(v1DirectoryListingPerson).optional()}); export const v1CorporateRegistrationDomesticStatus = z.enum(["foreign", "domestic", "unknown"]); export const v1CorporateRegistrationStatus = z.enum(["active", "inactive", "unknown"]); export const v1CorporateRegistrationAgentResponse = z.object({name: z.string(), address: v1AddressSummaryResponse.nullable().optional()}); export const v1RegistrationOfficerResponse = z.object({name: z.string(), titles: z.array(z.string()).optional()}); export const v1RegistrationResponse = z.object({id: z.string(), name: z.string(), issue_date: z.string().nullable().optional(), inactive_date: z.string().nullable().optional(), dissolution_date: z.string().nullable().optional(), file_number: z.string(), state: v1StateAbbreviation, address: v1AddressSummaryResponse.nullable().optional(), registration_type: v1CorporateRegistrationDomesticStatus.nullable().optional(), status: v1CorporateRegistrationStatus, standing: z.string().nullable().optional(), registered_agent: v1CorporateRegistrationAgentResponse.nullable().optional(), officers: z.array(v1RegistrationOfficerResponse).optional()}); export const v1BusinessOfficerResponse = z.object({name: z.string(), titles: z.array(z.string()).optional(), states: z.array(v1StateAbbreviation).optional(), sources: z.array(v1EntitySource).optional()}); export const v1VisaRiskTier = z.union([z.literal(1), z.literal(2), z.literal(3)]); export const v1MCC = z.object({code: z.string(), description: z.string().nullable().optional(), mastercard_risk: z.boolean().nullable().optional(), visa_risk_tier: v1VisaRiskTier.nullable().optional()}); export const v1SICCode = z.object({code: z.string(), description: z.string().nullable().optional()}); export const v1RiskLevel = z.enum(["high", "medium", "low", "no_risk"]); export const v1PredictedNaicsResponse = z.object({code: z.string(), title: z.string(), accuracy: z.number().nullable().optional(), keywords: z.array(z.string()).nullable().optional(), mcc_codes: z.array(v1MCC).nullable().optional(), sic_codes: z.array(v1SICCode).nullable().optional(), risk_level: v1RiskLevel.nullable().optional(), reasoning: z.string().nullable().optional()}); export const v1SecRegistrationResponse = z.object({cik: z.string(), tickers: z.array(z.string()), exchanges: z.array(z.string()), sec_edgar_url: z.string().min(1).max(2083)}); export const v1BusinessResponse = z.object({id: z.string(), name: z.string(), structure: v1BusinessStructure.nullable().optional(), addresses: z.array(v1AddressSummaryResponseWithSources).optional(), phone_numbers: z.array(z.string()).optional(), email: z.string().nullable().optional(), website: z.string().nullable().optional(), social_profiles: z.array(v1DiscoveredSocialProfile).nullable().optional(), reviews: z.array(v1DiscoveredReview).nullable().optional(), directory_listings: z.array(v1DirectoryListingResponse).nullable().optional(), ein: z.string().nullable().optional(), incorporation_state: v1StateAbbreviation.nullable().optional(), incorporation_date: z.string().nullable().optional(), months_in_business: z.number().int().nullable().optional(), primary_address: v1AddressSummaryResponse.nullable().optional(), alternative_names: z.array(z.string()).optional(), registrations: z.array(v1RegistrationResponse).optional(), business_officers: z.array(v1BusinessOfficerResponse).optional(), predicted_naics: z.array(v1PredictedNaicsResponse).optional(), watchlist_hits: z.array(v1WatchlistHitResponse).optional(), sec_registrations: z.array(v1SecRegistrationResponse).optional(), url: z.string().min(1).max(2083), console_url: z.string().min(1).max(2083), revenue: z.unknown(), phone_number: z.string().nullable().optional(), address: z.string().nullable()}); export const v1GetBusinessSearchResponse = z.object({id: z.string(), options: z.array(z.enum(["Order.WebsiteAnalysis", "Order.NaicsPrediction", "Order.Pep", "Order.Enhanced"])), orderables: z.array(v1Orderable).optional(), user: v1UserAttributionResponse.nullable().optional(), state: v1TaskState, name: z.string(), address: z.string(), search_address: v1AddressSummaryResponse.nullable().optional(), officer_names: z.array(z.string()).nullable().optional(), alternative_names: z.array(z.string()).nullable().optional(), website: z.string().nullable().optional(), phone_number: z.string().nullable().optional(), email: z.string().nullable().optional(), tin: z.string().nullable().optional(), reference_id: z.string().nullable().optional(), tin_matched: z.boolean().nullable().optional(), tin_match_type: v1IRSTINMatchType.nullable().optional(), tin_potential_match: z.string().nullable().optional(), watchlist_hits: z.array(v1WatchlistHitResponse).optional(), business_name_match: v1MatchType.nullable().optional(), business_address_match: v1AddressMatchType.nullable().optional(), business_officer_match: v1MatchType.nullable().optional(), registered_agent_match: v1MatchType.nullable().optional(), business_website_match: z.boolean().nullable().optional(), business_website_redirect_match: z.boolean().nullable().optional(), search_address_validation_level: v1AddressValidationLevel.nullable().optional(), created_at: z.string(), updated_at: z.string().nullable().optional(), verified: z.boolean().nullable().optional(), scores: z.array(v1ScoreResponse).nullable().optional(), error: z.string().nullable().optional(), warnings: z.array(z.string()).optional(), business: v1BusinessResponse.nullable().optional(), url: z.string().min(1).max(2083), status_url: z.string().min(1).max(2083), business_url: z.string().min(1).max(2083).nullable(), console_url: z.string().min(1).max(2083).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 }; /** * Post Search * * POST /searches */ export const createApiSearches = async (args: CreateApiSearchesArgs, options?: CreateApiSearchesOptions) => { const {baseUrl = "https://api.baselayer.com", fetch: fetchFn = fetch, APIKeyHeader} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.Prefer != null) headers.set("Prefer", String(args.Prefer)) if (args.Accept != null) headers.set("Accept", String(args.Accept)) if (APIKeyHeader !== undefined) headers.set("X-API-Key", APIKeyHeader) const url = `${baseUrl.replace(/\/+$/, '')}/searches${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(v1GetBusinessSearchResponse, await res.json()) };