Versioning service#

This is the external-facing portion of VersioningService which gives clients access to functionality that doesn’t create new commits. The creation of new commits should be done via the resource-specific services.

OpenAPI file: VersioningService.json

Endpoints#

Create branch#

POST /scout/v1/versioning/{resourceRid}/branch

Creates a mutable pointer to the provided commit. “Saves”/”commits” can be performed on this pointer. Throws if the name is already used as a commit pointer for this resource. Throws if the provided commit doesn’t exist.

Path parameters

resourceRid string (RID) required

​

Body

existingCommit string required

​

branchName string required

​

Response

rid string (RID)

​

name string

​

resourceRid string (RID)

​

commit string

​

createdBy string (RID)

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

Request

curl -X POST "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "existingCommit": "<commit id>",
  "branchName": "<branch name>"
}'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch",
    headers={"Authorization": "Bearer <api key>"},
    json={"existingCommit": "<commit id>", "branchName": "<branch name>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch",
    headers={"Authorization": "Bearer <api key>"},
    json={"existingCommit": "<commit id>", "branchName": "<branch name>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch",
            headers={"Authorization": "Bearer <api key>"},
            json={"existingCommit": "<commit id>", "branchName": "<branch name>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "rid": "<branch rid>",
  "name": "<branch name>",
  "resourceRid": "<resource rid>",
  "commit": "<commit id>",
  "createdBy": "<user rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z"
}

Get branches#

GET /scout/v1/versioning/{resourceRid}/branch

Returns all branches for the resource in order of most recently updated.

Path parameters

resourceRid string (RID) required

​

Response

The body is an array of Branch.

Fields of Branch
rid string (RID)

​

name string

​

resourceRid string (RID)

​

commit string

​

createdBy string (RID)

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

[
  {
    "rid": "<branch rid>",
    "name": "<branch name>",
    "resourceRid": "<resource rid>",
    "commit": "<commit id>",
    "createdBy": "<user rid>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedAt": "2026-01-01T00:00:00Z"
  }
]

Create tag#

POST /scout/v1/versioning/{resourceRid}/tag

Creates an immutable pointer to the provided commit. Throws if the name is already used as a commit pointer for this resource. Throws if the provided commit doesn’t exist.

Path parameters

resourceRid string (RID) required

​

Body

existingCommit string required

​

tagName string required

​

Response

rid string (RID)

​

name string

​

resourceRid string (RID)

​

commit string

​

createdBy string (RID)

​

createdAt string (date-time)

​

Request

curl -X POST "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "existingCommit": "<commit id>",
  "tagName": "<tag name>"
}'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag",
    headers={"Authorization": "Bearer <api key>"},
    json={"existingCommit": "<commit id>", "tagName": "<tag name>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag",
    headers={"Authorization": "Bearer <api key>"},
    json={"existingCommit": "<commit id>", "tagName": "<tag name>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag",
            headers={"Authorization": "Bearer <api key>"},
            json={"existingCommit": "<commit id>", "tagName": "<tag name>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "rid": "<tag rid>",
  "name": "<tag name>",
  "resourceRid": "<resource rid>",
  "commit": "<commit id>",
  "createdBy": "<user rid>",
  "createdAt": "2026-01-01T00:00:00Z"
}

Get tags by resource#

GET /scout/v1/versioning/{resourceRid}/tag

Returns all tags for the resource in order of most recently created.

Path parameters

resourceRid string (RID) required

​

Response

The body is an array of Tag.

Fields of Tag
rid string (RID)

​

name string

​

resourceRid string (RID)

​

commit string

​

createdBy string (RID)

​

createdAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

[
  {
    "rid": "<tag rid>",
    "name": "<tag name>",
    "resourceRid": "<resource rid>",
    "commit": "<commit id>",
    "createdBy": "<user rid>",
    "createdAt": "2026-01-01T00:00:00Z"
  }
]

Get commit#

GET /scout/v1/versioning/{resourceRid}/commit/{commitId}

Throws if the commit doesn’t exist.

Path parameters

resourceRid string (RID) required

​

commitId string required

​

Response

id string

​

resourceRid string (RID)

​

parentCommit string

​

mergeParentCommit string

​

message string

​

isWorkingState boolean

A working state commit is created via the saveWorkingState endpoint and is non-permanent. In the future, it may be compacted and not exist.

committedBy string (RID)

​

committedAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/<commit id>" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/<commit id>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/<commit id>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/<commit id>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "id": "<commit id>",
  "resourceRid": "<resource rid>",
  "parentCommit": "<commit id>",
  "mergeParentCommit": "<commit id>",
  "message": "<message>",
  "isWorkingState": true,
  "committedBy": "<user rid>",
  "committedAt": "2026-01-01T00:00:00Z"
}

Batch get commits#

POST /scout/v1/versioning/commit/batch-get

Filters out resources that are not authorized.

Body

The body is an array of ResourceAndCommitId.

Fields of ResourceAndCommitId
resourceRid string (RID) required

​

commitId string required

​

Response

The body is an array of Commit.

Fields of Commit
id string

​

resourceRid string (RID)

​

parentCommit string

​

mergeParentCommit string

​

message string

​

isWorkingState boolean

A working state commit is created via the saveWorkingState endpoint and is non-permanent. In the future, it may be compacted and not exist.

committedBy string (RID)

​

committedAt string (date-time)

​

Request

curl -X POST "https://api.gov.nominal.io/api/scout/v1/versioning/commit/batch-get" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '[
  {
    "resourceRid": "<resource rid>",
    "commitId": "<commit id>"
  }
]'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/commit/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/commit/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/versioning/commit/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

[
  {
    "id": "<commit id>",
    "resourceRid": "<resource rid>",
    "parentCommit": "<commit id>",
    "mergeParentCommit": "<commit id>",
    "message": "<message>",
    "isWorkingState": true,
    "committedBy": "<user rid>",
    "committedAt": "2026-01-01T00:00:00Z"
  }
]

Get commit by branch#

GET /scout/v1/versioning/{resourceRid}/branch/{branchName}/commit

Returns the commit pointed to by the branch. Throws if the branch doesn’t exist.

Path parameters

resourceRid string (RID) required

​

branchName string required

​

Response

id string

​

resourceRid string (RID)

​

parentCommit string

​

mergeParentCommit string

​

message string

​

isWorkingState boolean

A working state commit is created via the saveWorkingState endpoint and is non-permanent. In the future, it may be compacted and not exist.

committedBy string (RID)

​

committedAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>/commit" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>/commit",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>/commit",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>/commit",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "id": "<commit id>",
  "resourceRid": "<resource rid>",
  "parentCommit": "<commit id>",
  "mergeParentCommit": "<commit id>",
  "message": "<message>",
  "isWorkingState": true,
  "committedBy": "<user rid>",
  "committedAt": "2026-01-01T00:00:00Z"
}

