> ## Documentation Index
> Fetch the complete documentation index at: https://cantonfoundation-generated-reference-full-stack-preview.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# POST /v2/package-vetting/update

> Update the vetted packages of this participant

<div class="x2mdx-ref-page x2mdx-ref-page--operation x2mdx-ref-page--manual-api" />

<div class="x2mdx-ref-hero">
  <p class="x2mdx-ref-summary">Update the vetted packages of this participant</p>

  <div class="x2mdx-ref-badges">
    <span class="x2mdx-ref-badge x2mdx-ref-badge--protocol">OpenAPI</span>

    <a class="x2mdx-ref-badge x2mdx-ref-badge--changed" href="#history-updated-3-5">Updated 3.5</a>
  </div>
</div>

<RequestExample>
  ```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
  curl --request POST \
    --url 'http://localhost:7575/v2/package-vetting/update' \
    --header 'Authorization: Bearer $TOKEN' \
    --header 'Content-Type: application/json' \
    --data '{
    "changes": [
      {
        "operation": {
          "Empty": {}
        }
      }
    ],
    "dryRun": false,
    "synchronizerId": "<string>",
    "expectedTopologySerial": {
      "serial": {
        "Empty": {}
      }
    },
    "updateVettedPackagesForceFlags": [
      "UPDATE_VETTED_PACKAGES_FORCE_FLAG_UNSPECIFIED"
    ]
  }'
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
  import json
  import requests

  url = "http://localhost:7575/v2/package-vetting/update"
  headers = {'Authorization': 'Bearer <token>', 'Content-Type': 'application/json'}
  payload = json.loads(r'''{
    "changes": [
      {
        "operation": {
          "Empty": {}
        }
      }
    ],
    "dryRun": false,
    "synchronizerId": "<string>",
    "expectedTopologySerial": {
      "serial": {
        "Empty": {}
      }
    },
    "updateVettedPackagesForceFlags": [
      "UPDATE_VETTED_PACKAGES_FORCE_FLAG_UNSPECIFIED"
    ]
  }''')
  response = requests.request(
      "POST", url, headers=headers, json=payload
  )

  print(response.text)
  ```

  ```javascript JavaScript theme={"theme":{"light":"github-light","dark":"github-dark"}}
  const response = await fetch('http://localhost:7575/v2/package-vetting/update', {
    method: 'POST',
    headers: {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
  },
    body: JSON.stringify({
    "changes": [
      {
        "operation": {
          "Empty": {}
        }
      }
    ],
    "dryRun": false,
    "synchronizerId": "<string>",
    "expectedTopologySerial": {
      "serial": {
        "Empty": {}
      }
    },
    "updateVettedPackagesForceFlags": [
      "UPDATE_VETTED_PACKAGES_FORCE_FLAG_UNSPECIFIED"
    ]
  }),
  });

  console.log(await response.text());
  ```

  ```php PHP theme={"theme":{"light":"github-light","dark":"github-dark"}}
  <?php
  $curl = curl_init();

  curl_setopt_array($curl, [
      CURLOPT_URL => 'http://localhost:7575/v2/package-vetting/update',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS => <<<'JSON'
  {
    "changes": [
      {
        "operation": {
          "Empty": {}
        }
      }
    ],
    "dryRun": false,
    "synchronizerId": "<string>",
    "expectedTopologySerial": {
      "serial": {
        "Empty": {}
      }
    },
    "updateVettedPackagesForceFlags": [
      "UPDATE_VETTED_PACKAGES_FORCE_FLAG_UNSPECIFIED"
    ]
  }
  JSON,
      CURLOPT_HTTPHEADER => [
          "Authorization: Bearer <token>",
          "Content-Type: application/json"
      ],
  ]);

  $response = curl_exec($curl);
  echo $response;
  ```

  ```go Go theme={"theme":{"light":"github-light","dark":"github-dark"}}
  package main

  import (
    "bytes"
    "fmt"
    "io"
    "net/http"
  )

  func main() {
    req, _ := http.NewRequest("POST", "http://localhost:7575/v2/package-vetting/update", bytes.NewBufferString(`{
    "changes": [
      {
        "operation": {
          "Empty": {}
        }
      }
    ],
    "dryRun": false,
    "synchronizerId": "<string>",
    "expectedTopologySerial": {
      "serial": {
        "Empty": {}
      }
    },
    "updateVettedPackagesForceFlags": [
      "UPDATE_VETTED_PACKAGES_FORCE_FLAG_UNSPECIFIED"
    ]
  }`))
    req.Header.Set("Authorization", "Bearer <token>")
    req.Header.Set("Content-Type", "application/json")
    response, _ := http.DefaultClient.Do(req)
    defer response.Body.Close()
    body, _ := io.ReadAll(response.Body)
    fmt.Println(string(body))
  }
  ```

  ```java Java theme={"theme":{"light":"github-light","dark":"github-dark"}}
  import java.net.URI;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;

  var request = HttpRequest.newBuilder()
      .uri(URI.create("http://localhost:7575/v2/package-vetting/update"))
      .header("Authorization", "Bearer <token>")
      .header("Content-Type", "application/json")
      .method("POST", HttpRequest.BodyPublishers.ofString("""
  {
    "changes": [
      {
        "operation": {
          "Empty": {}
        }
      }
    ],
    "dryRun": false,
    "synchronizerId": "<string>",
    "expectedTopologySerial": {
      "serial": {
        "Empty": {}
      }
    },
    "updateVettedPackagesForceFlags": [
      "UPDATE_VETTED_PACKAGES_FORCE_FLAG_UNSPECIFIED"
    ]
  }
  """))
      .build();
  var response = HttpClient.newHttpClient().send(
      request, HttpResponse.BodyHandlers.ofString());
  System.out.println(response.body());
  ```

  ```ruby Ruby theme={"theme":{"light":"github-light","dark":"github-dark"}}
  require 'net/http'
  require 'uri'

  uri = URI('http://localhost:7575/v2/package-vetting/update')
  request = Net::HTTP::Post.new(uri)
  request['Authorization'] = 'Bearer <token>'
  request['Content-Type'] = 'application/json'
  request.body = <<~JSON
  {
    "changes": [
      {
        "operation": {
          "Empty": {}
        }
      }
    ],
    "dryRun": false,
    "synchronizerId": "<string>",
    "expectedTopologySerial": {
      "serial": {
        "Empty": {}
      }
    },
    "updateVettedPackagesForceFlags": [
      "UPDATE_VETTED_PACKAGES_FORCE_FLAG_UNSPECIFIED"
    ]
  }
  JSON
  response = Net::HTTP.start(uri.hostname, uri.port) do |http|
    http.request(request)
  end
  puts response.body
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
  {
    "pastVettedPackages": {
      "packages": [
        {
          "packageId": "<string>",
          "validFromInclusive": "<string>",
          "validUntilExclusive": "<string>",
          "packageName": "<string>",
          "packageVersion": "<string>"
        }
      ],
      "participantId": "<string>",
      "synchronizerId": "<string>",
      "topologySerial": 123
    },
    "newVettedPackages": {
      "packages": [
        {
          "packageId": "<string>",
          "validFromInclusive": "<string>",
          "validUntilExclusive": "<string>",
          "packageName": "<string>",
          "packageVersion": "<string>"
        }
      ],
      "participantId": "<string>",
      "synchronizerId": "<string>",
      "topologySerial": 123
    }
  }
  ```

  ```text 400 theme={"theme":{"light":"github-light","dark":"github-dark"}}
  <string>
  ```

  ```json default theme={"theme":{"light":"github-light","dark":"github-dark"}}
  {
    "code": "<string>",
    "cause": "<string>",
    "correlationId": "<string>",
    "traceId": "<string>",
    "context": {},
    "resources": [
      [
        "<string>"
      ]
    ],
    "errorCategory": 123,
    "grpcCodeValue": 123,
    "retryInfo": "<string>",
    "definiteAnswer": false
  }
  ```
