Founding keys are opena year free at 6,000 req/hour, for the first 1,000 developersClaim yours
Documentation 29

Azure DevOps quickstart · 3 min read

Keep azure-devops-node-api. Change one line.

The serverUrl is the organization URL, exactly like dev.azure.com — and the discovery contract the official SDKs route through (connectionData, resource areas, and the OPTIONS location service in both the per-area and the all-areas form) is served and verified against both of them, so your client just works.

01Point serverUrl at ado.
02Call it exactly as before
03Pin a snapshot for CI

01 / Base URL

The organization URL, provider paths.

Point your client at https://ado.sandboxapis.dev/olympus-labs. Paths mirror dev.azure.com — envelopes, TF-shaped errors, api-version negotiation and all. Graph/Identities answer on the auxiliary ado-vssps. host, resolved automatically via resource areas.

request.sh
curl "https://ado.sandboxapis.dev/olympus-labs/_apis/projects?api-version=7.1"

02 / Drop in your client

azure-devops-node-api works unmodified.

The only change is the serverUrl.

typescript
import * as azdev from "azure-devops-node-api";

const connection = new azdev.WebApi(
  "https://ado.sandboxapis.dev/olympus-labs",
  azdev.getPersonalAccessTokenHandler("any-token"),
);

const git = await connection.getGitApi();
const repos = await git.getRepositories();          // the org's repos
const prs = await git.getPullRequests("parthenon",  // pass the project too: the
  { status: 4 }, "olympus-labs");                   // project-less route 404s

const build = await connection.getBuildApi();
const builds = await build.getBuilds("olympus-labs"); // same run numbers as
                                                       // the GitLab/Bitbucket renderings

Both official SDKs are proved end to end rather than described: azure-devops-node-api and the Python azure-devops package each have their exact snippet executed against https://ado.sandboxapis.dev/olympus-labs by a script that checks the output, discovery handshake included — the two ask the location service differently, one area at a time and the whole catalogue at once, and both forms are served. Plain requests is verified alongside them, for a script that wants no dependency. Verified quickstarts →

03 / A real response

Live from the universe.

200 · application/json
{
  "id": "3ffe37f3-d0a3-4d49-95b3-d77d3294fc8b",
  "name": "parthenon",
  "url": "https://ado.sandboxapis.dev/olympus-labs/a2558cfa-3e94-49f8-992c-ec94ef0c47f2/_apis/git/repositories/3ffe37f3-d0a3-4d49-95b3-d77d3294fc8b",
  "project": {
    "id": "a2558cfa-3e94-49f8-992c-ec94ef0c47f2",
    "name": "olympus-labs",
    "url": "https://ado.sandboxapis.dev/olympus-labs/_apis/projects/a2558cfa-3e94-49f8-992c-ec94ef0c47f2",
    "state": "wellFormed",
    "revision": 11,
    "visibility": "private",
    "lastUpdateTime": "2026-04-26T17:20:00.8854655Z"
  },
  "defaultBranch": "refs/heads/main",
  "size": 305600,
  "remoteUrl": "https://ado.sandboxapis.dev/olympus-labs/olympus-labs/_git/parthenon",
  "sshUrl": "git@ssh.ado.sandboxapis.dev:v3/olympus-labs/olympus-labs/parthenon",
  "webUrl": "https://ado.sandboxapis.dev/olympus-labs/olympus-labs/_git/parthenon",
  "isDisabled": false,
  "isInMaintenance": false
}

04 / Pin a snapshot

Deterministic CI.

Same env-var swap, a *.snap. host — byte-identical on every request.

.env
# reproducible in CI
export AZDO_ORG_SERVICE_URL=https://ado-7-1.snap.sandboxapis.dev/olympus-labs

Tour the universe → · Coverage manifest → · Versioning & pinning →