[
    {
        "path": "/_apis/wit/wiql",
        "method": "POST",
        "description": "Run a WIQL query to search for work items (read-only, use ado_query)",
        "params": "query (WIQL string)"
    },
    {
        "path": "/_apis/wit/workitems/{id}",
        "method": "GET",
        "description": "Get a single work item by ID",
        "params": "$expand, fields, asOf"
    },
    {
        "path": "/_apis/wit/workitems?ids={ids}",
        "method": "GET",
        "description": "Get multiple work items by IDs (comma-separated)",
        "params": "ids, fields, $expand, asOf"
    },
    {
        "path": "/{project}/_apis/wit/workitems/${type}",
        "method": "POST",
        "description": "Create a new work item of the given type (Bug, Task, User Story, etc.)",
        "params": "JSON Patch array: [{op, path, value}] for fields like /fields/System.Title"
    },
    {
        "path": "/_apis/wit/workitems/{id}",
        "method": "PATCH",
        "description": "Update an existing work item (change title, state, assigned to, etc.)",
        "params": "JSON Patch array: [{op: replace, path: /fields/System.Title, value: ...}]"
    },
    {
        "path": "/_apis/wit/workitems/{id}",
        "method": "DELETE",
        "description": "Delete a work item (moves to recycle bin)",
        "params": "destroy (boolean, permanently delete)"
    },
    {
        "path": "/{project}/_apis/wit/workitemtypes",
        "method": "GET",
        "description": "List all work item types available in a project (Bug, Task, Epic, User Story, etc.)",
        "params": ""
    },
    {
        "path": "/_apis/git/repositories",
        "method": "GET",
        "description": "List all Git repositories in the organization or project",
        "params": "project (optional path prefix: /{project}/_apis/git/repositories)"
    },
    {
        "path": "/_apis/git/repositories/{repositoryId}",
        "method": "GET",
        "description": "Get a specific Git repository by ID or name",
        "params": ""
    },
    {
        "path": "/_apis/git/repositories/{repositoryId}/refs",
        "method": "GET",
        "description": "List branches and tags for a repository",
        "params": "filter (e.g. heads/ for branches only), $top"
    },
    {
        "path": "/_apis/git/repositories/{repositoryId}/commits",
        "method": "GET",
        "description": "List commits for a repository",
        "params": "searchCriteria.itemVersion.version (branch), $top, searchCriteria.fromDate, searchCriteria.toDate"
    },
    {
        "path": "/_apis/git/repositories/{repositoryId}/pullrequests",
        "method": "GET",
        "description": "List pull requests for a repository",
        "params": "searchCriteria.status (active/completed/abandoned), searchCriteria.creatorId, $top"
    },
    {
        "path": "/_apis/git/repositories/{repositoryId}/pullrequests",
        "method": "POST",
        "description": "Create a new pull request",
        "params": "sourceRefName, targetRefName, title, description"
    },
    {
        "path": "/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}",
        "method": "GET",
        "description": "Get a specific pull request by ID",
        "params": ""
    },
    {
        "path": "/_apis/git/repositories/{repositoryId}/pullrequests/{pullRequestId}",
        "method": "PATCH",
        "description": "Update a pull request (change title, description, status, auto-complete)",
        "params": "title, description, status (active/abandoned/completed), autoCompleteSetBy"
    },
    {
        "path": "/_apis/build/builds",
        "method": "GET",
        "description": "List builds (pipeline runs)",
        "params": "definitions (pipeline ID), statusFilter, resultFilter, $top, branchName"
    },
    {
        "path": "/_apis/build/builds",
        "method": "POST",
        "description": "Queue a new build (trigger a pipeline)",
        "params": "definition.id, sourceBranch, parameters"
    },
    {
        "path": "/_apis/build/builds/{buildId}",
        "method": "GET",
        "description": "Get a specific build by ID",
        "params": ""
    },
    {
        "path": "/_apis/pipelines",
        "method": "GET",
        "description": "List pipelines (definitions)",
        "params": "$top, orderBy"
    },
    {
        "path": "/_apis/pipelines/{pipelineId}/runs",
        "method": "POST",
        "description": "Run a pipeline",
        "params": "resources.repositories.self.refName (branch), templateParameters"
    },
    {
        "path": "/{project}/_apis/wit/queries",
        "method": "GET",
        "description": "List saved work item queries (shared and personal)",
        "params": "$depth, $expand"
    },
    {
        "path": "/_apis/groupentitlements?api-version=7.1",
        "method": "GET",
        "host": "vsaex.dev.azure.com",
        "description": "List group entitlements (group rules that auto-assign licenses). Use host vsaex.dev.azure.com.",
        "params": ""
    },
    {
        "path": "/_apis/groupentitlements?api-version=7.1",
        "method": "POST",
        "host": "vsaex.dev.azure.com",
        "description": "Create a group entitlement rule — maps an AAD group to an access level (e.g. Basic) and project membership. All members of the AAD group automatically get the specified license. Use host vsaex.dev.azure.com. This is the best way to bulk-provision users.",
        "params": "body: { group: { origin: 'aad', originId: '<AAD-group-object-id>', subjectKind: 'group' }, licenseRule: { licensingSource: 'account', accountLicenseType: 'express', licenseDisplayName: 'Basic' }, projectEntitlements: [{ group: { groupType: 'projectContributor' }, projectRef: { id: '<project-id>' } }] }"
    },
    {
        "path": "/_apis/groupentitlements/{groupId}?api-version=7.1",
        "method": "GET",
        "host": "vsaex.dev.azure.com",
        "description": "Get a specific group entitlement by ID. Use host vsaex.dev.azure.com.",
        "params": ""
    },
    {
        "path": "/_apis/groupentitlements/{groupId}?api-version=7.1",
        "method": "PATCH",
        "host": "vsaex.dev.azure.com",
        "description": "Update a group entitlement (change license rule, project access). Use host vsaex.dev.azure.com.",
        "params": "JSON Patch array: [{op, path, value}]"
    },
    {
        "path": "/_apis/groupentitlements/{groupId}?api-version=7.1",
        "method": "DELETE",
        "host": "vsaex.dev.azure.com",
        "description": "Delete a group entitlement rule. Use host vsaex.dev.azure.com.",
        "params": ""
    },
    {
        "path": "/_apis/memberentitlementmanagement/memberentitlements?api-version=7.1-preview.3",
        "method": "GET",
        "host": "vsapm.dev.azure.com",
        "description": "List individual member entitlements (users and their access levels). Use host vsapm.dev.azure.com. For bulk provisioning, prefer the Group Entitlements API on vsaex.dev.azure.com instead.",
        "params": "$top, $skip, $filter, $orderBy, $select"
    },
    {
        "path": "/_apis/memberentitlementmanagement/memberentitlements?api-version=7.1-preview.3",
        "method": "POST",
        "host": "vsapm.dev.azure.com",
        "description": "Add a single member entitlement. Use host vsapm.dev.azure.com. For bulk provisioning, prefer the Group Entitlements API on vsaex.dev.azure.com instead.",
        "params": "body: { accessLevel: { accountLicenseType: 'express'|'stakeholder', licensingSource: 'account' }, user: { principalName: 'user@domain.com', subjectKind: 'user' }, projectEntitlements: [{ group: { groupType: 'projectContributor' }, projectRef: { id: projectId } }] }"
    },
    {
        "path": "/_apis/memberentitlementmanagement/memberentitlements/{memberId}?api-version=7.1-preview.3",
        "method": "PATCH",
        "host": "vsapm.dev.azure.com",
        "description": "Update a member entitlement (change access level, project access). Use host vsapm.dev.azure.com.",
        "params": "JSON Patch array: [{op, path, value}]"
    },
    {
        "path": "/_apis/memberentitlementmanagement/memberentitlements/{memberId}?api-version=7.1-preview.3",
        "method": "DELETE",
        "host": "vsapm.dev.azure.com",
        "description": "Remove a member entitlement (revoke user access). Use host vsapm.dev.azure.com.",
        "params": ""
    },
    {
        "path": "/_apis/graph/users?api-version=7.1-preview.1",
        "method": "GET",
        "host": "vssps.dev.azure.com",
        "description": "List users in the organization (Graph API). Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
        "params": "subjectTypes (aad, msa, etc.), continuationToken"
    },
    {
        "path": "/_apis/graph/groups?api-version=7.1-preview.1",
        "method": "GET",
        "host": "vssps.dev.azure.com",
        "description": "List groups in the organization. Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
        "params": "subjectTypes, continuationToken"
    },
    {
        "path": "/_apis/graph/memberships/{subjectDescriptor}?api-version=7.1-preview.1",
        "method": "GET",
        "host": "vssps.dev.azure.com",
        "description": "List group memberships for a user or group. Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
        "params": "direction (up = groups user belongs to, down = members of group)"
    },
    {
        "path": "/_apis/graph/memberships/{subjectDescriptor}/{containerDescriptor}?api-version=7.1-preview.1",
        "method": "PUT",
        "host": "vssps.dev.azure.com",
        "description": "Add a user to a group. Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
        "params": ""
    },
    {
        "path": "/_apis/graph/memberships/{subjectDescriptor}/{containerDescriptor}?api-version=7.1-preview.1",
        "method": "DELETE",
        "host": "vssps.dev.azure.com",
        "description": "Remove a user from a group. Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
        "params": ""
    },
    {
        "path": "/_apis/projects/{projectId}/teams",
        "method": "GET",
        "description": "List teams in a project",
        "params": "$top, $skip"
    },
    {
        "path": "/_apis/projects/{projectId}/teams/{teamId}",
        "method": "GET",
        "description": "Get a specific team by ID",
        "params": ""
    },
    {
        "path": "/_apis/projects/{projectId}/teams",
        "method": "POST",
        "description": "Create a new team in a project",
        "params": "name, description"
    },
    {
        "path": "/_apis/projects/{projectId}/teams/{teamId}/members",
        "method": "GET",
        "description": "List members of a team",
        "params": "$top, $skip"
    },
    {
        "path": "/{project}/{team}/_apis/work/teamsettings/iterations",
        "method": "GET",
        "description": "List iterations (sprints) for a team",
        "params": "$timeframe (current, past, future)"
    },
    {
        "path": "/{project}/{team}/_apis/work/teamsettings/iterations",
        "method": "POST",
        "description": "Add an iteration to a team's sprint schedule",
        "params": "id (iteration node ID)"
    },
    {
        "path": "/{project}/{team}/_apis/work/teamsettings/iterations/{iterationId}",
        "method": "DELETE",
        "description": "Remove an iteration from a team's sprint schedule",
        "params": ""
    },
    {
        "path": "/{project}/_apis/wit/classificationnodes/iterations",
        "method": "GET",
        "description": "List iteration path tree (project-level iteration nodes)",
        "params": "$depth"
    },
    {
        "path": "/{project}/_apis/wit/classificationnodes/iterations",
        "method": "POST",
        "description": "Create a new iteration node (sprint)",
        "params": "name, attributes: { startDate, finishDate }"
    },
    {
        "path": "/{project}/_apis/wit/classificationnodes/areas",
        "method": "GET",
        "description": "List area path tree (project-level area nodes)",
        "params": "$depth"
    },
    {
        "path": "/{project}/_apis/wit/classificationnodes/areas",
        "method": "POST",
        "description": "Create a new area path node",
        "params": "name"
    },
    {
        "path": "/{project}/_apis/wit/classificationnodes/{structureGroup}/{path}",
        "method": "DELETE",
        "description": "Delete a classification node (area or iteration). structureGroup is 'areas' or 'iterations'.",
        "params": "$reclassifyId (move items to this node before deleting)"
    },
    {
        "path": "/_apis/hooks/subscriptions",
        "method": "GET",
        "description": "List service hook subscriptions (webhooks for events)",
        "params": ""
    },
    {
        "path": "/_apis/hooks/subscriptions",
        "method": "POST",
        "description": "Create a service hook subscription (webhook)",
        "params": "publisherId, eventType, consumerId, consumerActionId, publisherInputs, consumerInputs"
    }
]