</ResponseExample>

## Authorizations

### httpAuth

<ParamField header="Authorization" type="string" required>
  HTTP bearer authentication. Send the token as `Authorization: Bearer &lt;token&gt;`. Ledger API standard JWT token
</ParamField>

### apiKeyAuth

<ParamField header="Sec-WebSocket-Protocol" type="string" required>
  API key authentication in the header. Ledger API standard JWT token (websocket)
</ParamField>

## Body

<div class="x2mdx-ref-badges">
  <span class="x2mdx-ref-badge x2mdx-ref-badge--neutral">application/json</span>
</div>

<ParamField body="changes" type="object[]" required>
  OpenAPI type: <code>VettedPackagesChange\[]</code>.

  Changes to apply to the current vetting state of the participant on the specified synchronizer. The changes are applied in order. Any package not changed will keep their previous vetting state. Required: must be non-empty

  <Expandable title="child attributes">
    <ParamField body="operation" type="object">
      OpenAPI type: <code>Operation</code>.

      Required

      <Expandable title="child attributes">
        <ParamField body="Variant 1" type="object">
          <Expandable title="child attributes">
            <ParamField body="Empty" type="object" required>
              OpenAPI type: <code>Empty5</code>.
            </ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="Variant 2" type="object">
          <Expandable title="child attributes">
            <ParamField body="Unvet" type="object" required>
              OpenAPI type: <code>Unvet</code>.

              Remove packages from the set of vetted packages

              <Expandable title="child attributes">
                <ParamField body="value" type="object" required>
                  OpenAPI type: <code>Unvet1</code>.

                  Remove packages from the set of vetted packages

                  <Expandable title="child attributes">
                    <ParamField body="packages" type="object[]" required>
                      OpenAPI type: <code>VettedPackagesRef\[]</code>.

                      Packages to be unvetted. If a reference in this list matches multiple packages, they are all unvetted. Required: must be non-empty

                      <Expandable title="child attributes">
                        <ParamField body="packageId" type="string">
                          Package's package id must be the same as this field. Optional
                        </ParamField>

                        <ParamField body="packageName" type="string">
                          Package's name must be the same as this field. Optional
                        </ParamField>

                        <ParamField body="packageVersion" type="string">
                          Package's version must be the same as this field. Optional
                        </ParamField>
                      </Expandable>
                    </ParamField>
                  </Expandable>
                </ParamField>
              </Expandable>
            </ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="Variant 3" type="object">
          <Expandable title="child attributes">
            <ParamField body="Vet" type="object" required>
              OpenAPI type: <code>Vet</code>.

              Set vetting bounds of a list of packages. Packages that were not previously vetted have their bounds added, previous vetting bounds are overwritten.

              <Expandable title="child attributes">
                <ParamField body="value" type="object" required>
                  OpenAPI type: <code>Vet1</code>.

                  Set vetting bounds of a list of packages. Packages that were not previously vetted have their bounds added, previous vetting bounds are overwritten.

                  <Expandable title="child attributes">
                    <ParamField body="packages" type="object[]" required>
                      OpenAPI type: <code>VettedPackagesRef\[]</code>.

                      Packages to be vetted. If a reference in this list matches more than one package, the change is considered ambiguous and the entire update request is rejected. In other words, every reference must match exactly one package. Required: must be non-empty

                      <Expandable title="child attributes">
                        <ParamField body="packageId" type="string">
                          Package's package id must be the same as this field. Optional
                        </ParamField>

                        <ParamField body="packageName" type="string">
                          Package's name must be the same as this field. Optional
                        </ParamField>

                        <ParamField body="packageVersion" type="string">
                          Package's version must be the same as this field. Optional
                        </ParamField>
                      </Expandable>
                    </ParamField>

                    <ParamField body="newValidFromInclusive" type="string">
                      The time from which these packages should be vetted, prior lower bounds are overwritten. Optional
                    </ParamField>

                    <ParamField body="newValidUntilExclusive" type="string">
                      The time until which these packages should be vetted, prior upper bounds are overwritten. Optional
                    </ParamField>
                  </Expandable>
                </ParamField>
              </Expandable>
            </ParamField>
          </Expandable>
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="dryRun" type="boolean">
  If dry\_run is true, then the changes are only prepared, but not applied. If a request would trigger an error when run (e.g. TOPOLOGY\_DEPENDENCIES\_NOT\_VETTED), it will also trigger an error when dry\_run. Use this flag to preview a change before applying it. Defaults to false. Optional
