Create a bundle to collect evidence for a governed entity
Create a bundle — the container that holds all evidence collected for a governed entity — under a project and governed by one or more policies. policyId must reference an existing Published policy — get it from GET /policy-overviews (filter by status=Published) or GET /policies/{id}. projectId is the Domino project ID the bundle belongs to.
If resolveNameOnConflict is true and the requested name is already taken in the project, the next available variant (<name> 2, <name> 3, …) is used instead of failing.
If enforcePoliciesFor is set (e.g. App, Model), the mandatory policies configured for that target are also attached and cannot later be deactivated. When set, policyId becomes optional: if omitted, the primary policy is derived from the target’s PolicyEnforcer; if supplied, that policyId is always used as the primary.
Returns 400 with "code": "BUNDLE_REQUIRES_POLICY" when no policyId is supplied and the target has no enabled enforcer with a published policy.
Related:
- POST /rpc/compute-policy (read the bundle’s evidence/approval state for a given policy after creation)
- GET /policy-overviews (find a published policyId to attach)
- GET /policies//definition (read the policy’s evidence/approval structure)
curl --request POST \
--url https://mycluster.domino.tech/api/governance/v1/bundles \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"projectId": "<string>",
"additionalPolicyIds": [
"<string>"
],
"attachments": [
{
"identifier": {}
}
],
"policyId": "<string>",
"resolveNameOnConflict": true
}
'import requests
url = "https://mycluster.domino.tech/api/governance/v1/bundles"
payload = {
"name": "<string>",
"projectId": "<string>",
"additionalPolicyIds": ["<string>"],
"attachments": [{ "identifier": {} }],
"policyId": "<string>",
"resolveNameOnConflict": True
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
projectId: '<string>',
additionalPolicyIds: ['<string>'],
attachments: [{identifier: {}}],
policyId: '<string>',
resolveNameOnConflict: true
})
};
fetch('https://mycluster.domino.tech/api/governance/v1/bundles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mycluster.domino.tech/api/governance/v1/bundles",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'projectId' => '<string>',
'additionalPolicyIds' => [
'<string>'
],
'attachments' => [
[
'identifier' => [
]
]
],
'policyId' => '<string>',
'resolveNameOnConflict' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://mycluster.domino.tech/api/governance/v1/bundles"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"additionalPolicyIds\": [\n \"<string>\"\n ],\n \"attachments\": [\n {\n \"identifier\": {}\n }\n ],\n \"policyId\": \"<string>\",\n \"resolveNameOnConflict\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://mycluster.domino.tech/api/governance/v1/bundles")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"additionalPolicyIds\": [\n \"<string>\"\n ],\n \"attachments\": [\n {\n \"identifier\": {}\n }\n ],\n \"policyId\": \"<string>\",\n \"resolveNameOnConflict\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://mycluster.domino.tech/api/governance/v1/bundles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"additionalPolicyIds\": [\n \"<string>\"\n ],\n \"attachments\": [\n {\n \"identifier\": {}\n }\n ],\n \"policyId\": \"<string>\",\n \"resolveNameOnConflict\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"state": "Active",
"attachments": [
{
"approvalTimelineMap": {},
"createdAt": "<string>",
"createdBy": {},
"id": "<string>",
"identifier": {},
"source": "AUTO",
"type": "ModelVersion"
}
],
"classificationValue": "<string>",
"commentsCount": 123,
"createdAt": "<string>",
"createdBy": {},
"currentStageInfo": {
"openFindingsCount": 123,
"pendingApprovalsCount": 123,
"status": "NotStarted"
},
"enforcedPolicyIds": [
"<string>"
],
"evidenceRestricted": true,
"gates": [
{
"approvals": [
{
"id": "<string>",
"name": "<string>",
"stageApprovalId": "<string>",
"status": "PendingSubmission"
}
],
"bundleId": "<string>",
"id": "<string>",
"isOpen": true,
"name": "<string>",
"policyGateId": "<string>",
"policyId": "<string>",
"policyVersionId": "<string>",
"reason": "<string>",
"resources": [
{
"action": "Deploy",
"failOpen": true,
"parameters": {}
}
]
}
],
"hasRevalidationSchedule": true,
"name": "<string>",
"policies": [
{
"allowProjectApprovers": true,
"bundleId": "<string>",
"classificationValue": "<string>",
"compliantToCurrentStage": true,
"createdAt": "<string>",
"deactivatedAt": "<string>",
"enforceSequentialOrder": true,
"hasRevalidationSchedule": true,
"isLatestVersion": true,
"isPolicyArchived": true,
"policyId": "<string>",
"policyName": "<string>",
"policyVersion": "<string>",
"policyVersionId": "<string>",
"stage": "<string>",
"stageAssignee": {
"id": "<string>",
"name": "<string>"
},
"upgradeRequired": true
}
],
"policyId": "<string>",
"policyName": "<string>",
"policyVersion": "<string>",
"policyVersionId": "<string>",
"projectId": "<string>",
"projectName": "<string>",
"projectOwner": "<string>",
"stage": "<string>",
"stageApprovals": [
{
"approvers": [
{
"editable": true,
"id": "<string>",
"name": "<string>",
"showByDefault": true,
"fromOrganizationUserId": "<string>",
"isOrganizationUser": true
}
],
"evidence": {
"artifacts": [
{
"artifactType": "input",
"details": {},
"id": "<string>",
"policyEntityId": "<string>",
"required": true,
"visibilityRule": "<string>",
"visible": true
}
],
"createdAt": "<string>",
"description": "<string>",
"externalId": "<string>",
"id": "<string>",
"name": "<string>",
"policyId": "<string>",
"policyVersionId": "<string>",
"scope": "Global",
"visible": true
},
"id": "<string>",
"name": "<string>",
"policyEntityId": "<string>",
"revalidationConfig": {
"openWindowDaysBefore": 2,
"recurring": {
"every": 2,
"unit": "month",
"startDate": "<string>"
},
"type": "absolute"
}
}
],
"stageAssignee": {
"id": "<string>",
"name": "<string>"
},
"stages": [
{
"assignedAt": "<string>",
"assignee": {
"id": "<string>",
"name": "<string>"
},
"bundleId": "<string>",
"stage": {
"approvals": [
{
"approvers": [
{
"editable": true,
"id": "<string>",
"name": "<string>",
"showByDefault": true,
"fromOrganizationUserId": "<string>",
"isOrganizationUser": true
}
],
"evidence": {
"artifacts": [
{
"artifactType": "input",
"details": {},
"id": "<string>",
"policyEntityId": "<string>",
"required": true,
"visibilityRule": "<string>",
"visible": true
}
],
"createdAt": "<string>",
"description": "<string>",
"externalId": "<string>",
"id": "<string>",
"name": "<string>",
"policyId": "<string>",
"policyVersionId": "<string>",
"scope": "Global",
"visible": true
},
"id": "<string>",
"name": "<string>",
"policyEntityId": "<string>",
"revalidationConfig": {
"openWindowDaysBefore": 2,
"recurring": {
"every": 2,
"unit": "month",
"startDate": "<string>"
},
"type": "absolute"
}
}
],
"evidenceSet": [
{
"artifacts": [
{
"artifactType": "input",
"details": {},
"id": "<string>",
"policyEntityId": "<string>",
"required": true,
"visibilityRule": "<string>",
"visible": true
}
],
"createdAt": "<string>",
"description": "<string>",
"externalId": "<string>",
"id": "<string>",
"name": "<string>",
"policyId": "<string>",
"policyVersionId": "<string>",
"scope": "Global",
"visible": true
}
],
"id": "<string>",
"name": "<string>",
"notifyOnTransition": true,
"policyEntityId": "<string>",
"policyVersionId": "<string>"
},
"stageId": "<string>"
}
]
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}Body
Bundle to create
Optional, for additional policies to be included in the bundle
Show child attributes
Show child attributes
If set (e.g. "App"), also attach the mandatory policies of that target's PolicyEnforcer
App, Model Optional when enforcePoliciesFor is set; if omitted, the primary is derived from that target's enforcer. A supplied policyId is always used as the primary.
If true, append " 2", " 3", ... when the requested name is already taken in the project
Response
OK
Active, Archived, Complete Show child attributes
Show child attributes
The classification value of the primary policy
Show child attributes
Show child attributes
Policy IDs mandated by a PolicyEnforcer; these cannot be deactivated
Show child attributes
Show child attributes
Whether the bundle has an active revalidation schedule
Show child attributes
Show child attributes
The ID of the primary policy
The version of the primary policy
The version ID of the primary policy
The stage of the primary policy
Show child attributes
Show child attributes
The assignee to the stage of the primary policy
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?
curl --request POST \
--url https://mycluster.domino.tech/api/governance/v1/bundles \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"projectId": "<string>",
"additionalPolicyIds": [
"<string>"
],
"attachments": [
{
"identifier": {}
}
],
"policyId": "<string>",
"resolveNameOnConflict": true
}
'import requests
url = "https://mycluster.domino.tech/api/governance/v1/bundles"
payload = {
"name": "<string>",
"projectId": "<string>",
"additionalPolicyIds": ["<string>"],
"attachments": [{ "identifier": {} }],
"policyId": "<string>",
"resolveNameOnConflict": True
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
projectId: '<string>',
additionalPolicyIds: ['<string>'],
attachments: [{identifier: {}}],
policyId: '<string>',
resolveNameOnConflict: true
})
};
fetch('https://mycluster.domino.tech/api/governance/v1/bundles', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://mycluster.domino.tech/api/governance/v1/bundles",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'projectId' => '<string>',
'additionalPolicyIds' => [
'<string>'
],
'attachments' => [
[
'identifier' => [
]
]
],
'policyId' => '<string>',
'resolveNameOnConflict' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://mycluster.domino.tech/api/governance/v1/bundles"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"additionalPolicyIds\": [\n \"<string>\"\n ],\n \"attachments\": [\n {\n \"identifier\": {}\n }\n ],\n \"policyId\": \"<string>\",\n \"resolveNameOnConflict\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://mycluster.domino.tech/api/governance/v1/bundles")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"additionalPolicyIds\": [\n \"<string>\"\n ],\n \"attachments\": [\n {\n \"identifier\": {}\n }\n ],\n \"policyId\": \"<string>\",\n \"resolveNameOnConflict\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://mycluster.domino.tech/api/governance/v1/bundles")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"projectId\": \"<string>\",\n \"additionalPolicyIds\": [\n \"<string>\"\n ],\n \"attachments\": [\n {\n \"identifier\": {}\n }\n ],\n \"policyId\": \"<string>\",\n \"resolveNameOnConflict\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"state": "Active",
"attachments": [
{
"approvalTimelineMap": {},
"createdAt": "<string>",
"createdBy": {},
"id": "<string>",
"identifier": {},
"source": "AUTO",
"type": "ModelVersion"
}
],
"classificationValue": "<string>",
"commentsCount": 123,
"createdAt": "<string>",
"createdBy": {},
"currentStageInfo": {
"openFindingsCount": 123,
"pendingApprovalsCount": 123,
"status": "NotStarted"
},
"enforcedPolicyIds": [
"<string>"
],
"evidenceRestricted": true,
"gates": [
{
"approvals": [
{
"id": "<string>",
"name": "<string>",
"stageApprovalId": "<string>",
"status": "PendingSubmission"
}
],
"bundleId": "<string>",
"id": "<string>",
"isOpen": true,
"name": "<string>",
"policyGateId": "<string>",
"policyId": "<string>",
"policyVersionId": "<string>",
"reason": "<string>",
"resources": [
{
"action": "Deploy",
"failOpen": true,
"parameters": {}
}
]
}
],
"hasRevalidationSchedule": true,
"name": "<string>",
"policies": [
{
"allowProjectApprovers": true,
"bundleId": "<string>",
"classificationValue": "<string>",
"compliantToCurrentStage": true,
"createdAt": "<string>",
"deactivatedAt": "<string>",
"enforceSequentialOrder": true,
"hasRevalidationSchedule": true,
"isLatestVersion": true,
"isPolicyArchived": true,
"policyId": "<string>",
"policyName": "<string>",
"policyVersion": "<string>",
"policyVersionId": "<string>",
"stage": "<string>",
"stageAssignee": {
"id": "<string>",
"name": "<string>"
},
"upgradeRequired": true
}
],
"policyId": "<string>",
"policyName": "<string>",
"policyVersion": "<string>",
"policyVersionId": "<string>",
"projectId": "<string>",
"projectName": "<string>",
"projectOwner": "<string>",
"stage": "<string>",
"stageApprovals": [
{
"approvers": [
{
"editable": true,
"id": "<string>",
"name": "<string>",
"showByDefault": true,
"fromOrganizationUserId": "<string>",
"isOrganizationUser": true
}
],
"evidence": {
"artifacts": [
{
"artifactType": "input",
"details": {},
"id": "<string>",
"policyEntityId": "<string>",
"required": true,
"visibilityRule": "<string>",
"visible": true
}
],
"createdAt": "<string>",
"description": "<string>",
"externalId": "<string>",
"id": "<string>",
"name": "<string>",
"policyId": "<string>",
"policyVersionId": "<string>",
"scope": "Global",
"visible": true
},
"id": "<string>",
"name": "<string>",
"policyEntityId": "<string>",
"revalidationConfig": {
"openWindowDaysBefore": 2,
"recurring": {
"every": 2,
"unit": "month",
"startDate": "<string>"
},
"type": "absolute"
}
}
],
"stageAssignee": {
"id": "<string>",
"name": "<string>"
},
"stages": [
{
"assignedAt": "<string>",
"assignee": {
"id": "<string>",
"name": "<string>"
},
"bundleId": "<string>",
"stage": {
"approvals": [
{
"approvers": [
{
"editable": true,
"id": "<string>",
"name": "<string>",
"showByDefault": true,
"fromOrganizationUserId": "<string>",
"isOrganizationUser": true
}
],
"evidence": {
"artifacts": [
{
"artifactType": "input",
"details": {},
"id": "<string>",
"policyEntityId": "<string>",
"required": true,
"visibilityRule": "<string>",
"visible": true
}
],
"createdAt": "<string>",
"description": "<string>",
"externalId": "<string>",
"id": "<string>",
"name": "<string>",
"policyId": "<string>",
"policyVersionId": "<string>",
"scope": "Global",
"visible": true
},
"id": "<string>",
"name": "<string>",
"policyEntityId": "<string>",
"revalidationConfig": {
"openWindowDaysBefore": 2,
"recurring": {
"every": 2,
"unit": "month",
"startDate": "<string>"
},
"type": "absolute"
}
}
],
"evidenceSet": [
{
"artifacts": [
{
"artifactType": "input",
"details": {},
"id": "<string>",
"policyEntityId": "<string>",
"required": true,
"visibilityRule": "<string>",
"visible": true
}
],
"createdAt": "<string>",
"description": "<string>",
"externalId": "<string>",
"id": "<string>",
"name": "<string>",
"policyId": "<string>",
"policyVersionId": "<string>",
"scope": "Global",
"visible": true
}
],
"id": "<string>",
"name": "<string>",
"notifyOnTransition": true,
"policyEntityId": "<string>",
"policyVersionId": "<string>"
},
"stageId": "<string>"
}
]
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}{
"code": "BUNDLE_REQUIRES_POLICY",
"message": "<string>"
}