For the complete documentation index, see llms.txt. This page is also available as Markdown.

Replace Account Permissions

Replace Account Permissions using the granular CAD v2 permissions API.

PUT https://api.sonorancad.com/v2/general/permissions/accounts/{accountId}

Authenticate with your community API key using Authorization: Bearer YOUR_API_KEY. All SDK examples use the existing authenticated request and rate-limit handling.

Replace the account's complete explicit grant list in the authenticated community. accountId is the account UUID, not a community user ID. This operation does not add to the existing list: omitted grants are removed. The request must contain grants; version is 2 (the server also defaults an omitted version to 2).

Use exact, case-sensitive grant IDs from Get Permission Catalog. To retain existing permissions, first read the account, check that the read succeeded, and build the complete desired list. Concurrent replacements can overwrite each other; coordinate writers.

Only pending or active non-owner memberships can be edited. Nonempty grants activate pending memberships, subject to the community member limit. An empty array clears grants and makes an active membership pending. This endpoint does not ban, unban, restore removed memberships, or reactivate expired memberships. Unknown grants, owner edits, missing/noneditable accounts, and membership-limit failures return HTTP 400.

A granular replacement ends legacy category inheritance for future record templates. Refresh the catalog and explicitly grant access to new templates when needed. Existing legacy integrations remain supported, but new integrations should use this endpoint.

Selecting limited editing

After the catalog exposes record.<templateId>.edit.selected, include that grant to permit only fields marked Allow limited editing on another account's records. Include read and required page access separately. Retain or add edit.own only if own-record editing is also intended. Remove that template's edit.any grant when limiting access: full editing takes precedence, regardless of field opt-in. Preserve every unrelated grant when building the replacement list.

supervise remains an additional requirement for supervisor-only fields, including opted-in fields. It does not expand a selected-field user's editable field list. Existing records and field flags need no migration. Existing Edit any grants are retained and mean full editing on the updated backend. Do not send this new grant to a server whose catalog does not include it.

Request Body

{"version": 2, "grants": ["global.police"]}

To clear all permissions, explicitly send:

{"version": 2, "grants": []}

Example Request

-- luarocks install sonoran.lua
-- For SonoranCADFiveM in-game usage, see the SonoranCADFiveM tab for the export-based client.
local Sonoran = require("sonoran")

local sonoran = Sonoran.createClient({
  product = Sonoran.productEnums.CAD,
  communityId = "YOUR_COMMUNITY_ID",
  apiKey = "YOUR_API_KEY",
  defaultServerId = 1
})

local response = sonoran.cad:replaceAccountPermissionsV2("00000000-0000-0000-0000-000000000000", { "global.police" })

-- Inspect response.success, response.data, or response.reason as needed.
print(response.success)

Use this tab only when calling the v2 API from the server side of an in-game FiveM resource.

  • Sonoran.lua and Sonoran.js: use the sonorancad export to get the ready CAD client.

  • Sonoran.Net: FiveM exports do not return a .NET client. Read the Sonoran CAD convars and create a fresh client.

  • Sonoran.py: FiveM does not run Python resources; use the Python tab for external integrations.

The API key is stored in sonoran_apiKey as a protected FiveM convar. FiveM restricts a convar after add_convar_permission is configured, so only explicitly permitted resources can read it. Grant another resource access with add_convar_permission your-resource-name read sonoran_apiKey. If you change the API key in config.json, fully restart the sonorancad resource before reading the updated convar value.

Sonoran.lua

local cad = exports["sonorancad"]:getCadClient()

Sonoran.js

const cad = exports["sonorancad"].getCadClient();

Sonoran.Net

// dotnet add package Sonoran.Net
using CitizenFX.Core.Native;
using Sonoran;

var communityId = API.GetConvar("sonoran_communityID", "");
var apiKey = API.GetConvar("sonoran_apiKey", "");
var serverIdRaw = API.GetConvar("sonoran_serverId", "1");
var serverId = int.TryParse(serverIdRaw, out var parsedServerId) ? parsedServerId : 1;

using var sonoran = new SonoranClient(new SonoranClientOptions
{
    product = SonoranProduct.CAD,
    communityId = communityId,
    apiKey = apiKey,
    defaultServerId = serverId
});

After getting the Lua export client:

After getting the JavaScript export client:

After constructing the .NET client from protected convars:

Import this YAML into Postman with Import -> Raw text.

Response

Last updated

Was this helpful?