</ParamField>

<ParamField body="synchronizerId" type="string">
  If set, the requested changes will take place on the specified synchronizer. If synchronizer\_id is unset and the participant is only connected to a single synchronizer, that synchronizer will be used by default. If synchronizer\_id is unset and the participant is connected to multiple synchronizers, the request will error out with PACKAGE\_SERVICE\_CANNOT\_AUTODETECT\_SYNCHRONIZER. Optional
</ParamField>

<ParamField body="expectedTopologySerial" type="object">
  OpenAPI type: <code>PriorTopologySerial</code>.

  The serial of last `VettedPackages` topology transaction on a given participant and synchronizer.

  <Expandable title="child attributes">
    <ParamField body="serial" type="object">
      OpenAPI type: <code>Serial</code>.

      Optional

      <Expandable title="child attributes">
        <ParamField body="Variant 1" type="object">
          <Expandable title="child attributes">
            <ParamField body="Empty" type="object" required>
              OpenAPI type: <code>Empty6</code>.
            </ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="Variant 2" type="object">
          <Expandable title="child attributes">
            <ParamField body="NoPrior" type="object" required>
              OpenAPI type: <code>NoPrior</code>.
            </ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="Variant 3" type="object">
          <Expandable title="child attributes">
            <ParamField body="Prior" type="object" required>
              OpenAPI type: <code>Prior</code>.

              <Expandable title="child attributes">
                <ParamField body="value" type="number" required>
                  OpenAPI type: <code>integer (int32)</code>.
                </ParamField>
              </Expandable>
            </ParamField>
          </Expandable>
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="updateVettedPackagesForceFlags" type="string[]">
  Controls whether potentially unsafe vetting updates are allowed. Optional: can be empty
