AdFire
Log inStart free

No credit card required

REST API

AdFire REST API

Integrate your ad data into any tool, script, or dashboard. One API key, full access to your Meta and Google Ads data.

Base URLhttps://adfire.io/api/v1
Get your API key →

Authentication

All requests require an API key passed as a Bearer token in the Authorization header. Generate a key at /dashboard/settings.

Authorization: Bearer af_sk_...

Status codes

200Success — JSON response body.
401Missing or invalid API key.
429Rate limited — back off and retry.
500Internal server error — contact support.

Endpoints

All endpoints are authenticated. Parameters marked with * are required. For live interactive testing, use the REST API Docs tab in Settings and press Try it on any endpoint.

GET
/api/v1/ad-accounts

List all connected Meta & Google ad accounts with sync status.

Parameters

Query parameters for /api/v1/ad-accounts
NameTypeDescription
providerenumFilter by platform.(meta, google)
Example response shape
{
  "ad_accounts": [
    {
      "id": "string",
      "name": "string",
      "provider": "meta | google",
      "externalId": "string",
      "currency": "string",
      "status": "string",
      "lastEntitySyncAt": "ISO8601 | null",
      "lastInsightsSyncAt": "ISO8601 | null"
    }
  ]
}
GET
/api/v1/campaigns

List campaigns with performance metrics.

Parameters

Query parameters for /api/v1/campaigns
NameTypeDescription
ad_account_idstringFilter by ad account.
periodenumMetrics window.(1d, 7d, 14d, 30d, 90d, lifetime)
statusenumCampaign status filter.(ACTIVE, PAUSED, DELETED)
limitnumberMax results (up to 200).
sort_byenumSort field.(spend, roas, ctr, cpc, impressions, clicks)
sort_orderenumSort direction.(desc, asc)
roas_minnumberMinimum ROAS filter (inclusive).
roas_maxnumberMaximum ROAS filter (inclusive).
Example response shape
{
  "campaigns": [
    {
      "id": "string",
      "name": "string",
      "status": "string",
      "objective": "string",
      "provider": "meta | google",
      "metrics": {
        "spend": 1234.56,
        "roas": 3.2,
        "conversions": 42,
        "impressions": 100000,
        "clicks": 1500,
        "ctr": 1.5,
        "cpc": 0.82
      }
    }
  ]
}
GET
/api/v1/campaigns/{id}

Get detailed campaign metrics for a single campaign.

Parameters

Query parameters for /api/v1/campaigns/{id}
NameTypeDescription
periodenumMetrics window.(1d, 7d, 14d, 30d, 90d, lifetime)
Example response shape
{
  "id": "string",
  "name": "string",
  "status": "string",
  "objective": "string",
  "bidStrategy": "string",
  "dailyBudget": 50.00,
  "provider": "meta | google",
  "metrics": { "spend": 1234.56, "roas": 3.2, ... }
}
GET
/api/v1/adsets

List ad sets (Meta) or ad groups (Google) with metrics.

Parameters

Query parameters for /api/v1/adsets
NameTypeDescription
ad_account_idstringFilter by ad account.
campaign_idstringFilter by campaign.
periodenumMetrics window.(1d, 7d, 14d, 30d, 90d, lifetime)
statusenumStatus filter.(ACTIVE, PAUSED, DELETED)
limitnumberMax results (up to 200).
sort_byenumSort field.(spend, roas, ctr, cpc, impressions, clicks)
sort_orderenumSort direction.(desc, asc)
Example response shape
{
  "adsets": [
    {
      "id": "string",
      "name": "string",
      "status": "string",
      "campaignId": "string",
      "dailyBudget": 25.00,
      "metrics": { "spend": 456.78, "roas": 2.8, ... }
    }
  ]
}
GET
/api/v1/adsets/{id}

Get details for a single ad set or ad group.

Parameters

Query parameters for /api/v1/adsets/{id}
NameTypeDescription
periodenumMetrics window.(1d, 7d, 14d, 30d, 90d, lifetime)
Example response shape
{
  "id": "string",
  "name": "string",
  "status": "string",
  "bidAmount": 1.50,
  "metrics": { "spend": 456.78, "roas": 2.8, ... }
}
GET
/api/v1/adsets/{id}/targeting

Get parsed targeting spec. Meta: age, gender, geo, interests, audiences, placements, Advantage+. Google: keywords, locations, devices, languages, audiences.