Get commit by tag#

GET /scout/v1/versioning/{resourceRid}/tag/{tagName}/commit

Returns the commit pointed to by the tag. Throws if the tag doesn’t exist.

Path parameters

resourceRid string (RID) required

​

tagName string required

​

Response

id string

​

resourceRid string (RID)

​

parentCommit string

​

mergeParentCommit string

​

message string

​

isWorkingState boolean

A working state commit is created via the saveWorkingState endpoint and is non-permanent. In the future, it may be compacted and not exist.

committedBy string (RID)

​

committedAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>/commit" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>/commit",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>/commit",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>/commit",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "id": "<commit id>",
  "resourceRid": "<resource rid>",
  "parentCommit": "<commit id>",
  "mergeParentCommit": "<commit id>",
  "message": "<message>",
  "isWorkingState": true,
  "committedBy": "<user rid>",
  "committedAt": "2026-01-01T00:00:00Z"
}

Get least common ancestor#

POST /scout/v1/versioning/{resourceRid}/commit/least-common-ancestor

Returns the least common ancestor of the two commits. Throws if either commit doesn’t exist.

Path parameters

resourceRid string (RID) required

​

Body

commit1 string required

​

commit2 string required

​

Response

The body is a string.

Request

curl -X POST "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/least-common-ancestor" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "commit1": "<commit id>",
  "commit2": "<commit id>"
}'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/least-common-ancestor",
    headers={"Authorization": "Bearer <api key>"},
    json={"commit1": "<commit id>", "commit2": "<commit id>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/least-common-ancestor",
    headers={"Authorization": "Bearer <api key>"},
    json={"commit1": "<commit id>", "commit2": "<commit id>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/least-common-ancestor",
            headers={"Authorization": "Bearer <api key>"},
            json={"commit1": "<commit id>", "commit2": "<commit id>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

"<commit id>"

Get commit history#

GET /scout/v1/versioning/{resourceRid}/commit/{commitId}/history

Returns the commit history sorted by creation time descending. Excludes working state commits unless includeWorkingState is true. Throws if the commit doesn’t exist.

Path parameters

resourceRid string (RID) required

​

commitId string required

​

Query parameters

pageSize integer

Defaults to 100, throws if larger than 1000.

nextPageToken string

​

includeWorkingState boolean

When true, include working-state (compactible) commits in the history. Defaults to false. Working-state commits may later be compacted and cease to exist.

Response

history array of Commit

​

Fields of Commit
id string

​

resourceRid string (RID)

​

parentCommit string

​

mergeParentCommit string

​

message string

​

isWorkingState boolean

A working state commit is created via the saveWorkingState endpoint and is non-permanent. In the future, it may be compacted and not exist.

committedBy string (RID)

​

committedAt string (date-time)

​

nextPageToken string

​

Request

curl "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/<commit id>/history" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/<commit id>/history",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/<commit id>/history",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/commit/<commit id>/history",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "history": [
    {
      "id": "<commit id>",
      "resourceRid": "<resource rid>",
      "parentCommit": "<commit id>",
      "mergeParentCommit": "<commit id>",
      "message": "<message>",
      "isWorkingState": true,
      "committedBy": "<user rid>",
      "committedAt": "2026-01-01T00:00:00Z"
    }
  ],
  "nextPageToken": "<token>"
}

Persist commits#

POST /scout/v1/versioning/commit/persist

Persists the commits so that they are not compacted. This operation is atomic - either all commits are persisted or none are (in the case of an error).

Body

The body is an array of ResourceAndCommitId.

Fields of ResourceAndCommitId
resourceRid string (RID) required

​

commitId string required

​

Response

No content (HTTP 204).

Request

curl -X POST "https://api.gov.nominal.io/api/scout/v1/versioning/commit/persist" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '[
  {
    "resourceRid": "<resource rid>",
    "commitId": "<commit id>"
  }
]'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/commit/persist",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
)
response.raise_for_status()
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/commit/persist",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
)
response.raise_for_status()
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/versioning/commit/persist",
            headers={"Authorization": "Bearer <api key>"},
            json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
        ) as response:
            response.raise_for_status()