</ParamField>

## Responses

### 200

<div class="x2mdx-ref-badges">
  <span class="x2mdx-ref-badge x2mdx-ref-badge--neutral">application/json</span>
</div>

<ResponseField name="pastVettedPackages" type="VettedPackages">
  The list of packages vetted on a given participant and synchronizer, modelled after `VettedPackages` in `topology.proto &lt;https://github.com/digital-asset/canton/blob/main/community/base/src/main/protobuf/com/digitalasset/canton/protocol/v30/topology.proto#L206&gt;`\_. The list only contains packages that matched a filter in the query that originated it.

  <Expandable title="child attributes">
    <ResponseField name="packages" type="VettedPackage[]" required>
      Sorted by package\_name and package\_version where known, and package\_id as a last resort. Required: must be non-empty

      <Expandable title="child attributes">
        <ResponseField name="packageId" type="string" required>
          Package ID of this package Required
        </ResponseField>

        <ResponseField name="validFromInclusive" type="string">
          The time from which this package is vetted. Empty if vetting time has no lower bound. Optional
        </ResponseField>

        <ResponseField name="validUntilExclusive" type="string">
          The time until which this package is vetted. Empty if vetting time has no upper bound. Optional
        </ResponseField>

        <ResponseField name="packageName" type="string">
          Name of this package. Only available if the package has been uploaded to the current participant. Optional
        </ResponseField>

        <ResponseField name="packageVersion" type="string">
          Version of this package. Only available if the package has been uploaded to the current participant. Optional
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="participantId" type="string" required>
      Participant on which these packages are vetted. Required
    </ResponseField>

    <ResponseField name="synchronizerId" type="string" required>
      Synchronizer on which these packages are vetted. Required
    </ResponseField>

    <ResponseField name="topologySerial" type="integer (int32)" required>
      Serial of last `VettedPackages` topology transaction of this participant and on this synchronizer. Required
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="newVettedPackages" type="VettedPackages" required>
  The list of packages vetted on a given participant and synchronizer, modelled after `VettedPackages` in `topology.proto &lt;https://github.com/digital-asset/canton/blob/main/community/base/src/main/protobuf/com/digitalasset/canton/protocol/v30/topology.proto#L206&gt;`\_. The list only contains packages that matched a filter in the query that originated it.

  <Expandable title="child attributes">
    <ResponseField name="packages" type="VettedPackage[]" required>
      Sorted by package\_name and package\_version where known, and package\_id as a last resort. Required: must be non-empty

      <Expandable title="child attributes">
        <ResponseField name="packageId" type="string" required>
          Package ID of this package Required
        </ResponseField>

        <ResponseField name="validFromInclusive" type="string">
          The time from which this package is vetted. Empty if vetting time has no lower bound. Optional
        </ResponseField>

        <ResponseField name="validUntilExclusive" type="string">
          The time until which this package is vetted. Empty if vetting time has no upper bound. Optional
        </ResponseField>

        <ResponseField name="packageName" type="string">
          Name of this package. Only available if the package has been uploaded to the current participant. Optional
        </ResponseField>

        <ResponseField name="packageVersion" type="string">
          Version of this package. Only available if the package has been uploaded to the current participant. Optional
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="participantId" type="string" required>
      Participant on which these packages are vetted. Required
    </ResponseField>

    <ResponseField name="synchronizerId" type="string" required>
      Synchronizer on which these packages are vetted. Required
    </ResponseField>

    <ResponseField name="topologySerial" type="integer (int32)" required>
      Serial of last `VettedPackages` topology transaction of this participant and on this synchronizer. Required
    </ResponseField>
  </Expandable>
