POST https://api.sonorancad.com/v2/general/photos
Rate limit:Send a photo to a user in your CAD community.10 requests per minute
Authenticated v2 endpoints are rate limited per API key rather than per IP address.
View and attach photos in CAD
Photos sent through this endpoint appear in Recent photos, where users can view them or attach them to a custom record.- View photos
- Attach to a record
- Click the folder icon at the left of the CAD toolbar.

- Select a photo to view it.

- Open a custom record and click the folder icon in its Image field.

- Select a photo and click Use photo (or Replace photo for an existing image).

- The photo appears in the record. Save the record to keep it.

Request Body
communityUserIdis the recipient’s community user ID.urlis an absolute HTTPS link to an image the recipient’s CAD client can load. Use a link without embedded credentials.
{
"communityUserId": "player-1234",
"url": "https://cdn.example.com/mugshots/example.png"
}
Example Request
- Sonoran.lua
- SonoranCADFiveM
- Sonoran.js
- Sonoran.py
- Sonoran.Net
- OpenAPI
- cURL
-- 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:sendPhotoV2({
communityUserId = 'player-1234',
url = 'https://example.com/mugshot.png',
})
-- 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.jsSonoran.NetAfter getting the Lua export client:
- Sonoran.lua and Sonoran.js: use the
sonorancadexport 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.
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.lualocal cad = exports["sonorancad"]:getCadClient()
const cad = exports["sonorancad"].getCadClient();
// 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
});
local response = cad:sendPhotoV2({
communityUserId = 'player-1234',
url = 'https://example.com/mugshot.png',
})
-- Inspect response.success, response.data, or response.reason as needed.
print(response.success)
// npm install @sonoransoftware/sonoran.js
// For SonoranCADFiveM in-game usage, see the SonoranCADFiveM tab for the export-based client.
const Sonoran = require('@sonoransoftware/sonoran.js');
(async () => {
const instance = new Sonoran.Instance({
communityId: 'YOUR_COMMUNITY_ID',
apiKey: 'YOUR_API_KEY',
product: Sonoran.productEnums.CAD,
serverId: 1,
});
const response = await instance.cad.sendPhotoV2({
communityUserId: 'player-1234',
url: 'https://example.com/mugshot.png',
});
console.log(response);
})();
# pip install Sonoran.py
# Sonoran.py is for external Python integrations; FiveM resources should use the SonoranCADFiveM tab.
from sonoran import Instance, productEnums
instance = Instance(
apiKey="YOUR_API_KEY",
communityId="YOUR_COMMUNITY_ID",
product=productEnums.CAD,
serverId=1,
)
response = instance.cad.sendPhotoV2({
"communityUserId": 'player-1234',
"url": 'https://example.com/mugshot.png',
})
print(response.success)
print(response.data if response.success else response.reason)
// dotnet add package Sonoran.Net
// For SonoranCADFiveM in-game usage, see the SonoranCADFiveM tab; .NET creates a fresh client from convars.
using Sonoran;
using var sonoran = new SonoranClient(new SonoranClientOptions
{
product = SonoranProduct.CAD,
communityId = "YOUR_COMMUNITY_ID",
apiKey = "YOUR_API_KEY",
defaultServerId = 1
});
var response = await sonoran.Cad.sendPhotoV2(new SendPhotoV2Request
{
CommunityUserId = "player-1234",
Url = "https://example.com/mugshot.jpg"
});
Console.WriteLine(response.success);
Console.WriteLine(response.data);
Import this YAML into Postman with Import -> Raw text to create a single-endpoint request collection for this route.
openapi: "3.0.3"
info:
title: "Sonoran CAD v2 - Send Photo"
version: "1.0.0"
description: "Send an HTTPS image link to the recipient's CAD connections in the authenticated community."
servers:
-
url: "https://api.sonorancad.com"
paths:
/v2/general/photos:
post:
summary: "Send Photo"
operationId: "sendPhoto"
responses:
"200":
description: "The photo link was routed to the listed number of CAD connections."
content:
application/json:
schema:
type: "object"
properties:
communityUserId:
type: "string"
delivered:
type: "integer"
description: "Number of CAD connections the link was routed to."
example:
communityUserId: "player-1234"
delivered: 1
"400":
description: "The request is missing a required value or the image URL is invalid."
"404":
description: "No eligible CAD connection was found for the recipient in this community."
security:
-
bearerAuth:
requestBody:
required: true
content:
application/json:
schema:
type: "object"
required: [communityUserId, url]
properties:
communityUserId:
type: "string"
description: "Recipient's community user ID."
url:
type: "string"
format: "uri"
description: "Absolute HTTPS image URL without embedded credentials."
example:
communityUserId: "player-1234"
url: "https://cdn.example.com/mugshots/example.png"
components:
securitySchemes:
bearerAuth:
type: "http"
scheme: "bearer"
bearerFormat: "JWT"
curl --request POST \
--url "https://api.sonorancad.com/v2/general/photos" \
--header "Authorization: Bearer YOUR_API_KEY" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data '{
"communityUserId": "player-1234",
"url": "https://cdn.example.com/mugshots/example.png"
}'
Response
Successful requests returnapplication/json. The delivered value counts the CAD connections the link was routed to.
{
"communityUserId": "player-1234",
"delivered": 1
}
400 Bad Request for missing or invalid inputs and 404 Not Found when the recipient has no eligible CAD connection in the authenticated community.