Example response shape
{
  "adsetId": "string",
  "provider": "meta | google",
  "targeting": {
    "ageMin": 25,
    "ageMax": 55,
    "genders": ["male", "female"],
    "geoLocations": [{ "country": "US" }],
    "interests": [{ "id": "...", "name": "..." }],
    "placements": ["facebook_feed", "instagram_feed"]
  }
}
GET
/api/v1/keywords

Google keywords, searched across all ad groups. Includes match type, quality score and bid. The metrics field is null while AdFire does not store per-keyword performance; it is never reported as zero.

Parameters

Query parameters for /api/v1/keywords
NameTypeDescription
adset_idstringFilter by ad set (Google ad group).
textstringSearch keyword text.
statusenumKeyword status.(enabled, paused, removed)
match_typeenumMatch type.(EXACT, PHRASE, BROAD)
sort_byenumSort field.(spend, text, quality_score)
limitnumberMax results (up to 500, default 100).
Example response shape
{
  "keywords": [
    {
      "id": "string",
      "text": "running shoes",
      "matchType": "EXACT",
      "status": "enabled",
      "qualityScore": 8,
      "cpcBidMicros": 1500000,
      "metrics": { "impressions": 5000, "clicks": 200, "ctr": 4.0, "cpc": 1.20 }
    }
  ]
}
GET
/api/v1/ads

List individual ads with metrics.

Parameters

Query parameters for /api/v1/ads
NameTypeDescription
ad_account_idstringFilter by ad account.
campaign_idstringFilter by campaign.
periodenumMetrics window.(1d, 7d, 14d, 30d, 90d, lifetime)
statusenumStatus filter.(ACTIVE, PAUSED, DELETED)
limitnumberMax results (up to 200).
sort_byenumSort field.(spend, roas, ctr, cpc, impressions, clicks)
sort_orderenumSort direction.(desc, asc)
Example response shape
{
  "ads": [
    {
      "id": "string",
      "name": "string",
      "status": "string",
      "adsetId": "string",
      "campaignId": "string",
      "thumbnailUrl": "string | null",
      "metrics": { "spend": 123.45, "roas": 4.1, ... }
    }
  ]
}
GET
/api/v1/ads/{id}

Get full ad details including creative analysis.

Parameters

Query parameters for /api/v1/ads/{id}
NameTypeDescription
periodenumMetrics window.(1d, 7d, 14d, 30d, 90d, lifetime)
Example response shape
{
  "id": "string",
  "name": "string",
  "status": "string",
  "metrics": { "spend": 123.45, "roas": 4.1, ... },
  "creativeAnalysis": {
    "overallScore": 82,
    "ctaPresent": true,
    "textDensity": "low",
    "emotionalTone": "inspiring",
    "mobileScore": 90
  }
}
GET
/api/v1/ads/{id}/assets

Get all creative assets for an ad — images, videos, carousel cards with durable API URLs (never expiring CDN links).

Example response shape
{
  "adId": "string",
  "assets": [
    {
      "type": "image | video | carousel_card",
      "url": "/api/assets/...",
      "storageType": "s3 | url",
      "width": 1080,
      "height": 1080
    }
  ]
}
GET
/api/v1/overview

Account-level performance overview across all campaigns.

Parameters

Query parameters for /api/v1/overview
NameTypeDescription
ad_account_idstringFilter by ad account.
periodenumMetrics window.(1d, 7d, 14d, 30d, 90d, lifetime)
Example response shape
{
  "period": "30d",
  "totalSpend": 12345.67,
  "totalConversions": 420,
  "blendedRoas": 3.1,
  "activeCampaigns": 12,
  "topCampaigns": [ ... ],
  "platformBreakdown": { "meta": {...}, "google": {...} }
}
GET
/api/v1/recommendations

AI-generated recommendations ranked by priority and estimated revenue impact.

Parameters

Query parameters for /api/v1/recommendations
NameTypeDescription
ad_account_idstringFilter by ad account.
categorystringFilter by category (creative, budget, targeting, performance).
limitnumberMax results (default 10).
Example response shape
{
  "recommendations": [
    {
      "id": "string",
      "title": "string",
      "description": "string",
      "category": "creative | budget | targeting | performance",
      "priority": "CRITICAL | HIGH | MEDIUM | LOW",
      "estimatedImpactUsd": 450.00,
      "status": "pending | implemented | snoozed | dismissed"
    }
  ]
}
GET
/api/v1/search

