import {z} from 'zod' export type CmsMediaBridgeIntegratorObjectCreationRequest = {mediaTypes: Array<'VIDEO' | 'AUDIO' | 'DOCUMENT' | 'OTHER' | 'IMAGE'>}; export type CreateApiMediaBridge202603AppIdSettingsObjectDefinitionsArgs = {appId: number, body: CmsMediaBridgeIntegratorObjectCreationRequest}; export type CreateApiMediaBridge202603AppIdSettingsObjectDefinitionsOptions = {baseUrl?: string | undefined, privateApps?: string | undefined, fetch?: typeof fetch | undefined}; export const cmsMediaBridgeScopeMapping = z.object({accessLevel: z.enum(["ALL", "OWNED", "TEAM_OWNED", "UNASSIGNED"]), requestAction: z.enum(["COMMUNICATE", "DELETE", "EDIT", "EDIT_ASSOCIATION", "MERGE", "VIEW"]), scopeName: z.string()}); export const cmsMediaBridgeInboundDbObjectType = z.object({accessScopeName: z.string().optional(), allowsSensitiveProperties: z.boolean(), createDatePropertyName: z.string(), createdAt: z.number().int().optional(), defaultSearchPropertyNames: z.array(z.string()), deleted: z.boolean(), description: z.string().optional(), fullyQualifiedName: z.string(), hasCustomProperties: z.boolean(), hasDefaultProperties: z.boolean(), hasExternalObjectIds: z.boolean(), hasOwners: z.boolean(), hasPipelines: z.boolean(), id: z.number().int(), indexedForFiltersAndReports: z.boolean(), integrationAppId: z.number().int().optional(), janusGroup: z.string().optional(), lastModifiedPropertyName: z.string(), metaType: z.enum(["CMS_HUBDB", "HUBSPOT", "HUBSPOT_EVENT", "INTEGRATION", "INTEGRATION_EVENT", "PORTAL_SPECIFIC", "PORTAL_SPECIFIC_EVENT", "WORK", "WORK_SUB"]), metaTypeId: z.number().int(), name: z.string(), objectTypeId: z.string(), objectTypeIdString: z.string(), ownerPortalId: z.number().int().optional(), permissioningType: z.enum(["ALL_OR_NONE", "DO_NOT_CHECK_PERMISSIONS", "EXPLICIT", "OWNER_BASED", "TEAM_BASED"]), pipelineCloseDatePropertyName: z.string().optional(), pipelinePropertyName: z.string(), pipelineStagePropertyName: z.string(), pipelineTimeToClosePropertyName: z.string().optional(), pluralForm: z.string().optional(), primaryDisplayLabelPropertyName: z.string().optional(), readScopeName: z.string().optional(), requiredProperties: z.array(z.string()), restorable: z.boolean(), scopeMappings: z.array(cmsMediaBridgeScopeMapping), secondaryDisplayLabelPropertyNames: z.array(z.string()), singularForm: z.string().optional(), status: z.enum(["Deprecated", "In development", "Live"]).optional(), visibility: z.enum(["Customer-facing", "Customer-facing public API", "Customer-facing UI", "Internal only"]).optional(), writeScopeName: z.string().optional(), visibility_values: z.array(z.enum(["Customer-facing", "Internal only", "Customer-facing UI", "Customer-facing public API"])).optional()}); export const cmsMediaBridgePropertyDefinitionSource = z.object({name: z.string().optional(), type: z.enum(["GLOBAL", "HAVEN_BRANCH", "OBJECT_TYPE", "PORTAL"])}); export const cmsMediaBridgeCaseChangeTestExtensionData = z.object({mood: z.enum(["ANGRY", "HAPPY", "SAD", "SARCASTIC"])}); export const cmsMediaBridgeOptionDecorations = z.object({color: z.enum(["BLACK", "BLUE", "BLUE_LIGHT", "GRAY", "GREEN", "GREEN_LIGHT", "ORANGE", "ORANGE_LIGHT", "PINK", "PINK_LIGHT", "PURPLE", "PURPLE_LIGHT", "RED", "RED_LIGHT", "TEAL", "TEAL_LIGHT", "YELLOW", "YELLOW_LIGHT"])}); export const cmsMediaBridgeOptionDecoratorsExtensionData = z.object({optionDecoratorStyle: z.enum(["LABEL_ONLY", "LABEL_WITH_BADGE", "LABEL_WITH_COLOR"]), optionDecorators: z.record(z.string(), cmsMediaBridgeOptionDecorations)}); export const cmsMediaBridgeRequiredPropertiesExtensionData = z.object({isRequiredProperty: z.boolean()}); export const cmsMediaBridgeSoftRequiredPropertiesExtensionData = z.object({isSoftRequiredProperty: z.boolean()}); export const cmsMediaBridgeExtensionData = z.object({caseChangeTestExtensionData: cmsMediaBridgeCaseChangeTestExtensionData.optional(), extensionStatusMap: z.record(z.string(), z.enum(["OK", "ERROR", "TIMEOUT"])), optionDecoratorsExtensionData: cmsMediaBridgeOptionDecoratorsExtensionData.optional(), requiredPropertiesExtensionData: cmsMediaBridgeRequiredPropertiesExtensionData.optional(), softRequiredPropertiesExtensionData: cmsMediaBridgeSoftRequiredPropertiesExtensionData.optional(), tags: z.array(z.string())}); export const cmsMediaBridgeFilteringMetaData = z.object({includeHelpdeskRoutableTeamsOnly: z.boolean(), includeUnconfirmedUsers: z.boolean(), listProcessingTypes: z.array(z.string()), pipelineIds: z.array(z.string())}); export const cmsMediaBridgeExternalOptionsMetaData = z.object({filter: cmsMediaBridgeFilteringMetaData.optional(), relatedObjectTypeId: z.string().optional()}); export const associationSpec = z.object({associationCategory: z.enum(["HUBSPOT_DEFINED", "INTEGRATOR_DEFINED", "USER_DEFINED", "WORK"]), associationTypeId: z.number().int()}); export const cmsMediaBridgeLookupAssociationSpec = z.object({associationSpec: associationSpec, cardinality: z.enum(["ONE_TO_MANY", "ONE_TO_ONE"]).optional(), maxToObjectIds: z.number().int().optional(), toObjectTypeId: z.string().optional()}); export const cmsMediaBridgeFieldLevelPermission = z.object({accessLevel: z.string()}); export const cmsMediaBridgeObjectTypeIdProto = z.object({innerId: z.number().int(), metaTypeId: z.number().int()}); export const automationActionsOption = z.object({description: z.string(), displayOrder: z.number().int(), doubleData: z.number(), hidden: z.boolean(), label: z.string(), readOnly: z.boolean(), value: z.string()}); export const cmsMediaBridgeProperty = z.object({allowedObjectTypes: z.array(cmsMediaBridgeObjectTypeIdProto), calculated: z.boolean(), canArchive: z.boolean(), canRestore: z.boolean(), createdAt: z.number().int(), createdUserId: z.number().int(), currencyPropertyName: z.string(), dataSensitivity: z.enum(["high", "none", "standard"]), dateDisplayHint: z.enum(["absolute", "absolute_with_relative", "time_since", "time_until"]), deleted: z.boolean(), description: z.string(), displayMode: z.enum(["all_unique_versions", "current_value"]), displayOrder: z.number().int(), enforceMultivalueUniqueness: z.boolean(), externalOptions: z.boolean(), externalOptionsReferenceType: z.string(), favorited: z.boolean(), favoritedOrder: z.number().int(), fieldType: z.string(), formField: z.boolean(), fromUserId: z.number().int(), groupName: z.string(), hasUniqueValue: z.boolean(), hidden: z.boolean(), hubspotDefined: z.boolean(), isCustomizedDefault: z.boolean(), isMultiValued: z.boolean(), isPartial: z.boolean(), label: z.string(), mutableDefinitionNotDeletable: z.boolean(), name: z.string(), numberDisplayHint: z.enum(["currency", "duration", "formatted", "percentage", "probability", "unformatted"]), optionSortStrategy: z.enum(["ALPHABETICAL", "DISPLAY_ORDER"]), options: z.array(automationActionsOption), optionsAreMutable: z.boolean(), owningAppId: z.number().int(), portalId: z.number().int(), readOnlyDefinition: z.boolean(), readOnlyValue: z.boolean(), referencedObjectType: z.enum(["ABANDONED_CART", "ACCEPTANCE_TEST", "AD", "AD_ACCOUNT", "AD_CAMPAIGN", "AD_GROUP", "AI_FORECAST", "ALL_PAGES", "APPROVAL", "APPROVAL_STEP", "ATTRIBUTION", "AUDIENCE", "AUTOMATION_JOURNEY", "AUTOMATION_PLATFORM_FLOW", "AUTOMATION_PLATFORM_FLOW_ACTION", "BET_ALERT", "BET_DELIVERABLE_SERVICE", "BLOG_LISTING_PAGE", "BLOG_POST", "CALL", "CAMPAIGN", "CAMPAIGN_BUDGET_ITEM", "CAMPAIGN_SPEND_ITEM", "CAMPAIGN_STEP", "CAMPAIGN_TEMPLATE", "CAMPAIGN_TEMPLATE_STEP", "CART", "CASE_STUDY", "CHATFLOW", "CLIP", "CMS_URL", "COMBO_EVENT_CONFIGURATION", "COMMERCE_PAYMENT", "COMMUNICATION", "COMPANY", "CONTACT", "CONTACT_CREATE_ATTRIBUTION", "CONTENT", "CONTENT_AUDIT", "CONTENT_AUDIT_PAGE", "CONVERSATION", "CONVERSATION_INBOX", "CONVERSATION_SESSION", "CRM_OBJECTS_DUMMY_TYPE", "CRM_PIPELINES_DUMMY_TYPE", "CTA", "CTA_VARIANT", "DATA_PRIVACY_CONSENT", "DATA_SYNC_STATE", "DEAL", "DEAL_CREATE_ATTRIBUTION", "DEAL_REGISTRATION", "DEAL_SPLIT", "DISCOUNT", "DISCOUNT_CODE", "DISCOUNT_TEMPLATE", "EMAIL", "ENGAGEMENT", "EXPORT", "EXTERNAL_WEB_URL", "FEE", "FEEDBACK_SUBMISSION", "FEEDBACK_SURVEY", "FILE_MANAGER_FILE", "FILE_MANAGER_FOLDER", "FOLDER", "FORECAST", "FORM", "FORM_SUBMISSION_INBOUNDDB", "GOAL_TARGET", "GOAL_TARGET_GROUP", "GOAL_TEMPLATE", "GSC_PROPERTY", "HUB", "IMPORT", "INVOICE", "KEYWORD", "KNOWLEDGE_ARTICLE", "LANDING_PAGE", "LEAD", "LINE_ITEM", "MARKETING_CALENDAR", "MARKETING_CAMPAIGN_UTM", "MARKETING_EMAIL", "MARKETING_EVENT", "MARKETING_EVENT_ATTENDANCE", "MARKETING_SMS", "MEDIA_BRIDGE", "MEETING_EVENT", "MIC", "NOTE", "OBJECT_LIST", "ORDER", "OWNER", "PARTNER_ACCOUNT", "PARTNER_CLIENT", "PARTNER_CLIENT_REVENUE", "PARTNER_SERVICE", "PAYMENT_LINK", "PAYMENT_SCHEDULE", "PAYMENT_SCHEDULE_INSTALLMENT", "PERMISSIONS_TESTING", "PLAYBOOK", "PLAYBOOK_QUESTION", "PLAYBOOK_SUBMISSION", "PLAYBOOK_SUBMISSION_ANSWER", "PLAYLIST", "PLAYLIST_FOLDER", "PODCAST_EPISODE", "PORTAL", "PORTAL_OBJECT_SYNC_MESSAGE", "POSTAL_MAIL", "PRIVACY_SCANNER_COOKIE", "PRODUCT", "PRODUCT_OR_FOLDER", "PROPERTY_INFO", "PROSPECTING_AGENT_CONTACT_ASSIGNMENT", "PUBLISHING_TASK", "QUARANTINED_SUBMISSION", "QUOTA", "QUOTE", "QUOTE_FIELD", "QUOTE_MODULE", "QUOTE_MODULE_FIELD", "QUOTE_TEMPLATE", "RESTORABLE_CRM_OBJECT", "ROSTER", "ROSTER_MEMBER", "SALES_DOCUMENT", "SALES_TASK", "SALES_WORKLOAD", "SALESFORCE_SYNC_ERROR", "SCHEDULING_PAGE", "SCHEMAS_BACKEND_TEST", "SCORE_CONFIGURATION", "SEQUENCE", "SEQUENCE_ENROLLMENT", "SEQUENCE_STEP", "SEQUENCE_STEP_ENROLLMENT", "SERVICE", "SITE_PAGE", "SNIPPET", "SOCIAL_BROADCAST", "SOCIAL_CHANNEL", "SOCIAL_POST", "SOCIAL_PROFILE", "SOX_PROTECTED_DUMMY_TYPE", "SOX_PROTECTED_TEST_TYPE", "SUBMISSION_TAG", "SUBSCRIPTION", "TASK", "TASK_TEMPLATE", "TAX", "TEMPLATE", "TICKET", "UNKNOWN", "UNSUBSCRIBE", "USER", "VIEW", "VIEW_BLOCK", "WEB_INTERACTIVE"]), searchTextAnalysisMode: z.enum(["NONE", "NOT_ANALYZED_TEXT"]), searchableInGlobalSearch: z.boolean(), sensitiveDataCategories: z.array(z.string()), showCurrencySymbol: z.boolean(), textDisplayHint: z.enum(["domain_name", "email", "ip_address", "multi_line", "phone_number", "physical_address", "postal_code", "unformatted_single_line"]), type: z.enum(["bool", "currency_number", "date", "datetime", "enumeration", "json", "number", "object_coordinates", "phone_number", "string"]), updatedAt: z.number().int()}); export const cmsMediaBridgeDefinitionSource = z.object({name: z.string().optional(), type: z.enum(["GLOBAL", "HAVEN_BRANCH", "OBJECT_TYPE", "PORTAL"])}); export const cmsMediaBridgeDefaultRequirements = z.object({gates: z.array(z.string()), operator: z.enum(["AND", "OR"]), scopeNames: z.array(z.string()), settings: z.array(z.string())}); export const cmsMediaBridgeRollupExpression = z.object({associationTypes: z.array(associationSpec), conditionalExpression: z.object({}).optional(), conditionalFormula: z.string().optional(), emptyRollupValue: z.string().optional(), rollupOperator: z.enum(["AVERAGE", "COUNT", "EARLIEST_VALUE", "LATEST_VALUE", "MAX", "MAX_BY", "MIN", "MIN_BY", "REFERENCED_ID_SET", "REFERENCED_STRING_SET", "REFERENCED_STRING_SET_INTERSECTION", "SUM", "SYNC_MAX_BY", "SYNC_MIN_BY", "SYNC_VALUE", "UNKNOWN_ROLLUP_OPERATOR"]), sourceCompareByPropertyName: z.string().optional(), sourceObjectTypeId: z.string(), sourcePropertyName: z.string()}); export const cmsMediaBridgePropertyDefinition = z.object({calculationExpression: z.object({}).optional(), calculationFormula: z.string().optional(), definitionSource: cmsMediaBridgePropertyDefinitionSource.optional(), extensionData: cmsMediaBridgeExtensionData.optional(), externalOptionsMetaData: cmsMediaBridgeExternalOptionsMetaData.optional(), fulcrumPortalId: z.number().int().optional(), fulcrumTimestamp: z.number().int().optional(), janusGroup: z.string().optional(), lookupAssociationSpec: cmsMediaBridgeLookupAssociationSpec.optional(), objectTypeId: z.string(), permission: cmsMediaBridgeFieldLevelPermission.optional(), property: cmsMediaBridgeProperty, propertyDefinitionSource: cmsMediaBridgeDefinitionSource.optional(), propertyRequirements: cmsMediaBridgeDefaultRequirements.optional(), rollupExpression: cmsMediaBridgeRollupExpression.optional()}); export const cmsMediaBridgeGroup = z.object({deleted: z.boolean(), displayName: z.string(), displayOrder: z.number().int(), fulcrumPortalId: z.number().int(), fulcrumTimestamp: z.number().int(), hubspotDefined: z.boolean(), name: z.string(), portalId: z.number().int()}); export const cmsMediaBridgeIntegratorObjectCreationResponse = z.object({objectType: cmsMediaBridgeInboundDbObjectType, properties: z.array(cmsMediaBridgePropertyDefinition), propertyGroups: z.array(cmsMediaBridgeGroup)}); export const cmsMediaBridgeBulkIntegratorObjectCreationResponse = z.object({createdObjects: z.record(z.string(), cmsMediaBridgeIntegratorObjectCreationResponse)}); 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 }; /** * Create a new object type * * POST /media-bridge/2026-03/{appId}/settings/object-definitions * * Also accepts auth: developer_hapikey */ export const createApiMediaBridge202603AppIdSettingsObjectDefinitions = async (args: CreateApiMediaBridge202603AppIdSettingsObjectDefinitionsArgs, options?: CreateApiMediaBridge202603AppIdSettingsObjectDefinitionsOptions) => { const {baseUrl = "https://api.hubapi.com", fetch: fetchFn = fetch, privateApps} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (privateApps !== undefined) headers.set('authorization', `Bearer ${privateApps}`) const url = `${baseUrl.replace(/\/+$/, '')}/media-bridge/2026-03/${encodeURIComponent(String(args.appId))}/settings/object-definitions${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(cmsMediaBridgeBulkIntegratorObjectCreationResponse, await res.json()) };