asyncio.run(main())

Response: 204

No content.

Get branch#

GET /scout/v1/versioning/{resourceRid}/branch/{branchName}

Throws if the branch doesn’t exist.

Path parameters

resourceRid string (RID) required

​

branchName string required

​

Response

rid string (RID)

​

name string

​

resourceRid string (RID)

​

commit string

​

createdBy string (RID)

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "rid": "<branch rid>",
  "name": "<branch name>",
  "resourceRid": "<resource rid>",
  "commit": "<commit id>",
  "createdBy": "<user rid>",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z"
}

Delete branch#

DELETE /scout/v1/versioning/{resourceRid}/branch/{branchName}

Deletes the branch pointer. Throws if the branch doesn’t exist. Throws if you attempt to delete the “main” branch.

Path parameters

resourceRid string (RID) required

​

branchName string required

​

Response

No content (HTTP 204).

Request

curl -X DELETE "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.delete(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx

response = httpx.delete(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.delete(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/branch/<branch name>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()


asyncio.run(main())

Response: 204

No content.

Batch get branches#

POST /scout/v1/versioning/branch/batch-get

Omits branches that are not authorized.

Body

The body is an array of ResourceAndBranchName.

Fields of ResourceAndBranchName
resourceRid string (RID) required

​

branchName string required

​

Response

The body is an array of Branch.

Fields of Branch
rid string (RID)

​

name string

​

resourceRid string (RID)

​

commit string

​

createdBy string (RID)

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

Request

curl -X POST "https://api.gov.nominal.io/api/scout/v1/versioning/branch/batch-get" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '[
  {
    "resourceRid": "<resource rid>",
    "branchName": "<branch name>"
  }
]'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/branch/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "branchName": "<branch name>"}],
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/branch/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "branchName": "<branch name>"}],
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/versioning/branch/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json=[{"resourceRid": "<resource rid>", "branchName": "<branch name>"}],
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

[
  {
    "rid": "<branch rid>",
    "name": "<branch name>",
    "resourceRid": "<resource rid>",
    "commit": "<commit id>",
    "createdBy": "<user rid>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedAt": "2026-01-01T00:00:00Z"
  }
]

Get tag#

GET /scout/v1/versioning/{resourceRid}/tag/{tagName}

Throws if the tag doesn’t exist.

Path parameters

resourceRid string (RID) required

​

tagName string required

​

Response

rid string (RID)

​

name string

​

resourceRid string (RID)

​

commit string

​

createdBy string (RID)

​

createdAt string (date-time)

​

Request

