curl --request GET \
--url https://api.paywithlocus.com/api/credits/catalog \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.paywithlocus.com/api/credits/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.paywithlocus.com/api/credits/catalog', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.paywithlocus.com/api/credits/catalog",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.paywithlocus.com/api/credits/catalog"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.paywithlocus.com/api/credits/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.paywithlocus.com/api/credits/catalog")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"version": "2026-08-31",
"view": "full",
"tenant": {
"defaultMarkupBps": 123,
"defaultFlatMarkupUsd": "<string>",
"creditsPerDollar": 2
},
"providers": [
{
"provider": "<string>",
"iconFallback": {
"type": "monogram",
"text": "<string>"
},
"serviceUrl": "<string>",
"endpoints": [
{
"slug": "<string>",
"method": "<string>",
"inputSchema": {},
"inputExample": {},
"dynamic": true,
"enabled": true,
"markupBps": 123,
"overridden": true,
"markupSource": "endpoint",
"flatSource": "endpoint",
"flatMarkupUsdc": "<string>",
"flatMarkupUsd": "<string>",
"baseUsdc": "<string>",
"chargedUsdc": "<string>",
"effectiveUsd": "<string>",
"marginUsdc": "<string>",
"baseCredits": "<string>",
"effectiveCredits": "<string>",
"marginCredits": "<string>",
"name": "<string>",
"description": "<string>",
"estimatedCost": "<string>",
"availability": "available",
"unavailableReason": "delivery_breaker",
"systemManaged": true,
"route": "<string>",
"previewRoute": "<string>"
}
],
"name": "<string>",
"description": "<string>",
"category": "<string>",
"secondaryCategories": [
"<string>"
],
"verified": true,
"logoUrl": "<string>",
"websiteUrl": "<string>",
"docsUrl": "<string>",
"catalogPriority": 123,
"catalogIdentity": "<string>",
"attribution": {
"name": "<string>",
"websiteUrl": "<string>",
"logoUrl": "<string>"
},
"marketplaceRank": 123,
"marketplaceFeatured": true,
"externalRail": "mpp",
"availability": "available",
"unavailableReason": "delivery_breaker",
"modelCatalog": {
"schemaVersion": "2026-08-01",
"pricingVersion": "<string>",
"provider": "<string>",
"publishedAt": "2023-11-07T05:31:56Z",
"freshness": {
"maxAgeSeconds": 1,
"staleAfter": "2023-11-07T05:31:56Z",
"source": "locus-reviewed-static"
},
"models": [
{
"id": "<string>",
"status": "active",
"deprecationDate": "2023-12-25",
"contextWindowTokens": 2,
"providerMaxOutputTokens": 2,
"locusMaxOutputTokens": 2,
"recommendedMinOutputTokens": 2,
"pricing": {
"unit": "usd_per_1m_tokens",
"input": "<string>",
"output": "<string>"
},
"capabilities": {
"text": true,
"vision": true,
"tools": true,
"json": true,
"streaming": true,
"reasoning": true
},
"request": {
"outputTokenField": "max_tokens",
"incompatibleFields": [
"<string>"
]
}
}
]
}
}
]
}List catalog with your effective prices
Use the default view=compact for normal enterprise catalog browsing. Compact responses omit executable JSON Schemas and model inventories, page providers, carry a version/ETag, and are gzip-compressed when the client advertises gzip. view=dashboard is the Locus Pro dashboard projection; its first page also publishes pageCursors so the dashboard can fetch the remaining pages concurrently. view=summary returns every provider as price-free card metadata and endpoint counts in one response. Agents should stay on compact and follow nextCursor; the 2026-08-31 revision only adds the optional provider secondaryCategories field. Personal accounts receive the price-safe dashboard projection when view is omitted or full/compact/dashboard is requested; they may also request summary. Request view=full only for the backward-compatible full export. Cache privately for at most 60 seconds and revalidate with If-None-Match; do not poll more often than once per minute.
curl --request GET \
--url https://api.paywithlocus.com/api/credits/catalog \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.paywithlocus.com/api/credits/catalog"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.paywithlocus.com/api/credits/catalog', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.paywithlocus.com/api/credits/catalog",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.paywithlocus.com/api/credits/catalog"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.paywithlocus.com/api/credits/catalog")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.paywithlocus.com/api/credits/catalog")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"success": true,
"version": "2026-08-31",
"view": "full",
"tenant": {
"defaultMarkupBps": 123,
"defaultFlatMarkupUsd": "<string>",
"creditsPerDollar": 2
},
"providers": [
{
"provider": "<string>",
"iconFallback": {
"type": "monogram",
"text": "<string>"
},
"serviceUrl": "<string>",
"endpoints": [
{
"slug": "<string>",
"method": "<string>",
"inputSchema": {},
"inputExample": {},
"dynamic": true,
"enabled": true,
"markupBps": 123,
"overridden": true,
"markupSource": "endpoint",
"flatSource": "endpoint",
"flatMarkupUsdc": "<string>",
"flatMarkupUsd": "<string>",
"baseUsdc": "<string>",
"chargedUsdc": "<string>",
"effectiveUsd": "<string>",
"marginUsdc": "<string>",
"baseCredits": "<string>",
"effectiveCredits": "<string>",
"marginCredits": "<string>",
"name": "<string>",
"description": "<string>",
"estimatedCost": "<string>",
"availability": "available",
"unavailableReason": "delivery_breaker",
"systemManaged": true,
"route": "<string>",
"previewRoute": "<string>"
}
],
"name": "<string>",
"description": "<string>",
"category": "<string>",
"secondaryCategories": [
"<string>"
],
"verified": true,
"logoUrl": "<string>",
"websiteUrl": "<string>",
"docsUrl": "<string>",
"catalogPriority": 123,
"catalogIdentity": "<string>",
"attribution": {
"name": "<string>",
"websiteUrl": "<string>",
"logoUrl": "<string>"
},
"marketplaceRank": 123,
"marketplaceFeatured": true,
"externalRail": "mpp",
"availability": "available",
"unavailableReason": "delivery_breaker",
"modelCatalog": {
"schemaVersion": "2026-08-01",
"pricingVersion": "<string>",
"provider": "<string>",
"publishedAt": "2023-11-07T05:31:56Z",
"freshness": {
"maxAgeSeconds": 1,
"staleAfter": "2023-11-07T05:31:56Z",
"source": "locus-reviewed-static"
},
"models": [
{
"id": "<string>",
"status": "active",
"deprecationDate": "2023-12-25",
"contextWindowTokens": 2,
"providerMaxOutputTokens": 2,
"locusMaxOutputTokens": 2,
"recommendedMinOutputTokens": 2,
"pricing": {
"unit": "usd_per_1m_tokens",
"input": "<string>",
"output": "<string>"
},
"capabilities": {
"text": true,
"vision": true,
"tools": true,
"json": true,
"streaming": true,
"reasoning": true
},
"request": {
"outputTokenField": "max_tokens",
"incompatibleFields": [
"<string>"
]
}
}
]
}
}
]
}Authorizations
Locus Pro dashboard session (Cognito).
Query Parameters
The default is compact for enterprise workspaces and dashboard for personal accounts. Personal accounts are always projected to dashboard except for summary.
compact, dashboard, summary, full Opaque provider cursor; valid only for the paged views (compact, dashboard).
512Provider page size; valid only for the paged views (compact, dashboard).
1 <= x <= 100Response
Full export or compact provider page. Responses include ETag, X-Locus-Catalog-Version, and a private no-cache directive so enablement changes are never read from cache.