</ResponseField>

### 400

Invalid value, Invalid value for: body

<div class="x2mdx-ref-badges">
  <span class="x2mdx-ref-badge x2mdx-ref-badge--neutral">text/plain</span>
</div>

<ResponseField name="value" type="string" required />

### default

<div class="x2mdx-ref-badges">
  <span class="x2mdx-ref-badge x2mdx-ref-badge--neutral">application/json</span>
</div>

<ResponseField name="code" type="string" required />

<ResponseField name="cause" type="string" required />

<ResponseField name="correlationId" type="string" />

<ResponseField name="traceId" type="string" />

<ResponseField name="context" type="Map_String" required />

<ResponseField name="resources" type="Tuple2_String_String[]" />

<ResponseField name="errorCategory" type="integer (int32)" required />

<ResponseField name="grpcCodeValue" type="integer (int32)" />

<ResponseField name="retryInfo" type="string" />

<ResponseField name="definiteAnswer" type="boolean" />

## History

<div class="x2mdx-ref-history" aria-label="Reference history">
  <div class="x2mdx-ref-history-event x2mdx-ref-history-event--changed" id="history-updated-3-5">
    <div class="x2mdx-ref-history-event-head">
      <span class="x2mdx-ref-history-event-label">Updated</span>
      <code class="x2mdx-ref-history-event-version">3.5</code>
    </div>

    <p class="x2mdx-ref-history-event-detail">The POST /v2/package-vetting/update operation changed in this snapshot.</p>
  </div>
</div>
