import {z} from 'zod' export type GetApiV5IpEnrichArgs = {'Content-Type'?: 'application/json' | undefined, ip: string, return_ip_location?: boolean | undefined, return_ip_metadata?: boolean | undefined, return_person?: boolean | undefined, return_if_unmatched?: boolean | undefined, titlecase?: boolean | undefined, pretty?: boolean | undefined}; export type GetApiV5IpEnrichOptions = {baseUrl?: string | undefined, APIKeyHeader?: string | undefined, fetch?: typeof fetch | undefined}; export const companyLocation = z.object({geo: z.string().optional(), street_address: z.string().optional(), address_line_2: z.string().optional(), continent: z.enum(["africa", "antarctica", "asia", "europe", "north america", "oceania", "south america"]).optional(), locality: z.string().optional(), metro: z.enum(["abilene, texas", "akron, ohio", "albany, georgia", "albany, new york", "albany, oregon", "albuquerque, new mexico", "alexandria, louisiana", "allentown, pennsylvania", "altoona, pennsylvania", "amarillo, texas", "ames, iowa", "anchorage, alaska", "ann arbor, michigan", "anniston, alabama", "appleton, wisconsin", "asheville, north carolina", "athens, georgia", "atlanta, georgia", "atlantic city, new jersey", "auburn, alabama", "augusta, georgia", "austin, texas", "bakersfield, california", "baltimore, maryland", "bangor, maine", "barnstable town, massachusetts", "baton rouge, louisiana", "battle creek, michigan", "bay city, michigan", "beaumont, texas", "bellingham, washington", "billings, montana", "binghamton, new york", "birmingham, alabama", "bismarck, north dakota", "blacksburg, virginia", "bloomington, illinois", "bloomington, indiana", "boise city, idaho", "boston, massachusetts", "boulder, colorado", "bowling green, kentucky", "bremerton, washington", "bridgeport, connecticut", "brownsville, texas", "buffalo, new york", "burlington, north carolina", "burlington, vermont", "canton, ohio", "cape coral, florida", "cape girardeau, missouri", "carbondale, illinois", "carson city, nevada", "casper, wyoming", "cedar rapids, iowa", "champaign, illinois", "charleston, south carolina", "charleston, west virginia", "charlotte, north carolina", "charlottesville, virginia", "chattanooga, tennessee", "cheyenne, wyoming", "chicago, illinois", "chico, california", "cincinnati, ohio", "clarksville, tennessee", "cleveland, ohio", "cleveland, tennessee", "coeur d'alene, idaho", "college station, texas", "colorado springs, colorado", "columbia, missouri", "columbia, south carolina", "columbus, georgia", "columbus, indiana", "columbus, ohio", "corpus christi, texas", "corvallis, oregon", "crestview, florida", "cumberland, maryland", "dallas, texas", "dalton, georgia", "danville, illinois", "davenport, iowa", "dayton, ohio", "decatur, alabama", "decatur, illinois", "deltona, florida", "denver, colorado", "des moines, iowa", "detroit, michigan", "district of columbia", "dothan, alabama", "dover, delaware", "dubuque, iowa", "duluth, minnesota", "durham, north carolina", "eau claire, wisconsin", "el centro, california", "el paso, texas", "elizabethtown, kentucky", "elkhart, indiana", "elmira, new york", "enid, oklahoma", "erie, pennsylvania", "eugene, oregon", "evansville, indiana", "fairbanks, alaska", "fargo, north dakota", "farmington, new mexico", "fayetteville, arkansas", "fayetteville, north carolina", "flagstaff, arizona", "flint, michigan", "florence, alabama", "florence, south carolina", "fond du lac, wisconsin", "fort collins, colorado", "fort smith, arkansas", "fort wayne, indiana", "fresno, california", "gadsden, alabama", "gainesville, florida", "gainesville, georgia", "goldsboro, north carolina", "grand forks, north dakota", "grand island, nebraska", "grand junction, colorado", "grand rapids, michigan", "grants pass, oregon", "great falls, montana", "greeley, colorado", "green bay, wisconsin", "greensboro, north carolina", "greenville, north carolina", "greenville, south carolina", "gulfport, mississippi", "hagerstown, maryland", "hanford, california", "harrisburg, pennsylvania", "harrisonburg, virginia", "hartford, connecticut", "hattiesburg, mississippi", "hickory, north carolina", "hilton head island, south carolina", "hinesville, georgia", "hot springs, arkansas", "houma, louisiana", "houston, texas", "huntington, west virginia", "huntsville, alabama", "idaho falls, idaho", "indianapolis, indiana", "iowa city, iowa", "ithaca, new york", "jackson, michigan", "jackson, mississippi", "jackson, tennessee", "jacksonville, florida", "jacksonville, north carolina", "janesville, wisconsin", "jefferson city, missouri", "johnson city, tennessee", "johnstown, pennsylvania", "jonesboro, arkansas", "joplin, missouri", "kahului, hawaii", "kalamazoo, michigan", "kankakee, illinois", "kansas city, missouri", "kennewick, washington", "killeen, texas", "kingsport, tennessee", "kingston, new york", "knoxville, tennessee", "kokomo, indiana", "la crosse, wisconsin", "lafayette, indiana", "lafayette, louisiana", "lake charles, louisiana", "lake havasu city, arizona", "lakeland, florida", "lancaster, pennsylvania", "lansing, michigan", "laredo, texas", "las cruces, new mexico", "las vegas, nevada", "lawrence, kansas", "lawton, oklahoma", "lebanon, pennsylvania", "lewiston, idaho", "lewiston, maine", "lexington, kentucky", "lima, ohio", "lincoln, nebraska", "little rock, arkansas", "logan, utah", "longview, texas", "longview, washington", "los angeles, california", "louisville, kentucky", "lubbock, texas", "lynchburg, virginia", "macon, georgia", "madera, california", "madison, wisconsin", "manchester, new hampshire", "manhattan, kansas", "mankato, minnesota", "mansfield, ohio", "mcallen, texas", "medford, oregon", "memphis, tennessee", "merced, california", "miami, florida", "michigan city, indiana", "midland, michigan", "midland, texas", "milwaukee, wisconsin", "minneapolis, minnesota", "missoula, montana", "mobile, alabama", "modesto, california", "monroe, louisiana", "monroe, michigan", "montgomery, alabama", "morgantown, west virginia", "morristown, tennessee", "mount vernon, washington", "muncie, indiana", "muskegon, michigan", "myrtle beach, south carolina", "napa, california", "naples, florida", "nashville, tennessee", "new bern, north carolina", "new haven, connecticut", "new orleans, louisiana", "new york, new york", "north port, florida", "norwich, connecticut", "ocala, florida", "odessa, texas", "ogden, utah", "oklahoma city, oklahoma", "olympia, washington", "omaha, nebraska", "orlando, florida", "oshkosh, wisconsin", "owensboro, kentucky", "oxnard, california", "palm bay, florida", "panama city, florida", "parkersburg, west virginia", "pensacola, florida", "peoria, illinois", "philadelphia, pennsylvania", "phoenix, arizona", "pine bluff, arkansas", "pittsburgh, pennsylvania", "pittsfield, massachusetts", "pocatello, idaho", "port st. lucie, florida", "portland, maine", "portland, oregon", "poughkeepsie, new york", "prescott valley, arizona", "providence, rhode island", "provo, utah", "pueblo, colorado", "punta gorda, florida", "racine, wisconsin", "raleigh, north carolina", "rapid city, south dakota", "reading, pennsylvania", "redding, california", "reno, nevada", "richmond, virginia", "riverside, california", "roanoke, virginia", "rochester, minnesota", "rochester, new york", "rockford, illinois", "rocky mount, north carolina", "rome, georgia", "sacramento, california", "saginaw, michigan", "salem, oregon", "salinas, california", "salisbury, maryland", "salt lake city, utah", "san angelo, texas", "san antonio, texas", "san diego, california", "san francisco, california", "san jose, california", "san luis obispo, california", "santa cruz, california", "santa fe, new mexico", "santa maria, california", "santa rosa, california", "savannah, georgia", "scranton, pennsylvania", "seattle, washington", "sebastian, florida", "sheboygan, wisconsin", "sherman, texas", "shreveport, louisiana", "sierra vista, arizona", "sioux city, iowa", "sioux falls, south dakota", "south bend, indiana", "spartanburg, south carolina", "spokane, washington", "springfield, illinois", "springfield, massachusetts", "springfield, missouri", "springfield, ohio", "st. cloud, minnesota", "st. george, utah", "st. joseph, missouri", "st. louis, missouri", "state college, pennsylvania", "staunton, virginia", "stockton, california", "sumter, south carolina", "syracuse, new york", "tallahassee, florida", "tampa, florida", "terre haute, indiana", "texarkana, texas", "toledo, ohio", "topeka, kansas", "trenton, new jersey", "tucson, arizona", "tulsa, oklahoma", "tuscaloosa, alabama", "twin falls, idaho", "tyler, texas", "urban honolulu, hawaii", "utica, new york", "valdosta, georgia", "vallejo, california", "victoria, texas", "vineland, new jersey", "virginia beach, virginia", "visalia, california", "waco, texas", "walla walla, washington", "warner robins, georgia", "waterloo, iowa", "watertown, new york", "wausau, wisconsin", "weirton, west virginia", "wenatchee, washington", "wheeling, west virginia", "wichita falls, texas", "wichita, kansas", "williamsport, pennsylvania", "wilmington, north carolina", "winchester, virginia", "worcester, massachusetts", "yakima, washington", "york, pennsylvania", "youngstown, ohio", "yuba city, california", "yuma, arizona"]).optional(), postal_code: z.string().optional(), name: z.string().optional(), country: z.enum(["afghanistan", "albania", "algeria", "american samoa", "andorra", "angola", "anguilla", "antarctica", "antigua and barbuda", "argentina", "armenia", "aruba", "australia", "austria", "azerbaijan", "bahamas", "bahrain", "bangladesh", "barbados", "belarus", "belgium", "belize", "benin", "bermuda", "bhutan", "bolivia", "bosnia and herzegovina", "botswana", "bouvet island", "brazil", "british indian ocean territory", "british virgin islands", "brunei", "bulgaria", "burkina faso", "burundi", "cambodia", "cameroon", "canada", "cape verde", "caribbean netherlands", "cayman islands", "central african republic", "chad", "chile", "china", "christmas island", "cocos (keeling) islands", "colombia", "comoros", "cook islands", "costa rica", "croatia", "cuba", "curaçao", "cyprus", "czechia", "democratic republic of the congo", "denmark", "djibouti", "dominica", "dominican republic", "ecuador", "egypt", "el salvador", "equatorial guinea", "eritrea", "estonia", "ethiopia", "falkland islands", "faroe islands", "fiji", "finland", "france", "french guiana", "french polynesia", "french southern territories", "gabon", "gambia", "georgia", "germany", "ghana", "gibraltar", "greece", "greenland", "grenada", "guadeloupe", "guam", "guatemala", "guernsey", "guinea", "guinea-bissau", "guyana", "haiti", "heard island and mcdonald islands", "honduras", "hong kong", "hungary", "iceland", "india", "indonesia", "iran", "iraq", "ireland", "isle of man", "israel", "italy", "ivory coast", "jamaica", "japan", "jersey", "jordan", "kazakhstan", "kenya", "kiribati", "kosovo", "kuwait", "kyrgyzstan", "laos", "latvia", "lebanon", "lesotho", "liberia", "libya", "liechtenstein", "lithuania", "luxembourg", "macau", "macedonia", "madagascar", "malawi", "malaysia", "maldives", "mali", "malta", "marshall islands", "martinique", "mauritania", "mauritius", "mayotte", "mexico", "micronesia", "moldova", "monaco", "mongolia", "montenegro", "montserrat", "morocco", "mozambique", "myanmar", "namibia", "nauru", "nepal", "netherlands", "netherlands antilles", "new caledonia", "new zealand", "nicaragua", "niger", "nigeria", "niue", "norfolk island", "north korea", "northern mariana islands", "norway", "oman", "pakistan", "palau", "palestine", "panama", "papua new guinea", "paraguay", "peru", "philippines", "pitcairn", "poland", "portugal", "puerto rico", "qatar", "republic of the congo", "romania", "russia", "rwanda", "réunion", "saint barthélemy", "saint helena", "saint kitts and nevis", "saint lucia", "saint martin", "saint pierre and miquelon", "saint vincent and the grenadines", "samoa", "san marino", "saudi arabia", "senegal", "serbia", "seychelles", "sierra leone", "singapore", "sint maarten", "slovakia", "slovenia", "solomon islands", "somalia", "south africa", "south georgia and the south sandwich islands", "south korea", "south sudan", "spain", "sri lanka", "sudan", "suriname", "svalbard and jan mayen", "swaziland", "sweden", "switzerland", "syria", "são tomé and príncipe", "taiwan", "tajikistan", "tanzania", "thailand", "timor-leste", "togo", "tokelau", "tonga", "trinidad and tobago", "tunisia", "turkey", "turkmenistan", "turks and caicos islands", "tuvalu", "u.s. virgin islands", "uganda", "ukraine", "united arab emirates", "united kingdom", "united states", "united states minor outlying islands", "uruguay", "uzbekistan", "vanuatu", "vatican city", "venezuela", "vietnam", "wallis and futuna", "western sahara", "yemen", "zambia", "zimbabwe", "åland islands"]).optional(), region: z.string().optional()}); export const iP = z.object({status: z.union([z.literal(200), z.literal(400), z.literal(401), z.literal(402), z.literal(404), z.literal(405), z.literal(429)]).optional(), data: z.object({ip: z.object({address: z.string().optional(), metadata: z.object({version: z.union([z.literal(4), z.literal(6)]).optional(), mobile: z.boolean().optional(), hosting: z.boolean().optional(), proxy: z.boolean().optional(), tor: z.boolean().optional(), vpn: z.boolean().optional(), relay: z.boolean().optional(), service: z.string().optional(), asn_domain: z.string().optional()}).optional(), location: companyLocation.optional()}).optional(), company: z.object({confidence: z.enum(["very high", "high", "moderate", "low", "very low"]).optional(), id: z.string().optional(), website: z.string().optional(), name: z.string().optional(), location: companyLocation.optional(), size: z.enum(["1-10", "11-50", "51-200", "201-500", "501-1000", "1001-5000", "5001-10000", "10001+"]).optional(), industry: z.string().optional(), inferred_revenue: z.string().optional(), employee_count: z.number().int().optional(), tags: z.array(z.string()).optional()}).optional(), person: z.object({confidence: z.enum(["very high", "high", "moderate", "low", "very low"]).optional(), job_title_role: z.enum(["customer_service", "design", "education", "engineering", "finance", "health", "human_resources", "legal", "marketing", "media", "operations", "public_relations", "real_estate", "sales", "trades"]).optional(), job_title_sub_role: z.enum(["accounting", "accounts", "brand_marketing", "broadcasting", "business_development", "compensation", "content_marketing", "customer_success", "data", "dental", "devops", "doctor", "editorial", "education_administration", "electrical", "employee_development", "events", "fitness", "graphic_design", "information_technology", "investment", "journalism", "judicial", "lawyer", "logistics", "mechanical", "media_relations", "network", "nursing", "office_management", "paralegal", "pipeline", "product", "product_design", "product_marketing", "professor", "project_engineering", "project_management", "property_management", "quality_assurance", "realtor", "recruiting", "researcher", "security", "software", "support", "systems", "tax", "teacher", "therapy", "video", "web", "web_design", "wellness", "writing"]).optional(), job_title_levels: z.enum(["unpaid", "training", "entry", "manager", "senior", "partner", "director", "vp", "owner", "cxo"]).optional()}).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 }; /** * /ip/enrich * * GET /v5/ip/enrich */ export const getApiV5IpEnrich = async (args: GetApiV5IpEnrichArgs, options?: GetApiV5IpEnrichOptions) => { const {baseUrl = "https://api.peopledatalabs.com", fetch: fetchFn = fetch, APIKeyHeader} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['Content-Type'] != null) headers.set("Content-Type", String(args['Content-Type'])) if (args.ip != null) query.append("ip", String(args.ip)) if (args.return_ip_location != null) query.append("return_ip_location", String(args.return_ip_location)) if (args.return_ip_metadata != null) query.append("return_ip_metadata", String(args.return_ip_metadata)) if (args.return_person != null) query.append("return_person", String(args.return_person)) if (args.return_if_unmatched != null) query.append("return_if_unmatched", String(args.return_if_unmatched)) if (args.titlecase != null) query.append("titlecase", String(args.titlecase)) if (args.pretty != null) query.append("pretty", String(args.pretty)) if (APIKeyHeader !== undefined) headers.set("X-API-Key", APIKeyHeader) const url = `${baseUrl.replace(/\/+$/, '')}/v5/ip/enrich${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(iP, await res.json()) };