import {z} from 'zod' export type GetApiApiV2AccountSettingsOptions = {baseUrl?: string | undefined, apiTokenAuth?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const accountSettingsActiveFeaturesObject = z.object({agent_forwarding: z.boolean().optional(), allow_ccs: z.boolean().optional(), allow_email_template_customization: z.boolean().optional(), automatic_answers: z.boolean().optional(), bcc_archiving: z.boolean().optional(), benchmark_opt_out: z.boolean().optional(), business_hours: z.boolean().optional(), chat: z.boolean().optional(), chat_about_my_ticket: z.boolean().optional(), csat_reason_code: z.boolean().optional(), custom_dkim_domain: z.boolean().optional(), customer_context_as_default: z.boolean().optional(), customer_satisfaction: z.boolean().optional(), dynamic_contents: z.boolean().optional(), explore: z.boolean().optional(), explore_on_support_ent_plan: z.boolean().optional(), explore_on_support_pro_plan: z.boolean().optional(), facebook: z.boolean().optional(), facebook_login: z.boolean().optional(), fallback_composer: z.boolean().optional(), forum_analytics: z.boolean().optional(), good_data_and_explore: z.boolean().optional(), google_login: z.boolean().optional(), is_abusive: z.boolean().optional(), light_agents: z.boolean().optional(), markdown: z.boolean().optional(), on_hold_status: z.boolean().optional(), organization_access_enabled: z.boolean().optional(), rich_content_in_emails: z.boolean().optional(), sandbox: z.boolean().optional(), satisfaction_prediction: z.boolean().optional(), suspended_ticket_notification: z.boolean().optional(), ticket_forms: z.boolean().optional(), ticket_tagging: z.boolean().optional(), topic_suggestion: z.boolean().optional(), twitter: z.boolean().optional(), twitter_login: z.boolean().optional(), user_org_fields: z.boolean().optional(), user_tagging: z.boolean().optional(), voice: z.boolean().optional()}); export const accountSettingsAgentObject = z.object({agent_home: z.boolean().optional(), agent_workspace: z.boolean().optional(), aw_self_serve_migration_enabled: z.boolean().optional(), focus_mode: z.boolean().optional(), idle_timeout_enabled: z.boolean().optional(), unified_agent_statuses: z.boolean().optional()}); export const accountSettingsApiObject = z.object({accepted_api_agreement: z.boolean().optional(), api_password_access: z.string().optional(), api_token_access: z.string().optional()}); export const accountSettingsAppsObject = z.object({create_private: z.boolean().optional(), create_public: z.boolean().optional(), use: z.boolean().optional()}); export const accountSettingsBillingObject = z.object({backend: z.string().optional()}); export const accountSettingsBrandingObject = z.object({favicon_url: z.string().nullable().optional(), header_color: z.string().optional(), header_logo_url: z.string().nullable().optional(), page_background_color: z.string().optional(), tab_background_color: z.string().optional(), text_color: z.string().optional()}); export const accountSettingsBrandsObject = z.object({default_brand_id: z.number().int().optional(), require_brand_on_new_tickets: z.boolean().optional()}); export const accountSettingsCdnObject = z.object({cdn_provider: z.string().optional(), fallback_cdn_provider: z.string().optional(), hosts: z.array(z.object({name: z.string().optional(), url: z.string().optional()})).optional()}); export const accountSettingsChatObject = z.object({available: z.boolean().optional(), enabled: z.boolean().optional(), integrated: z.boolean().optional(), maximum_request_count: z.number().int().optional(), welcome_message: z.string().optional()}); export const accountSettingsCrossSellObject = z.object({show_chat_tooltip: z.boolean().optional(), xsell_source: z.string().nullable().optional()}); export const accountSettingsEmailObject = z.object({accept_wildcard_emails: z.boolean().optional(), custom_dkim_domain: z.boolean().optional(), email_sender_authentication: z.boolean().optional(), email_sender_authentication_profile: z.enum(["default", "enhanced"]).optional(), email_status: z.boolean().optional(), email_template_photos: z.boolean().optional(), email_template_section: z.boolean().optional(), gmail_actions: z.boolean().optional(), modern_email_template: z.boolean().optional(), no_mail_delimiter: z.boolean().optional(), personalized_replies: z.boolean().optional(), send_gmail_messages_via_gmail: z.boolean().optional()}); export const accountSettingsGoogleAppsObject = z.object({has_google_apps: z.boolean().optional(), has_google_apps_admin: z.boolean().optional()}); export const accountSettingsGroupObject = z.object({check_group_name_uniqueness: z.boolean().optional()}); export const accountSettingsLimitsObject = z.object({attachment_size: z.number().int().optional()}); export const accountSettingsLocalizationObject = z.object({locale_ids: z.array(z.number().int()).optional()}); export const accountSettingsLotusObject = z.object({pod_id: z.number().int().optional(), prefer_lotus: z.boolean().optional(), reporting: z.boolean().optional()}); export const accountSettingsMetricsObject = z.object({account_size: z.string().optional()}); export const accountSettingsOnboardingObject = z.object({checklist_onboarding_version: z.number().int().optional(), onboarding_segments: z.string().nullable().optional(), product_sign_up: z.string().nullable().optional()}); export const accountSettingsRoutingObject = z.object({autorouting_tag: z.string().optional(), enabled: z.boolean().optional(), max_email_capacity: z.number().int().optional(), max_messaging_capacity: z.number().int().optional(), reassignment_messaging_enabled: z.boolean().optional(), reassignment_messaging_timeout: z.number().int().optional(), reassignment_talk_timeout: z.number().int().optional()}); export const accountSettingsRuleObject = z.object({macro_most_used: z.boolean().optional(), macro_order: z.string().optional(), skill_based_filtered_views: z.array(z.record(z.string(), z.unknown())).optional(), using_skill_based_routing: z.boolean().optional()}); export const accountSettingsSideConversationsObject = z.object({email_channel: z.boolean().optional(), msteams_channel: z.boolean().optional(), show_in_context_panel: z.boolean().optional(), slack_channel: z.boolean().optional(), tickets_channel: z.boolean().optional()}); export const accountSettingsStatisticsObject = z.object({forum: z.boolean().optional(), rule_usage: z.boolean().optional(), search: z.boolean().optional()}); export const accountSettingsTicketFormObject = z.object({raw_ticket_forms_instructions: z.string().optional(), ticket_forms_instructions: z.string().optional()}); export const accountSettingsTicketObject = z.object({accepted_new_collaboration_tos: z.boolean().optional(), agent_collision: z.boolean().optional(), agent_invitation_enabled: z.boolean().optional(), agent_ticket_deletion: z.boolean().optional(), allow_group_reset: z.boolean().optional(), assign_default_organization: z.boolean().optional(), assign_tickets_upon_solve: z.boolean().optional(), auto_translation_enabled: z.boolean().optional(), auto_updated_ccs_followers_rules: z.boolean().optional(), chat_sla_enablement: z.boolean().optional(), collaboration: z.boolean().optional(), comments_public_by_default: z.boolean().optional(), default_solved_ticket_reassignment_strategy: z.string().optional(), email_attachments: z.boolean().optional(), emoji_autocompletion: z.boolean().optional(), follower_and_email_cc_collaborations: z.boolean().optional(), has_color_text: z.boolean().optional(), is_first_comment_private_enabled: z.boolean().optional(), light_agent_email_ccs_allowed: z.boolean().optional(), list_empty_views: z.boolean().optional(), list_newest_comments_first: z.boolean().optional(), markdown_ticket_comments: z.boolean().optional(), maximum_personal_views_to_list: z.number().int().optional(), modern_ticket_reassignment: z.boolean().optional(), private_attachments: z.boolean().optional(), rich_text_comments: z.boolean().optional(), show_modern_ticket_reassignment: z.boolean().optional(), status_hold: z.boolean().optional(), tagging: z.boolean().optional(), using_skill_based_routing: z.boolean().optional()}); export const accountSettingsTwitterObject = z.object({shorten_url: z.string().optional()}); export const accountSettingsUserObject = z.object({agent_created_welcome_emails: z.boolean().optional(), end_user_phone_number_validation: z.boolean().optional(), have_gravatars_enabled: z.boolean().optional(), language_selection: z.boolean().optional(), multiple_organizations: z.boolean().optional(), tagging: z.boolean().optional(), time_zone_selection: z.boolean().optional()}); export const accountSettingsVoiceObject = z.object({agent_confirmation_when_forwarding: z.boolean().optional(), agent_wrap_up_after_calls: z.boolean().optional(), enabled: z.boolean().optional(), logging: z.boolean().optional(), maximum_queue_size: z.number().int().optional(), maximum_queue_wait_time: z.number().int().optional(), only_during_business_hours: z.boolean().optional(), outbound_enabled: z.boolean().optional(), recordings_public: z.boolean().optional(), uk_mobile_forwarding: z.boolean().optional()}); export const accountSettingsObject = z.object({active_features: accountSettingsActiveFeaturesObject.optional(), agents: accountSettingsAgentObject.optional(), api: accountSettingsApiObject.optional(), apps: accountSettingsAppsObject.optional(), billing: accountSettingsBillingObject.optional(), branding: accountSettingsBrandingObject.optional(), brands: accountSettingsBrandsObject.optional(), cdn: accountSettingsCdnObject.optional(), chat: accountSettingsChatObject.optional(), cross_sell: accountSettingsCrossSellObject.optional(), email: accountSettingsEmailObject.optional(), google_apps: accountSettingsGoogleAppsObject.optional(), groups: accountSettingsGroupObject.optional(), limits: accountSettingsLimitsObject.optional(), localization: accountSettingsLocalizationObject.optional(), lotus: accountSettingsLotusObject.optional(), metrics: accountSettingsMetricsObject.optional(), onboarding: accountSettingsOnboardingObject.optional(), routing: accountSettingsRoutingObject.optional(), rule: accountSettingsRuleObject.optional(), side_conversations: accountSettingsSideConversationsObject.optional(), statistics: accountSettingsStatisticsObject.optional(), ticket_form: accountSettingsTicketFormObject.optional(), tickets: accountSettingsTicketObject.optional(), twitter: accountSettingsTwitterObject.optional(), user: accountSettingsUserObject.optional(), voice: accountSettingsVoiceObject.optional()}); export const accountSettingsResponse = z.object({settings: accountSettingsObject.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 }; /** * Show Settings * * GET /api/v2/account/settings */ export const getApiApiV2AccountSettings = async (options?: GetApiApiV2AccountSettingsOptions) => { const {baseUrl = "https://example.zendesk.com", fetch: fetchFn = fetch, apiTokenAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (apiTokenAuth !== undefined) headers.set('authorization', `Basic ${btoa(`${apiTokenAuth.username}:${apiTokenAuth.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v2/account/settings${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(accountSettingsResponse, await res.json()) };