import {z} from 'zod' export type GetApiV1BusinessesOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const businessItemStatus = z.enum(["open", "pending", "in_audit", "in_review", "approved", "rejected"]); export const reviewObject = z.literal("review"); export const reviewTaskCategory = z.enum(["bankruptcies", "global_watchlists", "name", "people_litigations", "loans", "kyc", "watchlist", "phone", "formation", "people_criminal_history", "adverse_media", "litigations", "tin_type", "address", "sos", "web", "liens", "people_bankruptcies", "industry", "tin", "people", "people_liens", "website", "politically_exposed_persons", "email"]); export const reviewTaskKey = z.enum(["location_frequency", "bankruptcies", "sos_unknown", "address_deliverability", "website_url_discovery", "entity_type", "web_person_verification", "global_watchlists", "website_status", "name", "sos_sub_status", "name_and_entity_type", "sos_active", "profile_status", "phone", "sos_domestic", "address_high_risk", "web_address_verification", "address_property_type", "sos_not_found", "time_in_business", "web_phone_number_verification", "adverse_media", "litigations", "address_verification", "people_litigations", "dba_name", "watchlist", "entity_type_match", "people_criminal_history", "formation_state", "tin_error", "sos_inactive", "address_frequency", "web_business_name_verification", "web_presence_quality", "tin_type", "tin_issued", "sos_domestic_sub_status", "risky_keywords", "address_registered_agent", "sos", "kyc_decision", "ppp_loans", "web_email_address_verification", "tin", "address", "liens", "sos_status", "industry", "sos_match", "address_risk", "website_url_domain_ownership", "website_parked", "domain_redirect", "people_bankruptcies", "politically_exposed_persons", "person_verification", "person_npi_match", "profile_discovery", "address_cmra", "website_verification", "website", "people_liens", "email_risk"]); export const reviewTaskLabel = z.enum(["Politically Exposed Persons", "Web Presence Quality", "KYC", "People Bankruptcies", "Address Risk", "Global Watchlists", "Phone Number", "Third Party Profile Status", "Liens", "Third Party Profiles", "Time in Business", "Web - Email Address", "Risky Keywords", "SOS Domestic Sub‑status", "PPP Loans", "Secretary of State Filings", "Entity Type", "SOS Filings", "People Criminal History", "Adverse Media", "Web - People", "Office Address", "Entity Type Match", "Web - Phone Number", "Business Name", "Bankruptcies", "Industry Classification", "TIN Match", "Watchlists", "People Litigations", "True Industry", "People", "People NPI Match", "DBA Name", "Domain Ownership", "Domain Redirect", "TIN Type", "Website", "TIN Error", "Watchlist", "Litigations", "Web - Business Name", "Name Entity Type", "Formation State", "People Liens", "Web - Office Address", "Email Risk"]); export const reviewTaskStatus = z.enum(["success", "failure", "warning", "neutral"]); export const source = z.object({id: z.string(), type: z.string(), metadata: z.record(z.string(), z.unknown())}); export const reviewTask = z.object({category: reviewTaskCategory, key: reviewTaskKey, label: reviewTaskLabel, message: z.string(), name: z.string(), status: reviewTaskStatus, sub_label: z.string(), sources: z.array(source)}); export const user = z.object({object: z.string(), id: z.string(), name: z.string(), email: z.string(), roles: z.array(z.string()), image_url: z.string().optional(), directory_managed: z.boolean().optional(), last_login_at: z.string().nullable().optional(), settings: z.record(z.string(), z.unknown()).optional(), created_at: z.string()}); export const review = z.object({object: reviewObject, id: z.string(), created_at: z.string(), updated_at: z.string(), completed_at: z.string().nullable().optional(), analyst_read_markdown: z.string().nullable().optional(), analyst_read_generated_at: z.string().nullable().optional(), tasks: z.array(reviewTask), assignee: user.nullable().optional()}); export const businessItemWebsite = z.object({object: z.string().optional(), id: z.string().optional(), url: z.string().optional(), title: z.string().nullable().optional(), description: z.string().nullable().optional()}); export const orderStatus = z.enum(["created", "pending", "audited", "completed", "approved", "rejected"]); export const orderSubproductsItem = z.enum(["Articles of Incorporation", "Certificate of Good Standing", "Articles of Incorporation with Certificate of Good Standing fallback", "ucc_documents", "web_analysis", "industry_classification"]); export const orderProduct = z.enum(["identity", "liens", "adverse_media", "bankruptcies", "business_enrichment", "documents", "enhanced_screenings", "kyc", "litigations", "people_litigations", "people_bankruptcies", "people_tax_liens", "people_ucc_liens", "people_criminal_history", "tin", "website", "business_verification_qualify", "business_verification_verify", "international_business_verification", "tax_liens", "ucc_liens", "email_risk"]); export const orderRequesterType = z.enum(["account", "user", "api_key"]); export const orderRequester = z.object({name: z.string().nullable().optional(), type: orderRequesterType.nullable().optional()}); export const order = z.object({object: z.string(), id: z.string(), status: orderStatus, business_id: z.string(), subproducts: z.array(orderSubproductsItem).optional(), completed_at: z.string().nullable().optional(), monitoring: z.boolean().optional(), product: orderProduct, requester: orderRequester.optional(), created_at: z.string(), updated_at: z.string()}); export const businessItem = z.object({object: z.string(), id: z.string(), external_id: z.string().nullable().optional(), unique_external_id: z.string().nullable().optional(), name: z.string(), status: businessItemStatus, tags: z.array(z.string()).optional(), review: review.nullable().optional(), assignee: user.nullable().optional(), website: businessItemWebsite.nullable().optional(), orders: z.array(order).optional(), created_at: z.string(), updated_at: z.string()}); export const businessesListBusinessesResponse = z.object({data: z.array(businessItem), object: z.string(), has_more: z.boolean(), total_count: z.number().int().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 }; /** * List businesses * * GET /v1/businesses */ export const getApiV1Businesses = async (options?: GetApiV1BusinessesOptions) => { const {baseUrl = "https://api.middesk.com", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/businesses${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(businessesListBusinessesResponse, await res.json()) };