openapi: 3.2.0 info: version: v1.0.0 title: External APIs for Customer Integration Cleanroom Flows API description: APIs to create and fetch Clean Room and related details from LiveRamp (previously Habu) for Customer Integration. contact: name: LiveRamp (previously Habu) url: https://liveramp.com/ email: platform_admin@habu.com servers: - description: External APIs for Customer Integration url: https://api.habu.com/v1/ security: - application: [] tags: - name: Cleanroom Flows paths: /cleanrooms/{cleanroomId}/cleanroom-flows/{cleanroomFlowId}: get: summary: Get a Cleanroom Flow by ID operationId: getCleanroomFlow description: This operation fetches a Cleanroom Flow by its ID, including flow structure (nodes, edges) and version information. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string responses: '200': description: Successfully retrieved the Cleanroom Flow. content: application/json: schema: $ref: '#/components/schemas/GetCleanroomFlowResponse' application/xml: schema: $ref: '#/components/schemas/GetCleanroomFlowResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/cleanroom-flows: post: summary: Create or update a cleanroom flow operationId: createOrUpdateCleanroomFlow description: This operation creates or updates a Cleanroom Flow. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateFlowRequest' responses: '200': description: Successfully created or updated the Cleanroom Flow. content: application/json: schema: $ref: '#/components/schemas/CreateFlowResponse' application/xml: schema: $ref: '#/components/schemas/CreateFlowResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/cleanroom-flows/{cleanroomFlowId}/version/{version}: put: summary: Set Cleanroom Flow Version operationId: setCleanroomFlowVersion description: This operation changes a cleanroom flow to use a specific existing flow version. Use this for rollback or switching between flow versions. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string - name: version in: path description: The target flow version to set required: true schema: type: integer format: int32 responses: '200': description: Successfully updated the Cleanroom Flow version. content: application/json: schema: $ref: '#/components/schemas/GetCleanroomFlowResponse' application/xml: schema: $ref: '#/components/schemas/GetCleanroomFlowResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/cleanroom-flows/list: post: summary: List Cleanroom Flows operationId: listCleanroomFlows description: List cleanroom flows for a cleanroom with pagination, filters and search. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ListCleanroomFlowsRequest' responses: '200': description: Successfully fetched cleanroom flows content: application/json: schema: $ref: '#/components/schemas/ListCleanroomFlowsResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/cleanroom-flows/{cleanroomFlowId}/assign-datasets: post: summary: Assign datasets and fields to a cleanroom flow operationId: assignCleanroomFlowDatasets description: This operation assigns datasets and field mappings to nodes in a cleanroom flow using dataset and organization names instead of IDs. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AssignFlowDatasetsRequest' responses: '200': description: Successfully assigned datasets to the cleanroom flow. content: application/json: schema: $ref: '#/components/schemas/AssignFlowDatasetsResponse' application/xml: schema: $ref: '#/components/schemas/AssignFlowDatasetsResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/dataset-organizations: post: summary: Get organization information for datasets by UUID or name operationId: getDatasetOrganizations description: This operation retrieves organization information for datasets by UUID or name within a cleanroom context. parameters: - name: cleanroomId in: path description: Cleanroom ID to scope the dataset search required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/GetDatasetOrganizationsRequest' responses: '200': description: Successfully retrieved dataset organization information. content: application/json: schema: $ref: '#/components/schemas/GetDatasetOrganizationsResponse' application/xml: schema: $ref: '#/components/schemas/GetDatasetOrganizationsResponse' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/cleanroom-flows/{cleanroomFlowId}/nodes/exports: post: summary: Bulk create flow node export jobs operationId: createFlowNodeExportJobs description: Creates export jobs for one or more flow nodes in a single call. Each item specifies a node ID, the partner accounts to export to, and optional export parameters. Only question nodes are supported. One export job is created per partner account per node. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string requestBody: required: true content: application/json: schema: type: array items: $ref: '#/components/schemas/NodeExportRequest' responses: '200': description: Export jobs created successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/NodeExportResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows get: summary: Bulk list flow node export jobs operationId: listFlowNodeExportJobs description: Lists all export jobs for one or more flow nodes. Pass a comma-separated list of node IDs via the nodeIds query parameter. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string - name: nodeIds in: query description: Comma-separated list of node IDs to list exports for required: true schema: type: array items: type: string style: form explode: false - name: limit in: query description: The number of export jobs returned per node per page - default is 500 schema: type: integer default: 500 - name: offset in: query description: The offset - default is 0 schema: type: integer default: 0 responses: '200': description: Export jobs listed successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/NodeExportJobList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows delete: summary: Bulk delete flow node export jobs operationId: deleteFlowNodeExportJobs description: Deletes all export jobs for the specified flow nodes. All jobs associated with each node are deleted. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BulkNodeDeleteRequest' responses: '200': description: Export jobs deleted successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/NodeDeleteResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/cleanroom-flows/{cleanroomFlowId}/nodes/exports/status: patch: summary: Bulk update flow node export job status operationId: updateFlowNodeExportJobsStatus description: Updates the status of all export jobs for the specified flow nodes. Status must be ACTIVE or PAUSED. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BulkNodeStatusRequest' responses: '200': description: Job statuses updated successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/NodeStatusResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/cleanroom-flows/{cleanroomFlowId}/nodes/exports/runs: get: summary: Bulk get flow node export job runs operationId: getFlowNodeExportJobRuns description: Returns run history for all export jobs associated with the specified flow nodes. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string - name: nodeIds in: query description: Comma-separated list of node IDs required: true schema: type: array items: type: string style: form explode: false responses: '200': description: Job runs retrieved successfully. content: application/json: schema: type: array items: $ref: '#/components/schemas/NodeJobRunsList' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows /cleanrooms/{cleanroomId}/cleanroom-flows/{cleanroomFlowId}/node-details: get: summary: Get comprehensive node details for a cleanroom flow operationId: getCleanroomFlowNodeDetails description: This operation retrieves comprehensive details for all nodes in a cleanroom flow including question metadata and flow position information. parameters: - name: cleanroomId in: path description: Cleanroom ID required: true schema: type: string - name: cleanroomFlowId in: path description: Cleanroom Flow ID required: true schema: type: string responses: '200': description: Successfully retrieved cleanroom flow node details. content: application/json: schema: $ref: '#/components/schemas/CleanroomFlowNodeDetails' application/xml: schema: $ref: '#/components/schemas/CleanroomFlowNodeDetails' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' tags: - Cleanroom Flows components: schemas: CreateFlowResponse: type: object properties: flowID: type: string description: The ID of the created flow success: type: boolean description: Whether the flow creation was successful message: type: string description: Additional information about the flow creation NodeExportRequest: type: object required: - nodeId - partnerAccountIds properties: nodeId: type: string description: The node UUID or display label to create exports for. partnerAccountIds: type: array items: type: string description: Partner account IDs to export to. One job is created per partner account. exportParameters: type: array items: $ref: '#/components/schemas/ExportJobParameter' description: Optional export parameters (e.g. S3_EXPORT_PATH, GCS_EXPORT_PATH). JobRunStatus: type: string enum: - UNKNOWN_JOB_RUN_STATUS - QUEUED - PROCESSING - COMPLETE - FAILED - PARTIALLY_FAILED - THRESHOLD_WARNING - NO_NEW_USERS NodeExportJobList: type: object properties: nodeId: type: string jobs: type: array items: $ref: '#/components/schemas/FlowNodeExportJob' APIEdge: type: object required: - datasetMacro - parentID properties: datasetMacro: type: string description: The dataset macro/type identifier parentID: type: string description: The nodeIdentifier of the parent node fieldMappings: type: array description: Field mappings between parent and current node items: $ref: '#/components/schemas/APIFieldMapping' DatasetOwnership: type: string enum: - OWNER - PARTNER description: Dataset ownership type AssetQuestionDataType: type: object properties: ID: type: string macro: type: string description: type: string importDataType: type: string optional: type: boolean fields: type: array items: $ref: '#/components/schemas/QuestionDataTypeField' ListCleanroomFlowsResponse: type: object properties: cleanRoomFlows: type: array items: $ref: '#/components/schemas/ListItemCleanroomFlow' count: type: integer format: int32 ListItemCleanroomFlow: type: object properties: ID: type: string displayID: type: string cleanRoomID: type: string flowID: type: string status: type: string stage: type: string timeAudit: $ref: '#/components/schemas/TimeAudit' userAudit: $ref: '#/components/schemas/NestedUserAudit' flow: $ref: '#/components/schemas/ListItemFlow' runCount: type: integer format: int32 CryptoKeyID: type: string flowVersion: type: integer format: int32 isProvisioned: type: boolean billableConfigID: type: string isBillable: type: boolean ownerOrganizationID: type: string QuestionDimension: type: object properties: ID: type: string name: type: string displayName: type: string type: type: string filterable: type: boolean plottable: type: boolean ReturnObject: type: object properties: code: type: string message: type: string required: - code - message NodeExportResult: type: object properties: nodeId: type: string jobIds: type: array items: type: string CleanroomFlowNodeDetails: type: object properties: nodes: type: array items: $ref: '#/components/schemas/FlowNodeMetadata' description: Detailed information for all nodes in the flow TimeAudit: type: object properties: createdAt: type: string format: date-time description: Timestamp for when the object was created updatedAt: type: string format: date-time description: Timestamp for when the object was last updated deletedAt: type: string format: date-time description: Timestamp for when the object was deleted (if applicable) NodeSettings: type: object properties: computeCapacity: type: string description: Compute capacity for the node access: type: array items: type: string description: List of organization IDs that have access to this node. GetDatasetOrganizationsRequest: type: object required: - datasetIdentifiers properties: datasetIdentifiers: type: array description: List of dataset identifiers (UUIDs or names) items: type: string JobRunType: type: string enum: - UNKNOWN_JOB_RUN_TYPE - FULL_REFRESH - INCREMENTAL NodeJobRunsList: type: object properties: nodeId: type: string jobRuns: type: array items: $ref: '#/components/schemas/ExportJobRun' ExportJobRun: type: object properties: id: type: string jobId: type: string status: $ref: '#/components/schemas/JobRunStatus' submitTime: type: string format: date-time startTime: type: string format: date-time endTime: type: string format: date-time totalRecords: type: integer consentedRecords: type: integer cumulativeRecords: type: integer sourceJobRunID: type: string jobRunType: $ref: '#/components/schemas/JobRunType' details: $ref: '#/components/schemas/JobDetails' errorMessage: type: string BulkNodeDeleteRequest: type: object required: - nodeIds properties: nodeIds: type: array items: type: string CreateFlowRequest: type: object required: - flowName - nodes properties: flowName: type: string description: The name of the flow. description: type: string description: A description of the flow. nodes: type: array items: $ref: '#/components/schemas/APINode' createNewVersion: type: boolean description: Whether to create a new version of the flow default: false versionMessage: type: string description: Version description provided by user APIFieldMapping: type: object required: - datasetFieldName - parentFieldName properties: datasetFieldName: type: string description: The field name in the dataset parentFieldName: type: string description: The field name from the parent node ListItemFlow: type: object properties: ID: type: string displayID: type: string name: type: string description: type: string organizationID: type: string status: type: string timeAudit: $ref: '#/components/schemas/TimeAudit' userAudit: $ref: '#/components/schemas/NestedUserAudit' nodes: type: array items: type: object edges: type: array items: type: object version: type: integer format: int32 NodeDeleteResult: type: object properties: nodeId: type: string deletedJobIds: type: array items: type: string JobDetailParameter: type: object properties: label: type: string value: type: string NestedUserAudit: type: object properties: createdByUser: $ref: '#/components/schemas/UserRefInfo' updatedByUser: $ref: '#/components/schemas/UserRefInfo' GetCleanroomFlowResponse: type: object description: Response object containing the cleanroom flow details properties: cleanRoomFlow: $ref: '#/components/schemas/ListItemCleanroomFlow' AssignFlowDatasetsResponse: type: object properties: success: type: boolean description: Success indicator message: type: string description: Status message assignedDatasets: type: array description: Assigned datasets with resolved information items: $ref: '#/components/schemas/AssignedDatasetResult' QuestionMetric: type: object properties: ID: type: string name: type: string displayName: type: string type: type: string computed: type: boolean GetDatasetOrganizationsResponse: type: object properties: success: type: boolean description: Success indicator message: type: string description: Status message datasetOrganizations: type: array description: Dataset organization information items: $ref: '#/components/schemas/DatasetOrganizationInfo' AssignedDatasetResult: type: object properties: nodeIdentifier: type: string description: Node display ID datasetName: type: string description: Dataset name that was assigned datasetID: type: string description: Dataset ID (resolved) organizationName: type: string description: Organization name from request ownership: $ref: '#/components/schemas/DatasetOwnership' description: Resolved ownership (OWNER, PARTNER) datasetMacro: type: string description: Dataset macro/type status: type: string description: Assignment status APINode: type: object required: - nodeIdentifier properties: nodeIdentifier: type: string description: Unique identifier for the node within the flow. edges: type: array description: Edges connecting this node to other nodes with dataset mappings items: $ref: '#/components/schemas/APIEdge' settings: $ref: '#/components/schemas/NodeSettings' tags: type: string description: Comma-separated list of branch tags for the node NodeDatasetAssignment: type: object properties: nodeIdentifier: type: string description: Node display ID or name datasets: type: array description: Dataset assignments for this node items: $ref: '#/components/schemas/DatasetAssignment' BulkNodeStatusRequest: type: object required: - nodeIds - status properties: nodeIds: type: array items: type: string status: type: string description: Target status for all jobs under these nodes (ACTIVE or PAUSED). DatasetOrganizationInfo: type: object properties: requestedIdentifier: type: string description: Dataset identifier from request (UUID or name) datasetID: type: string description: Dataset ID (resolved UUID) datasetName: type: string description: Dataset name organizationID: type: string description: Organization ID that owns the dataset organizationName: type: string description: Organization name that owns the dataset found: type: boolean description: Whether the dataset was found errorMessage: type: string description: Error message if not found or inaccessible AssignFlowDatasetsRequest: type: object required: - nodeDatasets properties: nodeDatasets: type: array description: Dataset assignments for each node items: $ref: '#/components/schemas/NodeDatasetAssignment' FlowNodeExportJob: type: object properties: id: type: string name: type: string description: Display name of the export job. status: type: string description: Job status (ACTIVE or PAUSED). channelStatus: type: string description: Health status of the export channel. partnerAccountId: type: string partnerAccountName: type: string description: Display name of the partner account. createdAt: type: string format: date-time lastRunTime: type: string format: date-time description: Timestamp of the last execution of this export job. exportParameters: type: array description: Export parameters configured for this job (e.g. S3 path, format). items: $ref: '#/components/schemas/ExportJobParameter' DatasetAssignment: type: object properties: datasetName: type: string description: Dataset name (will be resolved to ID) datasetMacro: type: string description: Dataset macro/type organizationName: type: string description: Organization name from stakeholders list (will be resolved to ownership) fieldMappings: type: array description: Field mappings using field names items: $ref: '#/components/schemas/FieldMapping' ExportJobParameter: type: object properties: name: type: string value: type: string QuestionDataTypeField: type: object properties: ID: type: string name: type: string type: type: string format: type: string description: type: string NodeStatusResult: type: object properties: nodeId: type: string success: type: boolean FlowNodeMetadata: type: object properties: nodeIdentifier: type: string description: Node identifier nodeID: type: string description: Node ID nodeLevel: type: integer description: Node level in the flow ID: type: string description: Question ID displayID: type: string description: Question display ID title: type: string description: Question title category: type: string description: Question category description: type: string description: Question description status: type: string description: Question status hasDateFilter: type: boolean description: Whether the question has date filter hasDateParameters: type: boolean description: Whether the question has date parameters hasMultipleOutputs: type: boolean description: Whether the question has multiple outputs isAggregate: type: boolean description: Whether the question is aggregate isUserListQuestion: type: boolean description: Whether the question is a user list question defaultComputeCapacity: type: string description: Default compute capacity for the question dimensions: type: array items: $ref: '#/components/schemas/QuestionDimension' description: Question dimensions metrics: type: array items: $ref: '#/components/schemas/QuestionMetric' description: Question metrics parameters: type: array items: $ref: '#/components/schemas/QuestionParameter' description: Question parameters dataTypes: type: array items: $ref: '#/components/schemas/AssetQuestionDataType' description: Question data types userListOutputs: type: array items: $ref: '#/components/schemas/QuestionUserListOutput' description: Question user list outputs branches: type: array items: type: string description: Branches QuestionUserListOutput: type: object properties: ID: type: string name: type: string type: type: string isEncrypt: type: boolean ListCleanroomFlowsRequest: type: object properties: filters: type: array items: type: object sortBy: type: object additionalProperties: true limit: type: integer format: int32 default: 0 offset: type: integer format: int32 default: 0 search: type: string JobDetails: type: object properties: id: type: string name: type: string jobDetailParameters: type: array items: $ref: '#/components/schemas/JobDetailParameter' QuestionParameter: type: object properties: ID: type: string name: type: string displayName: type: string type: type: string index: type: integer parameterType: type: string UserRefInfo: type: object properties: ID: type: string name: type: string email: type: string FieldMapping: type: object properties: questionFieldName: type: string description: Question field name in the node datasetFieldName: type: string description: Dataset field name to map to responses: Unauthorized: description: Authorization information was missing or invalid content: application/json: schema: $ref: '#/components/schemas/ReturnObject' application/xml: schema: $ref: '#/components/schemas/ReturnObject' BadRequest: description: Bad Request - Incorrect syntax or request content: application/json: schema: $ref: '#/components/schemas/ReturnObject' application/xml: schema: $ref: '#/components/schemas/ReturnObject' InternalServerError: description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ReturnObject' application/xml: schema: $ref: '#/components/schemas/ReturnObject' NotFound: description: The specified resource was not found content: application/json: schema: $ref: '#/components/schemas/ReturnObject' application/xml: schema: $ref: '#/components/schemas/ReturnObject' securitySchemes: application: type: oauth2 flows: clientCredentials: tokenUrl: https://api.habu.com/v1/oauth/token scopes: {}