curl "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{
  "rid": "<tag rid>",
  "name": "<tag name>",
  "resourceRid": "<resource rid>",
  "commit": "<commit id>",
  "createdBy": "<user rid>",
  "createdAt": "2026-01-01T00:00:00Z"
}

Delete tag#

DELETE /scout/v1/versioning/{resourceRid}/tag/{tagName}

Deletes the tag pointer. Throws if the tag doesn’t exist.

Path parameters

resourceRid string (RID) required

​

tagName string required

​

Response

No content (HTTP 204).

Request

curl -X DELETE "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>" \
  -H "Authorization: Bearer <api key>"
import requests

response = requests.delete(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx

response = httpx.delete(
    "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.delete(
            "https://api.gov.nominal.io/api/scout/v1/versioning/<resource rid>/tag/<tag name>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()


asyncio.run(main())

Response: 204

No content.

Batch get tags#

POST /scout/v1/versioning/tag/batch-get

Omits tags that are not authorized.

Body

The body is an array of ResourceAndCommitId.

Fields of ResourceAndCommitId
resourceRid string (RID) required

​

commitId string required

​

Response

The body is an array of Tag.

Fields of Tag
rid string (RID)

​

name string

​

resourceRid string (RID)

​

commit string

​

createdBy string (RID)

​

createdAt string (date-time)

​

Request

curl -X POST "https://api.gov.nominal.io/api/scout/v1/versioning/tag/batch-get" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '[
  {
    "resourceRid": "<resource rid>",
    "commitId": "<commit id>"
  }
]'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/tag/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
)
response.raise_for_status()
print(response.json())
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/tag/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
)
response.raise_for_status()
print(response.json())
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/versioning/tag/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json=[{"resourceRid": "<resource rid>", "commitId": "<commit id>"}],
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

[
  {
    "rid": "<tag rid>",
    "name": "<tag name>",
    "resourceRid": "<resource rid>",
    "commit": "<commit id>",
    "createdBy": "<user rid>",
    "createdAt": "2026-01-01T00:00:00Z"
  }
]

Delete branches#

POST /scout/v1/versioning/branch/batch-delete

Deletes the branch pointers. Throws if any resource or branch is non-existent or unauthorized. Throws if any attempt is made to delete “main”.

Body

The body is an array of ResourceAndBranchName.

Fields of ResourceAndBranchName
resourceRid string (RID) required

​

branchName string required

​

Response

No content (HTTP 204).

Request

curl -X POST "https://api.gov.nominal.io/api/scout/v1/versioning/branch/batch-delete" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '[
  {
    "resourceRid": "<resource rid>",
    "branchName": "<branch name>"
  }
]'
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/branch/batch-delete",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "branchName": "<branch name>"}],
)
response.raise_for_status()
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/versioning/branch/batch-delete",
    headers={"Authorization": "Bearer <api key>"},
    json=[{"resourceRid": "<resource rid>", "branchName": "<branch name>"}],
)
response.raise_for_status()
import asyncio

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/versioning/branch/batch-delete",
            headers={"Authorization": "Bearer <api key>"},
            json=[{"resourceRid": "<resource rid>", "branchName": "<branch name>"}],
        ) as response:
            response.raise_for_status()


asyncio.run(main())

Response: 204

No content.

Errors#

Errors shows how these errors are sent.

Each error’s errorName is Scout: followed by its name below.

Status

Name

Notes

400

DeleteMainBranch

400

HistoryPageSizeTooLarge

404

BranchNotFound

404

CommitNotFound

404

CommitsNotFound

404

ResourceNotFound

404

ResourcesNotFound

404

TagNotFound

409

CommitConflict

409

CommitIdExists

409

CommitPointerNameConflict

409

ResourceAlreadyVersioned

Types#

Branch#

rid string (RID) required

​

name string required

​

resourceRid string (RID) required

​

commit string required

​

createdBy string (RID) required

​

createdAt string (date-time) required

​

updatedAt string (date-time) required

​

Commit#

id string required

​

resourceRid string (RID) required

​

parentCommit string

​

mergeParentCommit string

​

message string required

​

isWorkingState boolean required

A working state commit is created via the saveWorkingState endpoint and is non-permanent. In the future, it may be compacted and not exist.

committedBy string (RID) required

​

committedAt string (date-time) required

​

ResourceAndBranchName#

resourceRid string (RID) required

​

branchName string required

​

ResourceAndCommitId#

resourceRid string (RID) required

​

commitId string required

​

Tag#

rid string (RID) required

​

name string required

​

resourceRid string (RID) required

​

commit string required

​

createdBy string (RID) required

​

createdAt string (date-time) required

​

Page design based on Scalar, MIT License.