import {z} from 'zod' export type PartialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria = {keyEventId?: string | undefined, keyEventFilters?: ({todo?: string | undefined}) | undefined}; export type PartialRealtimeJourneyYamlRealtimeAndBatchIon = Record; export type PartialRealtimeJourneyYamlRealtimeJourneyJumpTarget = {realtimeJourneyId: string, realtimeJourneyStageId: string, confirmed: boolean} | null; export type PartialRealtimeJourneyYamlRealtimeJourneyCriteriaWithTarget = {name: string, description?: string | undefined, keyEventCriteria?: PartialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria | undefined, profileCriteria?: PartialRealtimeJourneyYamlRealtimeAndBatchIon | undefined, acceptUnknownProfiles?: (boolean | null) | undefined, target?: PartialRealtimeJourneyYamlRealtimeJourneyJumpTarget | undefined} | null; export type PartialRealtimeJourneyYamlRealtimeJourneyWaitStep = {type: 'WaitStep', waitStep: number, waitStepUnit: 'minute' | 'hour' | 'day', next?: string | undefined}; export type PartialRealtimeJourneyYamlRealtimeJourneyActivationStep = {type: 'TriggeredActivation', journeyActivationStepId: string, next?: string | undefined}; export type PartialRealtimeJourneyYamlRealtimeDecisionPointBranch = {id: string, name: string | null, description?: (string | null) | undefined, profileCriteria: PartialRealtimeJourneyYamlRealtimeAndBatchIon | Record | null, excludedPath: boolean, next: string | null}; export type PartialRealtimeJourneyYamlRealtimeDecisionPointStep = {type: 'DecisionPoint', branches: Array}; export type PartialRealtimeJourneyYamlMergeStep = {type: 'Merge', next: string | null}; export type PartialRealtimeJourneyYamlJumpStep = {type: 'Jump', name?: string | undefined, description?: (string | null) | undefined, target?: PartialRealtimeJourneyYamlRealtimeJourneyJumpTarget | undefined}; export type PartialRealtimeJourneyYamlEndStep = {type: 'End'}; export type PartialRealtimeJourneyYamlRealtimeABTestVariant = {id: string, name: string | null, percentage: number | null, isControlGroup: boolean | null, next: string | null}; export type PartialRealtimeJourneyYamlRealtimeABTest = {type: 'Variant', branches?: Array | undefined, controlVariant: boolean | null, customizedSplit: boolean | null}; export type PartialRealtimeJourneyYamlRealtimeJourneyCriteria = {name: string, description?: string | undefined, keyEventCriteria?: PartialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria | undefined, profileCriteria?: PartialRealtimeJourneyYamlRealtimeAndBatchIon | undefined, acceptUnknownProfiles?: (boolean | null) | undefined} | null; export type PartialRealtimeJourneyYamlRealtimeJourneyStaleCriteria = {name?: (string | null) | undefined, unit?: ('minute' | 'hour' | 'day') | undefined, exitAfter?: number | undefined}; export type PartialRealtimeJourneyYamlRealtimeJourneyCustomExitCriteria = {name: string | null, keyEventCriteria: PartialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria, profileCriteria: PartialRealtimeJourneyYamlRealtimeAndBatchIon, target: PartialRealtimeJourneyYamlRealtimeJourneyJumpTarget}; export type PartialRealtimeJourneyYamlRealtimeJourneyStageAttributes = {id?: string | undefined, name: string, description?: string | undefined, steps?: ({[key: string]: PartialRealtimeJourneyYamlRealtimeJourneyWaitStep | PartialRealtimeJourneyYamlRealtimeJourneyActivationStep | PartialRealtimeJourneyYamlRealtimeDecisionPointStep | PartialRealtimeJourneyYamlMergeStep | PartialRealtimeJourneyYamlJumpStep | PartialRealtimeJourneyYamlEndStep | PartialRealtimeJourneyYamlRealtimeABTest}) | undefined, rootStep?: (string | null) | undefined, entryCriteria?: PartialRealtimeJourneyYamlRealtimeJourneyCriteria | undefined, milestone?: PartialRealtimeJourneyYamlRealtimeJourneyCriteria | undefined, exitCriterias?: (Array) | undefined, orderIndex?: number | undefined}; export type PartialRealtimeJourneyYamlRealtimeJourneyReentryMode = 'no_reentry' | 'reentry_unless_goal_achieved' | 'reentry_always'; export type PartialRealtimeJourneyYamlRealtimeJourneyAttributes = {audienceId: string, segmentFolderId: string, name: string, description: string | null, goal: PartialRealtimeJourneyYamlRealtimeJourneyCriteriaWithTarget | Record | null, realtimeJourneyStages: Array, reentryMode: PartialRealtimeJourneyYamlRealtimeJourneyReentryMode}; export type CreateApiEntitiesRealtimeJourneysArgs = {body: {attributes: PartialRealtimeJourneyYamlRealtimeJourneyAttributes}}; export type CreateApiEntitiesRealtimeJourneysOptions = {baseUrl?: string | undefined, TdApikeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const partialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria = z.object({keyEventId: z.string().optional(), keyEventFilters: z.object({todo: z.string().optional()}).optional()}); export const partialRealtimeJourneyYamlRealtimeAndBatchIon = z.object({}); export const partialRealtimeJourneyYamlRealtimeJourneyJumpTarget = z.object({realtimeJourneyId: z.string(), realtimeJourneyStageId: z.string(), confirmed: z.boolean()}).nullable(); export const partialRealtimeJourneyYamlRealtimeJourneyCriteriaWithTarget = z.object({name: z.string(), description: z.string().optional(), keyEventCriteria: partialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria.optional(), profileCriteria: partialRealtimeJourneyYamlRealtimeAndBatchIon.optional(), acceptUnknownProfiles: z.boolean().nullable().optional(), target: partialRealtimeJourneyYamlRealtimeJourneyJumpTarget.optional()}).nullable(); export const partialRealtimeJourneyYamlRealtimeJourneyWaitStep = z.object({type: z.literal("WaitStep"), waitStep: z.number().int(), waitStepUnit: z.enum(["minute", "hour", "day"]), next: z.string().optional()}); export const partialRealtimeJourneyYamlRealtimeJourneyActivationStep = z.object({type: z.literal("TriggeredActivation"), journeyActivationStepId: z.string(), next: z.string().optional()}); export const partialRealtimeJourneyYamlRealtimeDecisionPointBranch = z.object({id: z.string(), name: z.string().nullable(), description: z.string().nullable().optional(), profileCriteria: z.union([partialRealtimeJourneyYamlRealtimeAndBatchIon, z.object({}).nullable()]), excludedPath: z.boolean(), next: z.string().nullable()}); export const partialRealtimeJourneyYamlRealtimeDecisionPointStep = z.object({type: z.literal("DecisionPoint"), branches: z.array(partialRealtimeJourneyYamlRealtimeDecisionPointBranch)}); export const partialRealtimeJourneyYamlMergeStep = z.object({type: z.literal("Merge"), next: z.string().nullable()}); export const partialRealtimeJourneyYamlJumpStep = z.object({type: z.literal("Jump"), name: z.string().optional(), description: z.string().nullable().optional(), target: partialRealtimeJourneyYamlRealtimeJourneyJumpTarget.optional()}); export const partialRealtimeJourneyYamlEndStep = z.object({type: z.literal("End")}); export const partialRealtimeJourneyYamlRealtimeABTestVariant = z.object({id: z.string(), name: z.string().nullable(), percentage: z.number().nullable(), isControlGroup: z.boolean().nullable(), next: z.string().nullable()}); export const partialRealtimeJourneyYamlRealtimeABTest = z.object({type: z.literal("Variant"), branches: z.array(partialRealtimeJourneyYamlRealtimeABTestVariant).optional(), controlVariant: z.boolean().nullable(), customizedSplit: z.boolean().nullable()}); export const partialRealtimeJourneyYamlRealtimeJourneyCriteria = z.object({name: z.string(), description: z.string().optional(), keyEventCriteria: partialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria.optional(), profileCriteria: partialRealtimeJourneyYamlRealtimeAndBatchIon.optional(), acceptUnknownProfiles: z.boolean().nullable().optional()}).nullable(); export const partialRealtimeJourneyYamlRealtimeJourneyStaleCriteria = z.object({name: z.string().nullable().optional(), unit: z.enum(["minute", "hour", "day"]).optional(), exitAfter: z.number().int().gte(1).optional()}); export const partialRealtimeJourneyYamlRealtimeJourneyCustomExitCriteria = z.object({name: z.string().nullable(), keyEventCriteria: partialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria, profileCriteria: partialRealtimeJourneyYamlRealtimeAndBatchIon, target: partialRealtimeJourneyYamlRealtimeJourneyJumpTarget}); export const partialRealtimeJourneyYamlRealtimeJourneyStageAttributes = z.object({id: z.string().optional(), name: z.string(), description: z.string().optional(), steps: z.record(z.string(), z.union([partialRealtimeJourneyYamlRealtimeJourneyWaitStep, partialRealtimeJourneyYamlRealtimeJourneyActivationStep, partialRealtimeJourneyYamlRealtimeDecisionPointStep, partialRealtimeJourneyYamlMergeStep, partialRealtimeJourneyYamlJumpStep, partialRealtimeJourneyYamlEndStep, partialRealtimeJourneyYamlRealtimeABTest])).optional(), rootStep: z.string().nullable().optional(), entryCriteria: partialRealtimeJourneyYamlRealtimeJourneyCriteria.optional(), milestone: partialRealtimeJourneyYamlRealtimeJourneyCriteria.optional(), exitCriterias: z.array(z.union([partialRealtimeJourneyYamlRealtimeJourneyStaleCriteria, partialRealtimeJourneyYamlRealtimeJourneyCustomExitCriteria])).optional(), orderIndex: z.number().int().optional()}); export const partialRealtimeJourneyYamlRealtimeJourneyReentryMode = z.enum(["no_reentry", "reentry_unless_goal_achieved", "reentry_always"]); export const partialRealtimeJourneyYamlRealtimeJourneyState = z.enum(["draft", "launched"]); export const user = z.object({id: z.string().optional(), td_user_id: z.string().optional(), name: z.string().optional()}); export const relationshipsFolderJsonApiResource = z.object({data: z.object({id: z.string(), type: z.literal("folder-segment")}).optional()}); export const partialRealtimeJourneyYamlRealtimeActivationParameters = z.object({exportJson: z.string().nullable().optional(), exportAdvancedJson: z.string().nullable().optional()}); export const partialRealtimeJourneyYamlRealtimeJourneyActivationStepResource = z.object({id: z.string().optional(), type: z.literal("realtime-journey-activation-step").optional(), attributes: z.object({name: z.string().optional(), description: z.string().nullable().optional(), stepUuid: z.string().optional(), connectionId: z.string(), connectorType: z.string(), connector: partialRealtimeJourneyYamlRealtimeActivationParameters, realtimeJourneyId: z.string().optional(), realtimeJourneyStageId: z.string().nullable().optional()}).optional()}); export const partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinkResource = z.object({id: z.string().optional(), type: z.literal("realtime-journey-jump-link").optional()}); export const partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinksMeta = z.object({targetStageInfo: z.record(z.string(), z.object({destinationRealtimeJourneyName: z.string().nullable(), destinationRealtimeJourneyStageName: z.string().nullable(), destinationSegmentFolderName: z.string().nullable(), deleted: z.boolean(), deletedByTdUserId: z.string().nullable(), deletedByTdUserName: z.string().nullable()})).optional()}); export const partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpFromsMeta = z.array(z.object({sourceJourneyId: z.string().optional(), sourceJourneyName: z.string().optional(), sourceJourneyState: partialRealtimeJourneyYamlRealtimeJourneyState.optional(), sourceJourneyStageId: z.string().nullable().optional(), sourceJourneyStageName: z.string().nullable().optional(), sourceJourneyFolderId: z.string().optional(), sourceJourneyFolderName: z.string().optional(), targetJourneyStageId: z.string().optional(), jumpFrom: z.enum(["exit_criteria", "jump_step", "goal"]).optional(), jumpName: z.string().optional()})); export const partialRealtimeJourneyYamlRealtimeJourneyResource = z.object({id: z.string().optional(), type: z.literal("realtime-journey").optional(), attributes: z.object({audienceId: z.string(), segmentFolderId: z.string(), name: z.string(), description: z.string().nullable(), goal: z.union([partialRealtimeJourneyYamlRealtimeJourneyCriteriaWithTarget, z.object({}).nullable()]), realtimeJourneyStages: z.array(partialRealtimeJourneyYamlRealtimeJourneyStageAttributes), reentryMode: partialRealtimeJourneyYamlRealtimeJourneyReentryMode, state: partialRealtimeJourneyYamlRealtimeJourneyState, createdAt: z.string(), updatedAt: z.string(), paused: z.boolean(), pausedAt: z.string().nullable(), launchedAt: z.string().nullable()}).optional(), relationships: z.object({createdBy: user.optional(), updatedBy: user.optional(), parentFolder: relationshipsFolderJsonApiResource.optional(), realtimeJourneyActivationSteps: z.object({data: z.array(partialRealtimeJourneyYamlRealtimeJourneyActivationStepResource), meta: z.object({names: z.unknown()})}).optional(), jumpLinks: z.object({data: z.array(partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinkResource), meta: partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinksMeta}).optional(), jumpFroms: z.object({data: z.array(partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinkResource), meta: partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpFromsMeta}).optional()}).optional()}); export const createApiEntitiesRealtimeJourneysResponse = z.object({data: partialRealtimeJourneyYamlRealtimeJourneyResource.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 }; /** * Create a realtime journey * * POST /entities/realtime_journeys */ export const createApiEntitiesRealtimeJourneys = async (args: CreateApiEntitiesRealtimeJourneysArgs, options?: CreateApiEntitiesRealtimeJourneysOptions) => { const {baseUrl = "https://api-cdp.treasuredata.com", fetch: fetchFn = fetch, TdApikeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/vnd.treasuredata.v1+json") headers.set('accept', "application/json") if (TdApikeyAuth !== undefined) headers.set("Authorization", TdApikeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/entities/realtime_journeys${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(createApiEntitiesRealtimeJourneysResponse, await res.json()) };