import {z} from 'zod' export type GetApiV2ApplicantsLatestApplicantArgs = {email?: string | undefined, phone_number?: string | undefined, brand_id?: string | undefined}; export type GetApiV2ApplicantsLatestApplicantOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const customerAttribute = z.object({value: z.string(), type: z.string(), key: z.string().nullable().optional()}); export const openingPayRate = z.object({compensation: z.string().nullable().optional(), compensation_currency_code: z.string().optional(), compensation_type: z.enum(["hour", "day", "month", "year"]).optional(), compensation_min: z.string().nullable().optional()}); export const applicant = z.object({email: z.string(), name: z.string(), key: z.string().optional(), metadata: z.object({temporary: z.boolean().optional()}).optional(), first_name: z.string(), last_name: z.string(), phone_number: z.string(), normalized_phone_number: z.string(), phone_number_country_code: z.string(), data: z.object({}), created_at: z.string(), updated_at: z.string().nullable(), receive_automated_emails: z.boolean(), number_opted_out: z.boolean().optional(), referral_id: z.string().nullable().optional(), wx_external_id: z.string().nullable().optional(), kombo_applicant_id: z.string().nullable().optional(), kombo_candidate_id: z.string().nullable().optional(), created_from_ip: z.string().nullable().optional(), application_locale: z.string().nullable().optional(), geo_coded_location: z.object({latitude: z.number().gte(-90).lte(90).optional(), longitude: z.number().gte(-180).lte(180).optional()}).nullable().optional(), labels: z.array(z.object({title: z.string(), completed: z.boolean(), completed_at: z.string()})), is_duplicate: z.boolean(), gdpr_anonymized: z.boolean().optional(), gdpr_anonymized_at: z.string().nullable().optional(), duplicate_id: z.string().nullable().optional(), file_upload_requests: z.array(z.object({id: z.number(), recollection_reason: z.enum(["blurry", "corrupt", "incorrect", "expired", "custom"]), created_at: z.string(), document_name: z.string()})), portal_url: z.string().optional(), secure_data: z.object({disability: z.string().nullable().optional(), ethnicity: z.string().nullable().optional(), gender: z.string().nullable().optional(), sexual_orientation: z.string().nullable().optional(), transgender_identity: z.string().nullable().optional(), veteran_us: z.string().nullable().optional(), citizenship: z.string().nullable().optional(), can_work_in_us: z.boolean().nullable().optional(), ssn: z.string().nullable().optional(), national_identification_number: z.string().nullable().optional(), tax_id: z.string().nullable().optional(), income_salary: z.string().nullable().optional(), income_income_tax_dollar_amount: z.string().nullable().optional(), income_ss_tax: z.string().nullable().optional(), income_medicare_tax: z.string().nullable().optional(), income_taxpayer_identification_number: z.string().nullable().optional(), bank_name: z.string().nullable().optional(), bank_routing_number: z.string().nullable().optional(), bank_account_number: z.string().nullable().optional(), iban: z.string().nullable().optional(), bic: z.string().nullable().optional(), vehicle_make: z.string().nullable().optional(), vehicle_model: z.string().nullable().optional(), vehicle_year: z.number().nullable().optional(), vehicle_registration_plate_number: z.string().nullable().optional(), vehicle_vin_number: z.string().nullable().optional(), driver_license_number: z.string().nullable().optional(), driver_license_expiration_date: z.string().nullable().optional(), driver_license_state: z.string().nullable().optional(), insurance_type: z.string().nullable().optional(), insurance_benefactor_first_name: z.string().nullable().optional(), insurance_benefactor_middle_name: z.string().nullable().optional(), insurance_benefactor_last_name: z.string().nullable().optional(), insurance_member_id: z.string().nullable().optional(), insurance_company_group_id: z.string().nullable().optional(), insurance_company_of_issue: z.string().nullable().optional(), insurance_country_of_issue: z.string().nullable().optional(), insurance_city_of_issue: z.string().nullable().optional(), insurance_issue_date: z.string().nullable().optional(), insurance_expiration_date: z.string().nullable().optional(), passport_number: z.string().nullable().optional(), passport_country_of_issue: z.string().nullable().optional(), passport_city_of_issue: z.string().nullable().optional(), passport_issue_date: z.string().nullable().optional(), passport_expiration_date: z.string().nullable().optional()}), lessonly: z.object({lesson_results: z.array(z.object({lesson_url: z.string(), score_percent: z.number(), report_card_url: z.string(), completed_at: z.string(), lesson_name: z.string()})), path_results: z.array(z.object({path_url: z.string(), goal: z.number(), progress: z.number(), path_name: z.string()}))}).optional(), video_urls: z.array(z.string()).optional(), video_url_objects: z.array(z.object({url: z.string().optional(), question_id: z.number().int().nullable().optional(), label: z.string().nullable().optional()})).optional(), assigned_user: z.object({id: z.string().optional(), email: z.string().optional(), name: z.string().optional()}).optional(), i9: z.object({last_name: z.string().optional(), first_name: z.string().optional(), middle_initial: z.string().optional(), other_last_names: z.string().optional(), address: z.string().optional(), apartment_number: z.string().optional(), city: z.string().optional(), state: z.string().optional(), zipcode: z.number().optional(), date_of_birth: z.string().optional(), ssn: z.string().optional(), email: z.string().optional(), telephone: z.string().optional(), citizenship_status: z.string().optional(), signature_date: z.string().optional(), preparer_used: z.enum(["A preparer(s) and/or translator(s) assisted the employee in completing Section 1", "I did not use a preparer or translator"]).optional(), employer_signature_date: z.string().optional(), preparer_signature_date: z.string().optional(), preparer_last_name: z.string().nullable().optional(), preparer_first_name: z.string().nullable().optional(), preparer_address: z.string().nullable().optional(), preparer_city: z.string().nullable().optional(), preparer_state: z.string().nullable().optional(), preparer_zipcode: z.string().nullable().optional()}).optional(), i9_status: z.object({status: z.enum(["awaiting_employee", "awaiting_employer", "pending", "complete", "opted_out", "awaiting_authorized_representative"]).optional(), last_form_update: z.string().optional(), landed_at: z.string().optional()}), i9_pdf: z.string().nullable().optional(), everify: z.object({case_number: z.string(), case_status: z.enum(["CLOSE_CASE_AND_RESUBMIT", "CLOSED", "DRAFT", "EMPLOYMENT_AUTHORIZED", "FINAL_NONCONFIRMATION", "MANUAL_REVIEW", "PENDING_REFERRAL", "PHOTO_MATCH", "QUEUED", "REFERRED", "SCAN_AND_UPLOAD", "UNCONFIRMED_DATA"]), case_eligibility_statement: z.enum(["EMPLOYMENT_AUTHORIZED", "NO_ACTION_FNC", "NO_SHOW", "NOT_AUTHORIZED_EMPLOYMENT", "RESUBMIT_CASE"]).nullable(), created_at: z.string(), updated_at: z.string()}).optional(), addresses: z.array(z.object({street_name: z.string(), address_2: z.string(), city: z.string(), county: z.string().nullable().optional(), state: z.string(), zipcode: z.string(), country: z.string(), latitude: z.number(), longitude: z.number()})), id: z.string(), last_transitioned_at: z.string().nullable(), timezone: z.string().nullable().optional(), background_checks: z.array(z.union([z.object({status: z.enum(["clear", "consider", "negative", "non_negative", "complete", "pending", "suspended", "dispute", "canceled"]), title: z.string(), updated_at: z.string(), candidate_id: z.string(), report_id: z.string(), vendor: z.literal("checkr")}), z.object({title: z.string(), applicant_id: z.string(), updated_at: z.string(), status: z.enum(["no bgc", "pending", "consented", "not consented", "clear", "consider", "withdrawn", "paused", "reopened"]), check_id: z.string(), vendor: z.literal("onfido")})])), document_signatures: z.array(z.object({signature_id: z.string().optional(), status: z.enum(["unopened", "opened", "signed", "admin_reviewed"]).optional(), vendor: z.enum(["hellosign", "docusign"]).optional(), file_url: z.string().nullable().optional()})), document_uploads: z.array(z.object({filename: z.string().optional(), url: z.string().optional(), data_key: z.string().optional()})).optional(), partner_data: z.array(z.record(z.string(), z.array(z.unknown()))), partner_option_data: z.array(z.object({})), can_receive_sms: z.boolean(), consent_sms_transactional: z.boolean().optional(), consent_sms_marketing: z.boolean().optional(), consent_calls_transactional: z.boolean().optional(), consent_calls_marketing: z.boolean().optional(), consent_sms_transactional_at: z.string().nullable().optional(), consent_sms_marketing_at: z.string().nullable().optional(), consent_calls_transactional_at: z.string().nullable().optional(), consent_calls_marketing_at: z.string().nullable().optional(), phone_platform: z.enum(["sms", "whats_app"]), work_availability: z.enum(["sunday_morning", "sunday_afternoon", "sunday_evening", "monday_morning", "monday_afternoon", "monday_evening", "tuesday_morning", "tuesday_afternoon", "tuesday_evening", "wednesday_morning", "wednesday_afternoon", "wednesday_evening", "thursday_morning", "thursday_afternoon", "thursday_evening", "friday_morning", "friday_afternoon", "friday_evening", "saturday_morning", "saturday_afternoon", "saturday_evening"]).optional(), date_of_birth: z.string().optional(), team_or_solo: z.enum(["team", "solo"]).optional(), ssn: z.string().nullable().optional(), funnel: z.object({title: z.string(), custom_id: z.string(), hris_id: z.string().nullable().optional(), id: z.string(), opening_owner: z.string().nullable().optional(), opening_owner_email: z.string().nullable().optional(), customer_attributes: z.array(customerAttribute).nullable().optional(), location: z.object({name: z.string(), id: z.string(), latitude: z.number(), longitude: z.number(), address: z.string().nullable().optional(), address_detail: z.object({city: z.string().nullable().optional(), state_code: z.string().nullable().optional(), postal_code: z.string().nullable().optional(), street_address: z.string().nullable().optional()}).optional(), brand_id: z.string().nullable().optional(), customer_attributes: z.array(customerAttribute).nullable().optional(), location_group: z.object({name: z.string(), id: z.string()})}).optional(), position: z.object({name: z.string(), id: z.string(), customer_attributes: z.array(customerAttribute).nullable().optional()}).optional(), opening_pay_rate: openingPayRate.optional()}), stage: z.object({title: z.string(), id: z.string(), parent_id: z.string().nullable(), type: z.string(), portal_title: z.string().nullable().optional(), is_hiring_stage: z.boolean()}).nullable(), w4_federal_form: z.object({form_url: z.string(), status: z.enum(["awaiting_employee", "awaiting_employer", "pending", "complete", "opted_out", "awaiting_authorized_representative"]), external_id: z.string(), show_applicant_redo_buttons: z.boolean(), applicant_external_id: z.string(), contents: z.object({first_name: z.string(), last_name: z.string(), ssn: z.string()})}).optional(), w4_state_form: z.object({form_state: z.string(), form_url: z.string(), status: z.enum(["awaiting_employee", "awaiting_employer", "pending", "complete", "opted_out", "awaiting_authorized_representative"]), external_id: z.string(), show_applicant_redo_buttons: z.boolean(), applicant_external_id: z.string(), employer_enabled: z.boolean().nullable(), data: z.object({})}).optional(), score_cards_results: z.array(z.object({})).optional(), assessments: z.array(z.object({completed_at: z.string().optional(), file_url: z.string().nullable().optional(), id: z.string().optional(), score: z.number().int().optional(), status: z.string().optional(), system_type: z.string().optional(), title: z.string().optional()})).optional(), rejection_reason: z.string().optional(), disability: z.string().nullable().optional(), ethnicity: z.string().nullable().optional(), gender: z.string().nullable().optional(), sexual_orientation: z.string().nullable().optional(), transgender_identity: z.string().nullable().optional(), veteran_us: z.string().nullable().optional(), citizenship: z.string().nullable().optional(), can_work_in_us: z.boolean().nullable().optional(), national_identification_number: z.string().nullable().optional(), tax_id: z.string().nullable().optional(), income_salary: z.string().nullable().optional(), income_income_tax_dollar_amount: z.string().nullable().optional(), income_ss_tax: z.string().nullable().optional(), income_medicare_tax: z.string().nullable().optional(), income_taxpayer_identification_number: z.string().nullable().optional(), bank_name: z.string().nullable().optional(), bank_routing_number: z.string().nullable().optional(), bank_account_number: z.string().nullable().optional(), iban: z.string().nullable().optional(), bic: z.string().nullable().optional(), vehicle_make: z.string().nullable().optional(), vehicle_model: z.string().nullable().optional(), vehicle_year: z.number().nullable().optional(), vehicle_registration_plate_number: z.string().nullable().optional(), vehicle_vin_number: z.string().nullable().optional(), driver_license_number: z.string().nullable().optional(), driver_license_expiration_date: z.string().nullable().optional(), driver_license_state: z.string().nullable().optional(), insurance_type: z.string().nullable().optional(), insurance_benefactor_first_name: z.string().nullable().optional(), insurance_benefactor_middle_name: z.string().nullable().optional(), insurance_benefactor_last_name: z.string().nullable().optional(), insurance_member_id: z.string().nullable().optional(), insurance_company_group_id: z.string().nullable().optional(), insurance_company_of_issue: z.string().nullable().optional(), insurance_country_of_issue: z.string().nullable().optional(), insurance_city_of_issue: z.string().nullable().optional(), insurance_issue_date: z.string().nullable().optional(), insurance_expiration_date: z.string().nullable().optional(), passport_number: z.string().nullable().optional(), passport_country_of_issue: z.string().nullable().optional(), passport_city_of_issue: z.string().nullable().optional(), passport_issue_date: z.string().nullable().optional(), passport_expiration_date: z.string().nullable().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 }; /** * Get Latest Applicant * * GET /v2/applicants/latest_applicant */ export const getApiV2ApplicantsLatestApplicant = async (args: GetApiV2ApplicantsLatestApplicantArgs, options?: GetApiV2ApplicantsLatestApplicantOptions) => { const {baseUrl = "https://api.fountain.com", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.email != null) query.append("email", String(args.email)) if (args.phone_number != null) query.append("phone_number", String(args.phone_number)) if (args.brand_id != null) query.append("brand_id", String(args.brand_id)) if (ApiKeyAuth !== undefined) headers.set("X-ACCESS-TOKEN", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/v2/applicants/latest_applicant${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(applicant, await res.json()) };