import {z} from 'zod' export type GetApiThreatmonitoringThreatArgs = {uuid: string}; export type GetApiThreatmonitoringThreatOptions = {baseUrl?: string | undefined, APIKeyInHeader?: string | undefined, fetch?: typeof fetch | undefined}; export const appStoreExternalAPIThreatAdditionalAttributes = z.object({advisories: z.array(z.string()).optional(), apple_id: z.string().optional(), categories: z.array(z.string()).optional(), description: z.string().optional(), developer: z.string().optional(), downloads: z.string().optional(), icon_url: z.string().optional(), image_urls: z.array(z.string()).optional(), listing_url: z.string().optional(), product_id: z.string().optional(), rating: z.number().optional(), rating_count: z.number().int().optional(), release_date: z.string().optional(), store_name: z.string().optional(), title: z.string().optional(), updated_date: z.string().optional()}); export const externalAPIThreadEntry = z.object({date: z.string().optional(), text: z.string().optional(), user: z.string().optional()}); export const discordExternalAPIAddAttributes = z.object({author: z.string().optional(), channel: z.string().optional(), language: z.string().optional(), parsed_thread: z.array(externalAPIThreadEntry).optional(), participants: z.array(z.string()).optional(), server: z.string().optional()}); export const telegramExternalAPIAddAttributes = z.object({author: z.string().optional(), language: z.string().optional(), name: z.string().optional(), parsed_thread: z.array(externalAPIThreadEntry).optional(), participants: z.array(z.string()).optional()}); export const chatExternalAPIThreatAdditionalAttributes = z.object({discord: discordExternalAPIAddAttributes.optional(), telegram_channel: telegramExternalAPIAddAttributes.optional(), telegram_group: telegramExternalAPIAddAttributes.optional()}); export const cookieExternalAPIThreatAdditionalAttributes = z.object({asn: z.number().int().optional(), asn_text: z.string().optional(), cookie_name: z.string().optional(), cookie_value: z.string().optional(), device_account: z.string().optional(), device_location: z.string().optional(), device_name: z.string().optional(), device_os: z.string().optional(), device_serial_number: z.string().optional(), device_user_agent: z.string().optional(), ip: z.string().optional(), malware_path: z.string().optional(), malware_ref_url: z.string().optional(), malware_type: z.string().optional(), malware_version: z.string().optional(), reverse_dns: z.string().optional(), url: z.string().optional()}); export const dataLeakTag = z.string(); export const maskedValue = z.object({len: z.number().int().optional(), suffix: z.string().optional()}); export const dataLeakExternalAPIThreatAdditionalAttributes = z.object({has_password: z.boolean().optional(), leak_discover_date: z.string().optional(), leak_name: z.string().optional(), leak_publish_date: z.string().optional(), leak_size: z.number().int().optional(), leak_tags: z.array(dataLeakTag).optional(), login: z.string().optional(), masked_password: maskedValue.optional(), website: z.string().optional()}); export const exposedServiceAttributionIdentifierExternalAPI = z.object({data_type: z.string().optional(), data_value: z.string().optional()}); export const exposedServiceIdentifierExternalAPIThreatAdditionalAttributes = z.object({host: z.string().optional(), matched_identifier: exposedServiceAttributionIdentifierExternalAPI.optional(), other_attribution_identifiers: z.array(exposedServiceAttributionIdentifierExternalAPI).optional(), port: z.number().int().optional(), service_type: z.string().optional()}); export const exposedServiceKeywordExternalAPIThreatAdditionalAttributes = z.object({attribution_identifiers: z.array(exposedServiceAttributionIdentifierExternalAPI).optional(), host: z.string().optional(), port: z.number().int().optional(), record_name: z.string().optional(), service_type: z.string().optional()}); export const facebookPostExternalAPIThreatAdditionalAttributes = z.object({attached_image_content: z.string().optional(), attached_link: z.string().optional(), attached_link_description: z.string().optional(), attached_post_id: z.string().optional(), comments_count: z.number().int().optional(), created_time: z.string().optional(), fact_checks: z.array(z.string()).optional(), group_id: z.string().optional(), language: z.string().optional(), overlay_warning: z.string().optional(), owner_full_name: z.string().optional(), owner_id: z.string().optional(), owner_user_name: z.string().optional(), post_id: z.string().optional(), post_type: z.string().optional(), reactions_angry_count: z.number().int().optional(), reactions_haha_count: z.number().int().optional(), reactions_like_count: z.number().int().optional(), reactions_love_count: z.number().int().optional(), reactions_sad_count: z.number().int().optional(), reactions_support_count: z.number().int().optional(), reactions_total_count: z.number().int().optional(), reactions_wow_count: z.number().int().optional(), shares_count: z.number().int().optional(), text: z.string().optional(), text_lang: z.string().optional(), text_tagged_users: z.array(z.string()).optional(), text_tags: z.array(z.string()).optional(), timestamp: z.string().optional()}); export const facebookProfileExternalAPIThreatAdditionalAttributes = z.object({address: z.string().optional(), biography: z.string().optional(), categories: z.array(z.string()).optional(), created_time: z.string().optional(), current_city: z.array(z.string()).optional(), education: z.array(z.string()).optional(), email: z.string().optional(), external_url: z.string().optional(), followers_count: z.number().int().optional(), following_count: z.number().int().optional(), friends_count: z.number().int().optional(), gender: z.string().optional(), hometown: z.array(z.string()).optional(), is_owned: z.boolean().optional(), is_verified: z.boolean().optional(), langs: z.array(z.string()).optional(), last_post_created_time: z.string().optional(), likes_count: z.number().int().optional(), members_count: z.number().int().optional(), phone: z.string().optional(), profile_id: z.string().optional(), profile_name: z.string().optional(), profile_type: z.string().optional(), social_media_urls: z.array(z.string()).optional(), username: z.string().optional(), workplace: z.array(z.string()).optional()}); export const githubExternalAPIThreatAdditionalAttributes = z.object({branch: z.string().optional(), commit: z.string().optional(), committer_email: z.string().optional(), owner: z.string().optional(), repository: z.string().optional(), tag: z.string().optional(), target_file: z.string().optional()}); export const instagramPostExternalAPIThreatAdditionalAttributes = z.object({clickable_urls: z.array(z.string()).optional(), coauthor_producers: z.array(z.string()).optional(), comments_count: z.number().int().optional(), created_time: z.string().optional(), is_comments_disabled: z.boolean().optional(), is_video: z.boolean().optional(), like_and_view_counts_disabled: z.boolean().optional(), likes_count: z.number().int().optional(), owner_id: z.string().optional(), owner_username: z.string().optional(), post_id: z.string().optional(), product_type: z.string().optional(), related_posts: z.array(z.string()).optional(), shortcode: z.string().optional(), sponsors: z.array(z.string()).optional(), text: z.string().optional(), text_lang: z.string().optional(), text_tagged_users: z.array(z.string()).optional(), text_tags: z.array(z.string()).optional(), timestamp: z.string().optional(), video_plays_count: z.number().int().optional(), video_views_count: z.number().int().optional()}); export const instagramProfileExternalAPIThreatAdditionalAttributes = z.object({age_group: z.string().optional(), biography: z.string().optional(), business_category: z.array(z.string()).optional(), external_url: z.string().optional(), followers_count: z.number().int().optional(), followings_count: z.number().int().optional(), full_name: z.string().optional(), gender: z.string().optional(), highlight_reels_count: z.number().int().optional(), is_business_account: z.boolean().optional(), is_joined_recently: z.boolean().optional(), is_private: z.boolean().optional(), is_verified: z.boolean().optional(), langs: z.array(z.string()).optional(), last_update: z.string().optional(), latest_location_id: z.string().optional(), posts_count: z.number().int().optional(), profile_id: z.string().optional(), public_email: z.string().optional(), public_phone_country_code: z.string().optional(), public_phone_number: z.string().optional(), username: z.string().optional()}); export const linkedInCompanyProfileHeadquartersExternal = z.object({city: z.string().optional(), country: z.string().optional(), line1: z.string().optional(), postal_code: z.string().optional(), state: z.string().optional()}); export const linkedInCompanyProfileExternalAPIThreatAdditionalAttributes = z.object({company_size: z.string().optional(), company_size_on_linkedin: z.number().int().optional(), company_type: z.string().optional(), description: z.string().optional(), follower_count: z.number().int().optional(), founded_year: z.number().int().optional(), headquarters: linkedInCompanyProfileHeadquartersExternal.optional(), industry: z.string().optional(), last_fetched_at: z.string().optional(), linkedin_internal_id: z.string().optional(), linkedin_profile_url: z.string().optional(), name: z.string().optional(), search_id: z.string().optional(), tagline: z.string().optional(), universal_name_id: z.string().optional(), website: z.string().optional()}); export const linkedInUserProfileExternalAPIThreatAdditionalAttributes = z.object({city: z.string().optional(), connections_count: z.number().int().optional(), country: z.string().optional(), country_full_name: z.string().optional(), facebook_profile_id: z.string().optional(), first_name: z.string().optional(), follower_count: z.number().int().optional(), full_name: z.string().optional(), github_profile_id: z.string().optional(), headline: z.string().optional(), last_fetched_at: z.string().optional(), last_name: z.string().optional(), linkedin_profile_url: z.string().optional(), location_str: z.string().optional(), occupation: z.string().optional(), personal_emails: z.array(z.string()).optional(), personal_phone_numbers: z.array(z.string()).optional(), public_identifier: z.string().optional(), state: z.string().optional(), summary: z.string().optional(), twitter_profile_id: z.string().optional(), website: z.string().optional()}); export const mCPRegistryExternalAPIThreatAdditionalAttributes = z.object({packages: z.array(z.string()).optional(), published_at: z.string().optional(), repository_url: z.string().optional(), server_name: z.string().optional(), version: z.string().optional(), website_url: z.string().optional()}); export const openWebExternalAPIThreatAdditionalAttributes = z.object({resource_content_length: z.number().int().optional(), resource_content_type: z.string().optional(), resource_title: z.string().optional()}); export const passwordExternalAPIThreatAdditionalAttributes = z.object({asn: z.number().int().optional(), asn_text: z.string().optional(), device_account: z.string().optional(), device_location: z.string().optional(), device_name: z.string().optional(), device_os: z.string().optional(), device_serial_number: z.string().optional(), device_user_agent: z.string().optional(), ip: z.string().optional(), malware_path: z.string().optional(), malware_ref_url: z.string().optional(), malware_type: z.string().optional(), malware_version: z.string().optional(), password: z.string().optional(), reverse_dns: z.string().optional(), url: z.string().optional(), username: z.string().optional()}); export const postExternalAPIThreatAdditionalAttributes = z.object({author: z.string().optional(), language: z.string().optional(), network_type: z.string().optional(), post_replies: z.number().int().optional(), post_title: z.string().optional(), site_name: z.string().optional(), thread_participants: z.number().int().optional(), type: z.string().optional()}); export const redditPostExternalAPIThreatAdditionalAttributes = z.object({author_id: z.string().optional(), author_is_blocked: z.boolean().optional(), author_username: z.string().optional(), comments_count: z.number().int().optional(), created_time: z.string().optional(), is_gallery: z.boolean().optional(), is_original_content: z.boolean().optional(), is_video: z.boolean().optional(), post_id: z.string().optional(), post_url: z.string().optional(), score: z.number().int().optional(), subreddit: z.string().optional(), subreddit_id: z.string().optional(), subreddit_subscribers: z.number().int().optional(), subreddit_type: z.string().optional(), text: z.string().optional(), timestamp: z.string().optional(), title: z.string().optional(), total_awards_received: z.number().int().optional(), upvote_ratio: z.number().optional(), whitelist_status: z.number().int().optional()}); export const genericStealerLogExternalAPIThreatAdditionalAttributes = z.object({name: z.string().optional(), url: z.string().optional(), value: z.string().optional()}); export const stealerLogsExternalAPIThreatAdditionalAttributes = z.object({asn: z.number().int().optional(), asn_text: z.string().optional(), autocompletes: z.array(genericStealerLogExternalAPIThreatAdditionalAttributes).optional(), cookies: z.array(cookieExternalAPIThreatAdditionalAttributes).optional(), device_account: z.string().optional(), device_location: z.string().optional(), device_name: z.string().optional(), device_os: z.string().optional(), device_serial_number: z.string().optional(), device_user_agent: z.string().optional(), histories: z.array(genericStealerLogExternalAPIThreatAdditionalAttributes).optional(), ip: z.string().optional(), malware_path: z.string().optional(), malware_ref_url: z.string().optional(), malware_type: z.string().optional(), malware_version: z.string().optional(), passwords: z.array(passwordExternalAPIThreatAdditionalAttributes).optional(), reverse_dns: z.string().optional()}); export const tiktokProfileExternalAPIThreatAdditionalAttributes = z.object({biography_link: z.string().optional(), created_time: z.string().optional(), digg_count: z.number().int().optional(), follower_count: z.number().int().optional(), following_count: z.number().int().optional(), friend_count: z.number().int().optional(), full_name: z.string().optional(), full_name_modify_time: z.string().optional(), heart_count: z.number().int().optional(), is_private: z.boolean().optional(), is_verified: z.boolean().optional(), langs: z.array(z.string()).optional(), profile_id: z.string().optional(), region: z.string().optional(), signature: z.string().optional(), username: z.string().optional(), username_modify_time: z.string().optional(), video_count: z.number().int().optional()}); export const twitterPostExternalAPIThreatAdditionalAttributes = z.object({author_id: z.string().optional(), author_username: z.string().optional(), favorite_count: z.number().int().optional(), in_reply_to_post_id: z.string().optional(), in_reply_to_profile_id: z.string().optional(), in_reply_to_profile_username: z.string().optional(), post_id: z.string().optional(), post_type: z.string().optional(), quote_count: z.number().int().optional(), reply_count: z.number().int().optional(), retweet_count: z.number().int().optional(), text: z.string().optional(), text_lang: z.string().optional(), text_tagged_users: z.array(z.string()).optional(), text_tags: z.array(z.string()).optional(), timestamp: z.number().int().optional(), view_count: z.number().int().optional()}); export const twitterProfileExternalAPIThreatAdditionalAttributes = z.object({created_time: z.string().optional(), description: z.string().optional(), external_url: z.string().optional(), favorites_count: z.number().int().optional(), followers_count: z.number().int().optional(), friends_count: z.number().int().optional(), full_name: z.string().optional(), is_verified: z.boolean().optional(), listed_count: z.number().int().optional(), location: z.string().optional(), media_count: z.number().int().optional(), profile_id: z.string().optional(), statuses_count: z.number().int().optional(), username: z.string().optional()}); export const externalAPIThreatAdditionalAttributes = z.object({app_store: appStoreExternalAPIThreatAdditionalAttributes.optional(), chat: chatExternalAPIThreatAdditionalAttributes.optional(), cookie: cookieExternalAPIThreatAdditionalAttributes.optional(), data_dump: dataLeakExternalAPIThreatAdditionalAttributes.optional(), exposed_service_identifier: exposedServiceIdentifierExternalAPIThreatAdditionalAttributes.optional(), exposed_service_keyword: exposedServiceKeywordExternalAPIThreatAdditionalAttributes.optional(), facebook_post: facebookPostExternalAPIThreatAdditionalAttributes.optional(), facebook_profile: facebookProfileExternalAPIThreatAdditionalAttributes.optional(), github: githubExternalAPIThreatAdditionalAttributes.optional(), instagram_post: instagramPostExternalAPIThreatAdditionalAttributes.optional(), instagram_profile: instagramProfileExternalAPIThreatAdditionalAttributes.optional(), linkedin_company_profile: linkedInCompanyProfileExternalAPIThreatAdditionalAttributes.optional(), linkedin_user_profile: linkedInUserProfileExternalAPIThreatAdditionalAttributes.optional(), mcp_registry: mCPRegistryExternalAPIThreatAdditionalAttributes.optional(), open_web: openWebExternalAPIThreatAdditionalAttributes.optional(), password: passwordExternalAPIThreatAdditionalAttributes.optional(), post: postExternalAPIThreatAdditionalAttributes.optional(), reddit_post: redditPostExternalAPIThreatAdditionalAttributes.optional(), scribd: openWebExternalAPIThreatAdditionalAttributes.optional(), stealer_logs: stealerLogsExternalAPIThreatAdditionalAttributes.optional(), tiktok_profile: tiktokProfileExternalAPIThreatAdditionalAttributes.optional(), twitter_post: twitterPostExternalAPIThreatAdditionalAttributes.optional(), twitter_profile: twitterProfileExternalAPIThreatAdditionalAttributes.optional()}); export const threatMonitoringResultStatus = z.string(); export const threatActor = z.object({email: z.string().optional(), name: z.string().optional()}); export const threatComment: z.ZodType = z.object({children: z.array(z.lazy(() => threatComment)).optional(), comment_id: z.number().int().optional(), content: z.string().optional(), created_at: z.string().optional(), user: threatActor.optional()}); export const threatLabel = z.object({name: z.string().optional()}); export const monitoredThreatModule = z.string(); export const threatOutcome = z.string(); export const monitoredThreatSourceType = z.string(); export const monitoredThreatType = z.string(); export const threatMonitoringResultDetailed = z.object({additional_attributes: externalAPIThreatAdditionalAttributes.optional(), archived: z.boolean().optional(), auto_dismissed: z.boolean().optional(), closed: z.boolean().optional(), closed_status: threatMonitoringResultStatus.optional(), comments: z.array(threatComment).optional(), date_alerted: z.string().optional(), date_closed: z.string().optional(), date_detected: z.string().optional(), date_occurred: z.string().optional(), date_updated: z.string().optional(), dismissed_at: z.string().optional(), dismissed_by: threatActor.optional(), indicators_of_risk: z.string().optional(), investigating: z.boolean().optional(), investigator: threatActor.optional(), labels: z.array(threatLabel).optional(), module: monitoredThreatModule.optional(), number_of_comments: z.number().int().optional(), recommended_remediation: z.string().optional(), remediated_at: z.string().optional(), remediated_by: threatActor.optional(), remediation_outcome: threatOutcome.optional(), remediation_outcome_notes: z.string().optional(), remediation_request_last_updated_at: z.string().optional(), remediation_risk_details: z.string().optional(), remediation_risk_summary: z.string().optional(), severity: z.string().optional(), snippet: z.string().optional(), source: monitoredThreatSourceType.optional(), source_domain: z.string().optional(), source_site: z.string().optional(), threat_context: z.string().optional(), threat_status: z.string().optional(), threat_types: z.array(monitoredThreatType).optional(), title: z.string().optional(), transforms: z.array(z.string()).optional(), url: z.string().optional(), uuid: z.string().optional()}); export const getThreatDetailsResponsePayloadBody = z.object({threat_details: threatMonitoringResultDetailed.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 threat details * * GET /threatmonitoring/threat */ export const getApiThreatmonitoringThreat = async (args: GetApiThreatmonitoringThreatArgs, options?: GetApiThreatmonitoringThreatOptions) => { const {baseUrl = "https://cyber-risk.upguard.com/api/public", fetch: fetchFn = fetch, APIKeyInHeader} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.uuid != null) query.append("uuid", String(args.uuid)) if (APIKeyInHeader !== undefined) headers.set("Authorization", APIKeyInHeader) const url = `${baseUrl.replace(/\/+$/, '')}/threatmonitoring/threat${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(getThreatDetailsResponsePayloadBody, await res.json()) };