Skip to main content

SDK Integration

The SDK routes provide client-side access to AudienceGPT's classification and topic management capabilities. These endpoints use publishable keys (pk_live_ / pk_test_) instead of secret API keys, making them safe to expose in browser JavaScript. All SDK routes include CORS headers for cross-origin requests and follow the same request/response patterns as their dashboard counterparts.

Overview​

SDK routes are designed for:

  • Embedding classification widgets in consumer-facing websites
  • Building custom taxonomy management UIs
  • Client-side applications that need to classify topics without a backend proxy
  • Platform integrations that need to read mapping data

Authentication​

SDK routes authenticate via the Authorization header with a publishable key:

Authorization: Bearer pk_live_x9Kz3mN9pQ2wXyZ5bC...
Key PrefixEnvironment
pk_live_Production
pk_test_Testing/development
warning

SDK keys are visible in client-side code. While they are safe to expose (scoped to specific operations), you should still restrict their scopes to only the operations your client application needs.

CORS Headers​

All SDK routes include the following CORS headers:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, OPTIONS (or GET, OPTIONS for read endpoints)
Access-Control-Allow-Headers: Content-Type, Authorization

Every SDK route also exports an OPTIONS handler for CORS preflight requests, returning 204 No Content.


POST /api/sdk/classify​

Classify a topic through the AI-powered pipeline. Mirrors POST /api/classify with SDK key authentication.

Auth: SDK key with classify scope

Request Body​

{
"messages": [
{
"role": "user",
"content": "Classify: organic skincare for sensitive skin"
}
]
}
FieldTypeRequiredDescription
messagesarrayYesAnthropic message format (max 50 messages)

Response (200)​

{
"text": "{\"topic_name\":\"Organic Skincare - Sensitive Skin\",\"parent_category\":\"Health & Beauty\",\"taxonomy_type\":\"Health & Wellness\",\"subcategory\":\"Skincare\",\"segment_type\":\"B2C\",\"audience_type\":\"Health-Conscious Consumers\",\"keywords\":[\"organic\",\"skincare\",\"sensitive skin\"],\"segment_desc_liveramp\":\"Health-conscious consumers seeking organic skincare products for sensitive skin\",\"segment_desc_tradedesk\":\"Organic skincare for sensitive skin\",\"internal_description\":\"Audience segment targeting consumers interested in organic skincare products formulated for sensitive skin\"}"
}

JavaScript Example​

async function classifyTopic(description) {
const response = await fetch("https://app.audiencegpt.com/api/sdk/classify", {
method: "POST",
headers: {
"Authorization": "Bearer pk_live_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
messages: [{ role: "user", content: `Classify: ${description}` }],
}),
});

if (!response.ok) {
throw new Error((await response.json()).error);
}

const { text } = await response.json();
return JSON.parse(text);
}

POST /api/sdk/analyze-brief​

Upload and analyze a campaign brief document. Mirrors POST /api/analyze-brief with SDK key authentication.

Auth: SDK key with classify scope

Request Body​

{
"file": {
"data": "JVBERi0xLjQK...",
"mediaType": "application/pdf",
"filename": "campaign-brief.pdf"
}
}

See Campaign Brief API for full request/response details.


POST /api/sdk/check-duplicate​

Check if a topic already exists before saving it.

Auth: SDK key with classify scope

Request Body​

{
"topic_name": "Organic Skincare Buyers"
}

Response (200)​

{
"isDuplicate": false,
"confidence": 0.42,
"existingTopic": null
}

POST /api/sdk/topics​

Save a classified topic to your organization's library.

Auth: SDK key with topics:write scope

Request Body​

All classification output fields are required:

{
"topic_name": "Organic Skincare - Sensitive Skin",
"parent_category": "Health & Beauty",
"taxonomy_type": "Health & Wellness",
"subcategory": "Skincare",
"segment_type": "B2C",
"keywords": ["organic", "skincare", "sensitive skin"],
"segment_desc_liveramp": "Health-conscious consumers seeking organic skincare...",
"segment_desc_tradedesk": "Organic skincare for sensitive skin",
"internal_description": "Audience segment targeting..."
}
FieldTypeRequiredDescription
topic_namestringYesTopic name
parent_categorystringYesParent category (41 types)
taxonomy_typestringYesTaxonomy type group (13 groups)
subcategorystringYesSubcategory
segment_typestringYesB2B, B2C, B2B2C, B2E, B2G
keywordsarrayYesKeyword array
segment_desc_liverampstringYesLiveRamp description
segment_desc_tradedeskstringYesTrade Desk description
internal_descriptionstringYesInternal description

Response (201)​

{
"id": "ot_01hy..."
}

GET /api/sdk/mappings​

Bulk export of platform ID mappings for activated topics. This is the primary endpoint for downstream systems that need to resolve AudienceGPT topic IDs to platform-specific segment IDs.

Auth: SDK key with mappings:read scope

Query Parameters​

ParameterTypeDescription
platformstringFilter by platform (e.g., liveramp, tradedesk)
connection_idstringFilter by specific connection

Response (200)​

{
"mappings": [
{
"topic_name": "Tesla Model 3 Buyers",
"org_topic_id": "ot_01hy...",
"legacy_id": null,
"platform": "liveramp",
"platform_segment_id": "lr_seg_12345",
"connection_id": "conn_01...",
"pushed_name": "Auto > EV > Tesla Model 3 Buyers",
"status": "active",
"activated_at": "2026-02-20T10:00:00.000Z"
}
],
"total": 1
}

curl Example​

curl "https://app.audiencegpt.com/api/sdk/mappings?platform=liveramp" \
-H "Authorization: Bearer pk_live_your_key_here"

GET /api/sdk/mappings/:topicName​

Look up the platform mapping for a specific topic by name.

Auth: SDK key with mappings:read scope

Response (200)​

Returns the mapping record for the specified topic name, or 404 if not found.


Client-Side Integration​

React Example​

import { useState } from "react";

const SDK_KEY = "pk_live_your_key_here";
const API_BASE = "https://app.audiencegpt.com";

function ClassifyWidget() {
const [input, setInput] = useState("");
const [result, setResult] = useState(null);
const [loading, setLoading] = useState(false);

async function handleClassify() {
setLoading(true);
try {
const response = await fetch(`${API_BASE}/api/sdk/classify`, {
method: "POST",
headers: {
Authorization: `Bearer ${SDK_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
messages: [{ role: "user", content: `Classify: ${input}` }],
}),
});

const { text } = await response.json();
setResult(JSON.parse(text));
} finally {
setLoading(false);
}
}

return (
<div>
<input
value={input}
onChange={(e) => setInput(e.target.value)}
placeholder="Enter topic to classify..."
/>
<button onClick={handleClassify} disabled={loading}>
{loading ? "Classifying..." : "Classify"}
</button>
{result && (
<pre>{JSON.stringify(result, null, 2)}</pre>
)}
</div>
);
}

Vanilla JavaScript Example​

<script>
const SDK_KEY = "pk_live_your_key_here";

async function classify(topicDescription) {
const res = await fetch("https://app.audiencegpt.com/api/sdk/classify", {
method: "POST",
headers: {
"Authorization": `Bearer ${SDK_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
messages: [{ role: "user", content: `Classify: ${topicDescription}` }],
}),
});

const { text } = await res.json();
return JSON.parse(text);
}

// Usage
classify("luxury travel to Maldives").then(result => {
console.log("Category:", result.parent_category);
console.log("Segment:", result.segment_type);
});
</script>

SDK Key Management​

SDK keys are created and managed through the dashboard API (requires Clerk session):

EndpointMethodDescription
/api/sdk-keysPOSTCreate a new SDK key
/api/sdk-keysGETList active SDK keys
/api/sdk-keysDELETERevoke an SDK key

See Authentication for full SDK key CRUD documentation.

Error Responses​

All SDK endpoints return errors with CORS headers:

{
"error": "Invalid or expired SDK key"
}
StatusDescription
400Invalid request body or missing required fields
401Invalid, expired, or revoked SDK key, or insufficient scopes
429Monthly quota exceeded
500Server error

Next Steps​