Full-text search across campaigns, ad sets, and ads.

Parameters

Query parameters for /api/v1/search
NameTypeDescription
q*stringSearch query.
entity_typeenumLimit to entity type.(campaign, adset, ad)
limitnumberMax results.
Example response shape
{
  "results": [
    {
      "entityType": "campaign | adset | ad",
      "id": "string",
      "name": "string",
      "status": "string",
      "adAccountId": "string"
    }
  ]
}
GET
/api/v1/time-breakdown

Performance by hour-of-day, day-of-week, or calendar day. Returns spend, impressions, clicks, conversions, and ROAS per bucket. Calls the Meta Insights API live — Meta accounts only.

Parameters

Query parameters for /api/v1/time-breakdown
NameTypeDescription
ad_account_id*stringAdFire ad account ID.
dimension*enumBreakdown dimension.(hour_of_day, day_of_week, day)
levelenumAggregation level (default: account).(account, campaign, adset, ad)
presetenumDate preset (default: 30d).(7d, 14d, 30d, 90d, 6m)
sincestringStart date YYYY-MM-DD (overrides preset).
untilstringEnd date YYYY-MM-DD (default: yesterday).
Example response shape
{
  "dimension": "hour_of_day",
  "data": [
    {
      "hour": 14,
      "spend": 45.20,
      "impressions": 12000,
      "clicks": 180,
      "conversions": 8,
      "roas": 3.4
    }
  ]
}
GET
/api/v1/analytics

Aggregated analytics. campaigns_by_roas ranks campaigns by ROAS with optional min/max filters. time_breakdown aggregates stored daily data by day-of-week.

Parameters

Query parameters for /api/v1/analytics
NameTypeDescription
ad_account_id*stringAdFire ad account ID.
metricenumAnalysis type (default: campaigns_by_roas).(campaigns_by_roas, time_breakdown)
roas_minnumberMinimum ROAS filter (campaigns_by_roas).
roas_maxnumberMaximum ROAS filter (campaigns_by_roas).
dimensionenumBreakdown dimension for time_breakdown.(hour_of_day, day_of_week)
periodenumMetrics window (default: 30d).(7d, 14d, 30d, 90d)
limitnumberMax campaigns returned (default 100).
Example response shape
// metric=campaigns_by_roas
{
  "metric": "campaigns_by_roas",
  "period": "30d",
  "filters": { "roas_min": 2.0, "roas_max": null },
  "count": 8,
  "campaigns": [
    {
      "id": "string",
      "name": "string",
      "status": "ACTIVE",
      "metrics": { "spend": 1234.56, "roas": 5.1, "conversions": 42, ... }
    }
  ]
}

// metric=time_breakdown&dimension=day_of_week
{
  "metric": "time_breakdown",
  "dimension": "day_of_week",
  "data": [
    {
      "day": 1,
      "day_name": "Monday",
      "spend": 890.40,
      "conversions": 38,
      "roas": 3.8,
      "ctr": 2.1,
      "days_sampled": 4
    }
  ]
}

Code examples

Replace af_sk_YOUR_KEY with your actual API key from Settings.

bash — curl
curl -H "Authorization: Bearer af_sk_YOUR_KEY" \
  "https://adfire.io/api/v1/campaigns?period=30d&sort_by=roas&sort_order=desc"
javascript — fetch
const res = await fetch(
  "https://adfire.io/api/v1/campaigns?period=30d&roas_min=2",
  {
    headers: {
      "Authorization": "Bearer af_sk_YOUR_KEY"
    }
  }
);
const { campaigns } = await res.json();
console.log(campaigns[0].metrics.roas);
python — requests
import requests

headers = {"Authorization": "Bearer af_sk_YOUR_KEY"}

# Get top campaigns by ROAS
resp = requests.get(
    "https://adfire.io/api/v1/campaigns",
    params={"period": "30d", "sort_by": "roas", "sort_order": "desc", "limit": 10},
    headers=headers,
)
data = resp.json()
for c in data["campaigns"]:
    print(c["name"], c["metrics"]["roas"])

References

AdFire speaks the platforms' own APIs. These are the primary sources for the fields and limits the endpoints above expose.

Try the API live

Settings, API & MCP has your API keys and a Try it button on every endpoint, so you can send real requests and read the responses without writing any code.

Open API settings →