agencyreportingmulti-platform

Multi-Platform Agency Client Reporting with One API

Generate automated agency client reports covering Google, YouTube, Reddit, Amazon visibility. One API, four platforms.

6 min read

Agency client reports typically cover Google rankings, but clients increasingly ask about YouTube visibility, Reddit mentions, and Amazon product rankings. Pulling data from four separate tools means four logins, four exports, and manual stitching in Google Slides. A single search API that covers Google, YouTube, Reddit, and Amazon compresses this to one script that generates a unified report.

The reporting framework

Each platform answers a different question for the client:

  • Google: "Where do we rank for our target keywords?"
  • YouTube: "Are our videos appearing in search results?"
  • Reddit: "Are people talking about us, and what are they saying?"
  • Amazon: "Where do our products rank for key shopping terms?"

The multi-platform search function

Python
import requests, os, json
from datetime import date

HEADERS = {"x-api-key": os.environ["SCAVIO_API_KEY"]}
API_URL = "https://api.scavio.dev/api/v1/search"

def search_platform(query: str, platform: str, num_results: int = 10) -> list:
    """Search a specific platform via Scavio."""
    site_map = {
        "google": "",
        "youtube": "site:youtube.com ",
        "reddit": "site:reddit.com ",
        "amazon": "site:amazon.com ",
    }
    prefix = site_map.get(platform, "")
    resp = requests.post(API_URL, headers=HEADERS,
        json={"query": f"{prefix}{query}", "num_results": num_results},
        timeout=10)
    return resp.json().get("results", [])

Generating the client report

Python
def generate_client_report(client: dict) -> dict:
    """Generate a multi-platform visibility report.
    client: {"name": "Acme Co", "domain": "acme.com",
             "keywords": ["acme widget", "best widget 2026"],
             "youtube_channel": "AcmeCo",
             "amazon_brand": "Acme"}
    """
    report = {
        "client": client["name"],
        "date": date.today().isoformat(),
        "google": [],
        "youtube": [],
        "reddit": [],
        "amazon": [],
    }

    for kw in client["keywords"]:
        # Google rankings
        results = search_platform(kw, "google")
        position = None
        for i, r in enumerate(results):
            if client["domain"] in r.get("url", ""):
                position = i + 1
                break
        report["google"].append({"keyword": kw, "position": position})

        # YouTube presence
        yt_results = search_platform(kw, "youtube")
        yt_hits = [r for r in yt_results
                   if client.get("youtube_channel", "").lower() in r.get("url", "").lower()]
        report["youtube"].append({"keyword": kw, "videos_in_top_10": len(yt_hits)})

        # Reddit mentions
        reddit_results = search_platform(f"{client['name']} {kw}", "reddit")
        report["reddit"].append({"keyword": kw, "mentions": len(reddit_results)})

    # Amazon product rankings (if applicable)
    if client.get("amazon_brand"):
        for kw in client["keywords"][:5]:
            amz_results = search_platform(kw, "amazon")
            amz_pos = next((i + 1 for i, r in enumerate(amz_results)
                if client["amazon_brand"].lower() in r.get("title", "").lower()), None)
            report["amazon"].append({"keyword": kw, "position": amz_pos})

    return report

Formatting the report

Python
def format_report(report: dict) -> str:
    """Format report as plain text for email or Slack."""
    lines = [
        f"Visibility Report: {report['client']}",
        f"Date: {report['date']}",
        "",
        "-- Google Rankings --",
    ]
    for g in report["google"]:
        pos = g["position"] or "not in top 10"
        lines.append(f"  {g['keyword']}: #{pos}")

    for section, label, fmt in [
        ("youtube", "YouTube Presence", lambda x: f"{x['videos_in_top_10']} videos in top 10"),
        ("reddit", "Reddit Mentions", lambda x: f"{x['mentions']} threads found"),
        ("amazon", "Amazon Rankings", lambda x: f"#{x['position'] or 'not found'}"),
    ]:
        if report.get(section):
            lines.append(f"\n-- {label} --")
            for item in report[section]:
                lines.append(f"  {item['keyword']}: {fmt(item)}")

    return "\n".join(lines)

# Generate and print
client = {
    "name": "Acme Co",
    "domain": "acme.com",
    "keywords": ["acme widget", "best widget 2026", "widget comparison"],
    "youtube_channel": "AcmeCo",
    "amazon_brand": "Acme",
}
report = generate_client_report(client)
print(format_report(report))

Cost per client report

5 keywords across 4 platforms = 20 searches per client per report. Weekly reports for 5 clients: 100 searches/week, 400/mo. At $0.005/credit: $2/mo. Monthly reports: 100 searches/mo, $0.50/mo.

What dedicated tools do better

Google Search Console gives actual click/impression data for free. YouTube Studio provides watch time, CTR, and audience retention. Brandwatch offers sentiment analysis and volume trends. Jungle Scout gives Amazon-specific estimated sales and PPC analytics. A search API gives a lightweight cross-platform snapshot. For clients who want a simple "where do we show up" report, this approach is enough. For actionable per-platform analytics, you still need dedicated tools.