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-09-06",
"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>",
"billingModel": "usage",
"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, the 2026-09-05 revision adds overridden and mcpPinned to the dashboard endpoint plus the dashboard-only enabled=true filter, and the 2026-09-06 revision adds optional endpoint billingModel metadata. 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-09-06",
"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>",
"billingModel": "usage",
"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). High-risk workspace administration requires an owner or admin role and fresh MFA/passkey step-up.
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 <= 100view=dashboard only (personal accounts are always served that view): page over what the workspace has on. Every provider keeps only its enabled endpoints and is omitted when none is left; page cursors are computed over that list, and the response echoes filter.enabled so a client can tell a filtered page from one served by an older task. Any other view, or any value but true, is a 400.
Response
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.