GROK BOT / bulk-set-model-access-and-parameters-via-org-api

Grok Bot

Bulk set model access and parameters with the Organization API

Enable or disable one catalog model across many linked teams, optionally with the same per-model parameters map, with PUT https://api.cursor.com/organizations/teams/model-access/providers/{provider}/models/{model}. Official reference: Organization API → Model access. These routes are in preview and may change before general availability.

Authenticate with an Organization API key (Basic auth, key as username, empty password). Writes need models:* (or admin:*). Rate limit: 20 requests per minute. Writes appear in team audit logs as team_settings events. Enterprise organizations; target teams must have model access control available.

Seed a custom policy on each team first when needed: Set model access configuration with the Organization API. Discover catalog ids and supported parameters with List model access providers. For a single linked team, use Set model access and parameters.

Path and body

Field Rules
provider Required catalog provider id (for example anthropic)
model Required catalog model id (for example claude-opus-4-6)
enabled Required boolean
teamIds Required linked team IDs; maximum 100 per request
parameters Optional. Same map as the single-team model PUT. allowedValues: null clears a restriction. defaultValue: null restores the catalog default

HTTP 200 means the batch was processed, not that every row succeeded. Inspect errorCount and every results[].status. Successful rows are not rolled back. Operations are idempotent per team, so retry only failed teamIds. A 4xx or 5xx rejects the whole request and applies no changes. Response shape matches team-membership sync.

Disable Fast across linked teams

curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/anthropic/models/claude-opus-4-6 \
  -u YOUR_ORGANIZATION_API_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "teamIds": [7, 8, 9],
    "enabled": true,
    "parameters": {
      "fast": { "allowedValues": ["false"] }
    }
  }'

Pin default reasoning effort across linked teams

curl -X PUT https://api.cursor.com/organizations/teams/model-access/providers/openai/models/gpt-5.4 \
  -u YOUR_ORGANIZATION_API_KEY: \
  -H "Content-Type: application/json" \
  -d '{
    "teamIds": [7, 8, 9],
    "enabled": true,
    "parameters": {
      "reasoning": {
        "allowedValues": ["low", "medium", "high"],
        "defaultValue": "high"
      }
    }
  }'

Example response:

{
  "results": [
    { "teamId": 7, "status": "success" },
    { "teamId": 8, "status": "success" },
    {
      "teamId": 9,
      "status": "error",
      "errorMessage": "Team has no model access policy. Create one with PUT /teams/model-access/configuration, or enable model access in Team Settings → Models."
    }
  ],
  "successCount": 2,
  "errorCount": 1
}

In that example HTTP status is still 200. Teams 7 and 8 keep the new model settings; retry team 9 only after creating its configuration.

Pitfalls

  • Treating bulk HTTP 200 as all-success — always read errorCount and per-row status.
  • Sending more than 100 teamIds — split into additional requests.
  • Passing an empty allowedValues array — that returns 400; use null to clear a restriction.
  • Setting defaultValue outside allowedValues400.
  • Using display names in the path — use catalog ids from the list GET.
  • Calling with members:* or usage:* alone — model-access writes need models:* or admin:*.

Bulk provider toggles (without per-model parameters) use Enable or disable a model access provider. Preview paths can shift before GA — pin the official docs when you automate.