Campaigns
List the campaigns you own or moderate, and read any one of them in full.
3 endpoints, generated from openapi.yaml. New to the API? Start with the Overview.
https://app.airaa.xyzEvery tool is a POST to /api/ai/mcp/tools/{tool}/execute with arguments wrapped in an args object, authorised with Authorization: Bearer airaa_<key>.
get_my_campaigns
List your campaigns
Returns campaigns the authenticated user owns or moderates. Hidden campaigns are excluded.
Omit projectId to list campaigns across every community the key can manage. counts holds aggregate totals and projects lists the communities available to filter by.
This response has no metadata object. Use counts to judge how many campaigns exist and page with page and limit.
Arguments
projectIdstring | nullA community id from list_manageable_projects.
statusByenum | nullFilter by campaign status.
LIVEENDEDDRAFTPAYMENT_PENDINGcampaignTypeenum | nullFilter by campaign type group.
allinstant_tasksclippingUGCpageintegerPage number, 1-indexed.
limitintegerItems per page, 1 to 100.
Returns
Fields inside result.
campaignsarray of CampaignListItemcountsCampaignCountsprojectsarray of ProjectRefWithRoleErrors
400An argument failed schema validation. The message names the offending field and its allowed values.401The key is missing or not valid.403The key is valid but the user does not administer the requested community.405Execute endpoints accept POST only.
Request
curl -X POST https://app.airaa.xyz/api/ai/mcp/tools/get_my_campaigns/execute \
-H "Authorization: Bearer $AIRAA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"args": {"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41","page": 1,"limit": 10}}'const res = await fetch("https://app.airaa.xyz/api/ai/mcp/tools/get_my_campaigns/execute", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AIRAA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"args": {
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"page": 1,
"limit": 10
}
}),
});
const { result } = await res.json();import os
import requests
res = requests.post(
"https://app.airaa.xyz/api/ai/mcp/tools/get_my_campaigns/execute",
headers={"Authorization": f"Bearer {os.environ['AIRAA_API_KEY']}"},
json={
"args": {
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"page": 1,
"limit": 10
}
},
)
res.raise_for_status()
result = res.json()["result"]Response
{
"result": {
"campaigns": [
{
"id": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8",
"status": "LIVE",
"title": "Summer Drop Clips",
"createdAt": "2026-08-06T13:01:54.178Z",
"campaignType": "clipping",
"taskTypes": [
"CLIP_X",
"CLIP_INSTAGRAM",
"CLIP_TIKTOK"
],
"totalPool": "100",
"remainingPool": "100",
"platform": [
{
"id": "1a7d3f5b-8c92-4e06-b4a1-9f27d5c83e60",
"name": "X",
"enabled": true
},
{
"id": "2b8e4a6c-9d03-4f17-c5b2-0a38e6d94f71",
"name": "Instagram",
"enabled": true
}
],
"payoutType": "FCFS",
"completedUsersCount": 0,
"incompletedUsersCount": 0,
"hasCounterOffer": false,
"tokenType": "ERC20",
"tokenSymbol": "USDC",
"project": {
"id": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"name": "Lumen Labs",
"logo": "https://cdn.airaa.xyz/images/projects/logo/3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41.png"
},
"usedBudget": "0",
"approvedClipsCount": 0,
"impressions": 0,
"pendingReviewsCount": 0
}
],
"counts": {
"live": 33,
"draft": 4,
"ended": 2,
"spent": 4345
},
"projects": [
{
"id": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"name": "Lumen Labs",
"logo": "https://cdn.airaa.xyz/images/projects/logo/3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41.png",
"role": "ADMIN"
}
]
}
}get_campaign_details
Get one campaign in full
Returns a campaign's full owner-facing detail: basic info, stats, budget, tasks, and for live clipping or UGC campaigns the clipping owner analytics payload.
detailVariant tells you which shape came back:
clipping_ownerfor CLIPPING and UGC campaigns that are no longer DRAFT.clippingOwneris populated andtasksis empty.social_ownerfor SOCIAL campaigns and for any campaign still in DRAFT.tasksis populated andclippingOwnerisnull.
Arguments
projectCampaignIdstringrequiredA campaign id, from the id field of get_my_campaigns. Must be a valid UUID: the API returns a 500 rather than a 400 when it is not.
Returns
Fields inside result.
campaignTypeCampaignTypeclippingugcsocialdetailVariantstringcampaignCampaignCoreprojectProjectRefstatsCampaignStatsbudgetCampaignBudgettasksarray of objectAlways empty on this variant. Read clippingOwner.tasksTab.tasks.
draftConfigobject | nulleligibilityProjectobject | nullclippingOwnerClippingOwnerPayloadcampaignCommissioninteger | nullcampaignTypeCampaignTypeclippingugcsocialdetailVariantstringcampaignCampaignCoreprojectProjectRefstatsCampaignStatsbudgetCampaignBudgettasksarray of SocialTaskdraftConfigobject | nulleligibilityProjectobject | nullclippingOwnernullAlways null on this variant.
campaignCommissioninteger | nullErrors
401The key is missing or not valid.403The key is valid but the user does not administer the requested community.404No campaign with that id is visible to this key.405Execute endpoints accept POST only.500An id argument was not a valid UUID. The API currently surfaces the underlying database error rather than a validation message, so validate ids before sending them.
Request
curl -X POST https://app.airaa.xyz/api/ai/mcp/tools/get_campaign_details/execute \
-H "Authorization: Bearer $AIRAA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"args": {"projectCampaignId": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8"}}'const res = await fetch("https://app.airaa.xyz/api/ai/mcp/tools/get_campaign_details/execute", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AIRAA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"args": {
"projectCampaignId": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8"
}
}),
});
const { result } = await res.json();import os
import requests
res = requests.post(
"https://app.airaa.xyz/api/ai/mcp/tools/get_campaign_details/execute",
headers={"Authorization": f"Bearer {os.environ['AIRAA_API_KEY']}"},
json={
"args": {
"projectCampaignId": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8"
}
},
)
res.raise_for_status()
result = res.json()["result"]Response
A live clipping campaign
{
"result": {
"campaignType": "clipping",
"detailVariant": "clipping_owner",
"campaign": {
"id": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8",
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"createdAt": "2026-08-06T13:01:54.178Z",
"title": "Summer Drop Clips",
"imageUrl": null,
"status": "LIVE",
"startDate": "2026-08-06T13:01:54.177Z",
"type": "clipping",
"approvalMode": "MANUAL",
"userEligibilityCriteria": {
"openToAll": true
}
},
"project": {
"id": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"name": "Lumen Labs",
"logo": "https://cdn.airaa.xyz/images/projects/logo/3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41.png"
},
"stats": {
"creators": 4,
"reach": 12480,
"likes": 316,
"quotes": 12,
"post": 9
},
"budget": {
"totalPool": "100.000000",
"remainingPool": "62.400000",
"tokenType": "ERC20",
"tokenSymbol": "USDC",
"tokenAddress": "0x3AF9cB6000b310c909e10f79A9Ec642960eeEe99",
"chainId": "8453",
"decimals": 18
},
"tasks": [],
"draftConfig": null,
"eligibilityProject": null,
"clippingOwner": {
"eligibilitySummary": {
"mode": "open",
"guild": null
},
"demographicsRequired": false,
"demographicsAudienceRule": null,
"overview": {
"creatorsCount": 4,
"totalSubmissionsCount": 9,
"submissionsCount": 9,
"pendingSubmissionsCount": 2,
"approvedSubmissionsCount": 6,
"rejectedSubmissionsCount": 1,
"paidSubmissionsCount": 5,
"reach": 12480,
"currentReach": 12495,
"initialReach": 15,
"likes": 316,
"comments": 41
},
"budget": {
"label": "Estimated Budget",
"totalPool": "100.000000",
"remainingPool": "62.400000",
"usedBudget": "37.6",
"tokenType": "ERC20",
"tokenSymbol": "USDC"
},
"tasksTab": {
"requirements": {
"hashtags": [
"#lumendrop"
],
"mentions": [
"@lumenlabs"
],
"urls": [],
"guidelines": "Hook in the first two seconds. No captions over the logo."
},
"tasks": [
{
"taskId": "4c9a2e78-5b13-4d60-8f27-1a94c6e03b52",
"platformId": "1a7d3f5b-8c92-4e06-b4a1-9f27d5c83e60",
"platformName": "X",
"platformSlug": "x",
"type": "CLIP_X",
"submissionRequirements": {
"urls": {
"values": [],
"isEnabled": false,
"requireAll": false
},
"hashtags": {
"values": [
"#lumendrop"
],
"isEnabled": true,
"requireAll": true
},
"mentions": {
"values": [
"@lumenlabs"
],
"isEnabled": true,
"requireAll": false
},
"guidelines": "Hook in the first two seconds."
},
"submissionCounts": {
"total": 5,
"pending": 1,
"approved": 4,
"rejected": 0,
"paid": 3,
"nonRejected": 5
}
}
]
},
"settingsTab": {
"userEligibilityCriteria": {
"openToAll": true
},
"platformPayouts": [
{
"taskId": "4c9a2e78-5b13-4d60-8f27-1a94c6e03b52",
"platformId": "1a7d3f5b-8c92-4e06-b4a1-9f27d5c83e60",
"platformName": "X",
"platformSlug": "x",
"claimType": "FCFS",
"payoutLogic": "FORMULA",
"minViews": null,
"maxPayoutPerClip": 100,
"fixedPayout": null,
"cpm": 2,
"bonusRanges": [],
"tokenType": "ERC20",
"tokenSymbol": "USDC"
}
]
}
},
"campaignCommission": 50
}
}A social campaign
{
"result": {
"campaignType": "social",
"detailVariant": "social_owner",
"campaign": {
"id": "5d8b3e91-7a24-4f10-b3c6-1e9d4a72f05b",
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"createdAt": "2026-08-14T11:02:37.443Z",
"title": "Follow and Post",
"imageUrl": null,
"status": "LIVE",
"startDate": "2026-08-14T11:02:37.838Z",
"type": "social",
"approvalMode": "MANUAL",
"userEligibilityCriteria": {
"guildId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41"
}
},
"project": {
"id": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"name": "Lumen Labs",
"logo": "https://cdn.airaa.xyz/images/projects/logo/3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41.png"
},
"stats": {
"creators": 3,
"reach": 240,
"likes": 18,
"quotes": 2,
"post": 3
},
"budget": {
"totalPool": "1000.000000",
"remainingPool": "400.000000",
"tokenType": "POINTS",
"tokenSymbol": "LUM",
"tokenAddress": null,
"chainId": null,
"decimals": 0
},
"tasks": [
{
"id": "7e30d9a4-6c81-4b25-9f03-2d5a8e17c46b",
"platformId": "1a7d3f5b-8c92-4e06-b4a1-9f27d5c83e60",
"type": "POST",
"url": null,
"submissionRequirements": {
"urls": {
"values": [],
"isEnabled": false,
"requireAll": false
},
"hashtags": {
"values": [],
"isEnabled": false,
"requireAll": false
},
"mentions": {
"values": [],
"isEnabled": false,
"requireAll": false
},
"guidelines": "Post about the drop and tag the account."
},
"payoutConfig": {
"logic": "FIXED",
"tokenId": "b81c4d02-5f6a-4e33-a1d7-92e845bc0f16",
"claimType": "FCFS",
"fixedPayout": 200,
"auraMultiplier": 3
},
"taskCompletedCount": "3",
"reach": "240",
"likes": "18",
"replies": "2",
"platform": {
"id": "1a7d3f5b-8c92-4e06-b4a1-9f27d5c83e60",
"name": "X"
}
}
],
"draftConfig": null,
"eligibilityProject": null,
"clippingOwner": null,
"campaignCommission": 50
}
}get_clipping_campaign_detail
Get a clipping or UGC campaign
Returns the creator-facing view of a clipping or UGC campaign: stats, requirements, budget, per platform tasks and payout rules, plus the authenticated user's own submissions in mySubmissions.
If the user is not eligible for the campaign, a slim payload comes back with id, title, project, bannerImageUrl and a message instead of the full detail.
Calling this on a SOCIAL campaign returns HTTP 200 with {"result": {"error": "Clipping campaign not found"}}.
Arguments
projectCampaignIdstringrequiredA campaign id, from the id field of get_my_campaigns. Must be a valid UUID: the API returns a 500 rather than a 400 when it is not.
Returns
Fields inside result.
idstringtitlestringapprovalModestring | nullstatusCampaignStatusDRAFTLIVEPAUSEDENDEDPAYMENT_PROCESSINGPAYMENT_PENDINGstartDatestring | nullendDatestring | nullpayRateDisplaystring | nullHuman readable pay rate, for example $1-2/1K views.
payRateTypeenum | nullPPVFIXEDbannerImageUrlstring | nullcolorCodestring | nullprojectProjectRefstatsobjectrequirementsobjectcontentGuidelinesMarkdownstring | nullbudgetobjectplatformTasksarray of objectsupportedPlatformsarray of objectUse these platformId values to filter owner submissions.
mySubmissionsarray of objectThe authenticated user's own submissions to this campaign.
payoutDisplayModeenum | nullestimatedfixedisEligiblebooleanisEndingSoonbooleanpoolDepletedbooleancanSubmitbooleanhasSubmittedbooleanbrandApprovedbooleanbrandStatsobjectErrors
401The key is missing or not valid.403The key is valid but the user does not administer the requested community.404No campaign with that id is visible to this key.405Execute endpoints accept POST only.500An id argument was not a valid UUID. The API currently surfaces the underlying database error rather than a validation message, so validate ids before sending them.
Request
curl -X POST https://app.airaa.xyz/api/ai/mcp/tools/get_clipping_campaign_detail/execute \
-H "Authorization: Bearer $AIRAA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"args": {"projectCampaignId": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8"}}'const res = await fetch("https://app.airaa.xyz/api/ai/mcp/tools/get_clipping_campaign_detail/execute", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AIRAA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"args": {
"projectCampaignId": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8"
}
}),
});
const { result } = await res.json();import os
import requests
res = requests.post(
"https://app.airaa.xyz/api/ai/mcp/tools/get_clipping_campaign_detail/execute",
headers={"Authorization": f"Bearer {os.environ['AIRAA_API_KEY']}"},
json={
"args": {
"projectCampaignId": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8"
}
},
)
res.raise_for_status()
result = res.json()["result"]Response
A clipping campaign
{
"result": {
"id": "9c4e1d7a-2f38-4b6c-8e51-0d7a3f96b2c8",
"title": "Summer Drop Clips",
"approvalMode": "MANUAL",
"status": "LIVE",
"startDate": "2026-08-06T13:01:54.177Z",
"endDate": null,
"payRateDisplay": "$1-2/1K views",
"payRateType": "PPV",
"bannerImageUrl": "https://cdn.airaa.xyz/images/projects/banner/3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41.jpeg",
"colorCode": "#FFFFFF",
"project": {
"id": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"name": "Lumen Labs",
"logo": "https://cdn.airaa.xyz/images/projects/logo/3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41.png"
},
"stats": {
"clipsApprovedCount": 6,
"totalViews": 12480,
"totalCurrentViews": 12495,
"totalInitialViews": 15,
"creatorsCount": 4
},
"requirements": {
"hashtags": [
"#lumendrop"
],
"mentions": [
"@lumenlabs"
]
},
"contentGuidelinesMarkdown": "Hook in the first two seconds. No captions over the logo.",
"budget": {
"totalPool": "100.000000",
"remainingPool": "62.400000",
"usedBudget": "37.6",
"accruedUnpaid": "6.040000",
"tokenType": "ERC20",
"tokenSymbol": "USDC"
},
"platformTasks": [
{
"taskId": "4c9a2e78-5b13-4d60-8f27-1a94c6e03b52",
"platformId": "1a7d3f5b-8c92-4e06-b4a1-9f27d5c83e60",
"platformSlug": "x",
"platformName": "X",
"maxPayoutPerClip": 100,
"minViews": null,
"tokenSymbol": "USDC",
"taskSubmissionId": null,
"submissionStatus": null,
"payoutLogic": "FORMULA",
"cpm": 2,
"fixedTokenAmount": null,
"bonusRanges": [],
"demographicsRequired": false,
"demographicsAudienceRule": null
}
],
"supportedPlatforms": [
{
"platformId": "1a7d3f5b-8c92-4e06-b4a1-9f27d5c83e60",
"platformSlug": "x",
"platformName": "X"
},
{
"platformId": "2b8e4a6c-9d03-4f17-c5b2-0a38e6d94f71",
"platformSlug": "instagram",
"platformName": "Instagram"
}
],
"mySubmissions": [],
"payoutDisplayMode": "estimated",
"isEligible": true,
"isEndingSoon": false,
"poolDepleted": false,
"canSubmit": true,
"hasSubmitted": false,
"brandApproved": false,
"brandStats": {
"campaignCount": 44,
"creatorsPaid": 4
}
}
}Called on a social campaign (note the 200 status)
{
"result": {
"error": "Clipping campaign not found"
}
}