> ## 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 /v0/history/bulk/updates

> **Under Development, do not use in production yet** Get download URLs and metadata for update history objects available for bulk download, between two record times. Note that the returned objects may include also updates outside of the requested record time range (since only full objects are served from storage), but guaranteed to include all updates in the requested range.

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

<div class="x2mdx-ref-hero">
  <p class="x2mdx-ref-summary">**Under Development, do not use in production yet** Get download URLs and metadata for update history objects available for bulk download, between two record times. Note that the returned objects may include also updates outside of the requested record time range (since only full objects are served from storage), but guaranteed to include all updates in the requested range.</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--added" href="#history-added-0-5-18">Added 0.5.18</a>
  </div>
</div>

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/history/bulk/updates' \
    --header 'Content-Type: application/json' \
    --data '{
    "start_record_time": "2026-01-01T00:00:00Z",
    "end_record_time": "2026-01-01T00:00:00Z",
    "next_page_token": "<string>",
    "page_size": 123
  }'
  ```

  ```python Python theme={null}
  import json
  import requests

  url = "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/history/bulk/updates"
  headers = {'Content-Type': 'application/json'}
  payload = json.loads(r'''{
    "start_record_time": "2026-01-01T00:00:00Z",
    "end_record_time": "2026-01-01T00:00:00Z",
    "next_page_token": "<string>",
    "page_size": 123
  }''')
  response = requests.request(
      "POST", url, headers=headers, json=payload
  )

  print(response.text)
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/history/bulk/updates', {
    method: 'POST',
    headers: {
    "Content-Type": "application/json"
  },
    body: JSON.stringify({
    "start_record_time": "2026-01-01T00:00:00Z",
    "end_record_time": "2026-01-01T00:00:00Z",
    "next_page_token": "<string>",
    "page_size": 123
  }),
  });

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

  ```php PHP theme={null}
  <?php
  $curl = curl_init();

  curl_setopt_array($curl, [
      CURLOPT_URL => 'https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/history/bulk/updates',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_POSTFIELDS => <<<'JSON'
  {
    "start_record_time": "2026-01-01T00:00:00Z",
    "end_record_time": "2026-01-01T00:00:00Z",
    "next_page_token": "<string>",
    "page_size": 123
  }
  JSON,
      CURLOPT_HTTPHEADER => [
          "Content-Type: application/json"
      ],
  ]);

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

  ```go Go theme={null}
  package main

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

  func main() {
    req, _ := http.NewRequest("POST", "https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/history/bulk/updates", bytes.NewBufferString(`{
    "start_record_time": "2026-01-01T00:00:00Z",
    "end_record_time": "2026-01-01T00:00:00Z",
    "next_page_token": "<string>",
    "page_size": 123
  }`))
    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={null}
  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("https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/history/bulk/updates"))
      .header("Content-Type", "application/json")
      .method("POST", HttpRequest.BodyPublishers.ofString("""
  {
    "start_record_time": "2026-01-01T00:00:00Z",
    "end_record_time": "2026-01-01T00:00:00Z",
    "next_page_token": "<string>",
    "page_size": 123
  }
  """))
      .build();
  var response = HttpClient.newHttpClient().send(
      request, HttpResponse.BodyHandlers.ofString());
  System.out.println(response.body());
  ```

  ```ruby Ruby theme={null}
  require 'net/http'
  require 'uri'

  uri = URI('https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/history/bulk/updates')
  request = Net::HTTP::Post.new(uri)
  request['Content-Type'] = 'application/json'
  request.body = <<~JSON
  {
    "start_record_time": "2026-01-01T00:00:00Z",
    "end_record_time": "2026-01-01T00:00:00Z",
    "next_page_token": "<string>",
    "page_size": 123
  }
  JSON
  response = Net::HTTP.start(uri.hostname, uri.port) do |http|
    http.request(request)
  end
  puts response.body
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "object_refs": [
      {
        "url": "<string>",
        "digest": "<string>"
      }
    ],
    "next_page_token": "<string>"
  }
  ```

  ```json 400 theme={null}
  {
    "error": "<string>"
  }
  ```

  ```json 404 theme={null}
  {
    "error": "<string>"
  }
  ```

  ```json 501 theme={null}
  {
    "error": "<string>"
  }
  ```
</ResponseExample>

## Body

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

<ParamField body="start_record_time" type="string" required>
  OpenAPI type: <code>string (date-time)</code>.

  The returned objects must include all updates with record time greater than start\_record\_time (but may also include updates before it).
</ParamField>

<ParamField body="end_record_time" type="string" required>
  OpenAPI type: <code>string (date-time)</code>.

  The returned objects must include all updates with record time at most end\_record\_time (but may also include updates after it).
</ParamField>

<ParamField body="next_page_token" type="string">
  The pagination token returned from a previous call to this endpoint with the same arguments.
</ParamField>

<ParamField body="page_size" type="number" required>
  OpenAPI type: <code>integer (int32)</code>.

  The maximum number of objects returned for this request.

  Minimum: 1; Maximum: 1000.
</ParamField>

## Responses

### 200

ok

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

<ResponseField name="object_refs" type="BulkStorageObjectRef[]" required>
  The list of references to the bulk storage objects containing the updates.

  <Expandable title="child attributes">
    <ResponseField name="url" type="string" required>
      The URL from which the bulk storage object can be downloaded.
    </ResponseField>

    <ResponseField name="digest" type="string" required>
      The sha256 digest of the bulk storage object, for verification of integrity and consistency across SVs.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="next_page_token" type="string">
  When requesting the next page of results, pass this as `after` to the next `ListBulkUpdateHistoryObjectsRequest` invocation. Will be absent when there are no more pages.
</ResponseField>

### 400

not found

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

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

### 404

not found

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

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

### 501

not implemented

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

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

## History

<div class="x2mdx-ref-history" aria-label="Reference history">
  <div class="x2mdx-ref-history-event x2mdx-ref-history-event--introduced" id="history-added-0-5-18">
    <div class="x2mdx-ref-history-event-head">
      <span class="x2mdx-ref-history-event-label">Added</span>
      <code class="x2mdx-ref-history-event-version">0.5.18</code>
    </div>
  </div>
</div>
