Skip to content
SocialHelper
Get API key

Data tools

Your marketing data, on tap.

Connect Facebook, Instagram, Google Search Console and more once. Then your code or your AI agent can run their reports and lookups through the same API key and MCP server you post with.

How it works

List, then run.

A data account lists its tools with an input schema. Send the tool’s input as the JSON body and the result comes straight back.

  1. 1

    Connect the account

    Sign in with Google from Accounts in the dashboard. Each Google product connects on its own and asks only for its own access.

  2. 2

    List its tools

    GET /api/v1/accounts/{id}/tools returns each tool’s name, description, read_only flag and input_schema.

  3. 3

    Run one

    POST /api/v1/accounts/{id}/tools/{tool} with the input as the JSON body. It runs once, straight away.

curl https://socialhelper.app/api/v1/accounts/ACCOUNT_ID/tools \
  -H "Authorization: Bearer $SOCIALHELPER_API_KEY"
curl https://socialhelper.app/api/v1/accounts/ACCOUNT_ID/tools/search_analytics \
  -H "Authorization: Bearer $SOCIALHELPER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "site_url": "sc-domain:example.com",
      "start_date": "2026-09-01",
      "end_date": "2026-09-30",
      "dimensions": [
          "query"
      ],
      "row_limit": 10
  }'

list_posts

read-only

List the Page's most recent posts, newest first, with their text, permalink, creation time and reaction, comment and share counts.

limit integer
How many posts to return (1–50). default: 10
after string
The next_cursor from a previous call, to continue with older posts.

page_insights

read-only

Read Page Insights over time. Allowed metrics: page_media_view, page_total_media_view_unique, page_post_engagements, page_total_actions, page_views_total, page_follows, page_daily_follows_unique, page_daily_unfollows_unique, page_actions_post_reactions_total, page_video_views, page_video_views_organic, page_video_views_paid, page_video_complete_views_30s, page_video_view_time. page_follows, page_actions_post_reactions_total and page_video_view_time only support period "day". Meta needs the Page to have 100 or more followers, keeps two years of data and returns at most 90 days per request.

metrics array<string>
Metric names. Default: page_media_view, page_total_media_view_unique, page_post_engagements, page_daily_follows_unique, page_video_views.
period string
Aggregation of each value: one day, a rolling week, or a rolling 28 days. day | week | days_28 default: 'day'
since string
Start of the range, YYYY-MM-DD. Default: 28 days before until.
until string
End of the range, YYYY-MM-DD. Default: today (UTC).

post_insights

read-only

Read lifetime Insights for one of the Page's posts. Allowed metrics: post_media_view, post_total_media_view_unique, post_clicks, post_clicks_by_type, post_reactions_by_type_total, post_reactions_like_total, post_reactions_love_total, post_reactions_wow_total, post_reactions_haha_total, post_reactions_sorry_total, post_reactions_anger_total, post_video_views, post_video_views_organic, post_video_views_paid, post_video_avg_time_watched, post_video_view_time, post_video_complete_views_organic, post_video_complete_views_paid, post_video_length.

post_id* string
The post ID exactly as list_posts returns it ("{page-id}_{post-id}").
metrics array<string>
Metric names. Default: post_media_view, post_total_media_view_unique, post_clicks, post_reactions_by_type_total.

list_media

read-only

List the account's most recent posts, reels and carousels, newest first (stories are not included), with caption, media type, publish time, permalink, and like and comment counts. Counts are null where the owner hid them.

limit integer
How many to return (1–50). default: 10
after string
The next_cursor from a previous call, to page back to older media.

account_insights

read-only

Account-level insights summed over a date range (default: the last 24 hours), optionally broken down. Data can lag up to 48 hours; reach and accounts_engaged are estimates; follows_and_unfollows needs 100+ followers.

metrics* array<string>
Metrics to fetch, one or more of: accounts_engaged, comments, follows_and_unfollows, likes, profile_links_taps, reach, replies, reposts, saves, shares, total_interactions, views.
metric_type string
"total_value" for one total per metric (all metrics), or "time_series" for daily values (reach only). total_value | time_series default: 'total_value'
breakdown string
Split totals (total_value only): media_product_type (comments, likes, reach, saves, shares, total_interactions, views), follow_type (follows_and_unfollows, reach, views) or contact_button_type (profile_links_taps). media_product_type | follow_type | contact_button_type
since string
First day, YYYY-MM-DD (UTC). Required with until; the range can span at most 30 days.
until string
Last day, YYYY-MM-DD (UTC, inclusive). Defaults to now when since is given.

media_insights

read-only

Lifetime insights for one post, reel or carousel (as list_media returns it). Metrics that do not apply to the media type are rejected by Instagram. Data can lag up to 48 hours.

media_id* string
The media ID from list_media.
metrics* array<string>
Metrics to fetch, one or more of: comments (feed posts and reels); crossposted_views (reels shared to Facebook); facebook_views (media shared to Facebook); follows (feed posts and stories); ig_reels_avg_watch_time (reels); ig_reels_video_view_total_time (reels); likes (feed posts and reels); navigation (stories); profile_activity (feed posts and stories); profile_visits (feed posts and stories); reach (all media); reels_skip_rate (reels); replies (stories); reposts (all media); saved (feed posts and reels); shares (all media); total_interactions (all media); views (all media).

Google Search Console

Platform details →

list_sites

read-only

List the Search Console properties this account can access, with its permission level on each.

search_analytics

read-only

Query search performance (clicks, impressions, CTR, average position), optionally grouped by query, page, country, device, search appearance, date or hour. Dates are Pacific Time; data usually lags 2–3 days unless data_state is "all".

site_url* string
The property exactly as list_sites returns it, e.g. "https://example.com/" or "sc-domain:example.com".
start_date* string
First day, YYYY-MM-DD (inclusive).
end_date* string
Last day, YYYY-MM-DD (inclusive).
dimensions array<string>
Group rows by these, in order: query, page, country, device, searchAppearance, date, hour. Omit for one total row.
type string
Which results to count. web | image | video | news | discover | googleNews default: 'web'
filters array<object>
Filters, all of which must match. Each is {"dimension": "query|page|country|device|searchAppearance", "operator": "equals|notEquals|contains|notContains|includingRegex|excludingRegex", "expression": "…"}. Countries are ISO 3166-1 alpha-3 (e.g. "usa"); devices are DESKTOP, MOBILE or TABLET.
aggregation_type string
How to aggregate: by page or by property. "auto" lets Google choose. auto | byPage | byProperty default: 'auto'
data_state string
"final" for finished data only, "all" to include fresh (incomplete) data, "hourly_all" with the hour dimension. final | all | hourly_all default: 'final'
row_limit integer
Rows to return (1–25000). default: 100
start_row integer
Zero-based offset for paging. default: 0

inspect_url

read-only

Inspect how Google sees one URL of a property: index status, coverage, last crawl, canonical, mobile usability and rich results.

site_url* string
The property exactly as list_sites returns it, e.g. "https://example.com/" or "sc-domain:example.com".
url* string
The full URL to inspect; it must belong to the property.
language_code string
Language for translated issue messages, e.g. "en-US". default: 'en-US'

list_sitemaps

read-only

List the sitemaps submitted for a property, with their status, errors, warnings and indexed content counts.

site_url* string
The property exactly as list_sites returns it, e.g. "https://example.com/" or "sc-domain:example.com".

Google Analytics

Platform details →

list_properties

read-only

List the Google Analytics accounts this login can access, with their GA4 properties (resource name, display name and type).

run_report

read-only

Run a GA4 report: metrics (e.g. activeUsers, newUsers, sessions, screenPageViews, engagementRate, keyEvents, totalRevenue) over a date range, optionally broken down by up to 9 dimensions (e.g. date, sessionDefaultChannelGroup, sessionSource, pagePath, landingPage, country, deviceCategory). Use get_metadata for every name the property supports, including custom ones. Dates are in the property's time zone.

property* string
The GA4 property as list_properties returns it, e.g. "properties/123456789" (the bare number works too). Not the "G-…" measurement ID.
start_date* string
First day (inclusive): YYYY-MM-DD, "NdaysAgo" (e.g. "28daysAgo"), "yesterday" or "today".
end_date* string
Last day (inclusive): YYYY-MM-DD, "NdaysAgo", "yesterday" or "today".
metrics* array<string>
Metric API names, e.g. ["activeUsers", "sessions"].
dimensions array<string>
Dimension API names to group rows by, in order, e.g. ["date", "sessionDefaultChannelGroup"]. Omit for one total row.
dimension_filter object
A GA4 FilterExpression, sent as is, e.g. {"filter": {"fieldName": "country", "stringFilter": {"matchType": "EXACT", "value": "Canada"}}}. Combine with {"andGroup": {"expressions": […]}}, {"orGroup": …} or {"notExpression": …}.
order_by array
GA4 OrderBy objects, sent as is, e.g. [{"metric": {"metricName": "sessions"}, "desc": true}] or [{"dimension": {"dimensionName": "date"}}]. A single object is accepted too.
totals boolean
Also return the metric totals across all rows. default: false
limit integer
Rows to return (1–250000). default: 100
offset integer
Zero-based row offset for paging; row_count is the total. default: 0
keep_empty_rows boolean
Include rows whose metrics are all zero. default: false

run_realtime_report

read-only

Report on the last 30 minutes. Realtime supports fewer names: metrics activeUsers, eventCount, keyEvents, screenPageViews; dimensions such as country, city, deviceCategory, platform, eventName, unifiedScreenName, minutesAgo.

property* string
The GA4 property as list_properties returns it, e.g. "properties/123456789" (the bare number works too). Not the "G-…" measurement ID.
metrics* array<string>
Metric API names, e.g. ["activeUsers"].
dimensions array<string>
Dimension API names to group rows by, e.g. ["country"]. Omit for one total row.
limit integer
Rows to return (1–250000). default: 100

get_metadata

read-only

List the dimensions and metrics a property can report on, including its custom definitions, with their API names, UI names, descriptions and categories.

property* string
The GA4 property as list_properties returns it, e.g. "properties/123456789" (the bare number works too). Not the "G-…" measurement ID.

list_videos

read-only

List the channel's most recent uploads, newest first, with title, publish time, privacy and view, like and comment counts. Counts are null where the owner hid them.

max_results integer
How many videos to return (1–50). default: 10

channel_stats

read-only

Get the channel's totals: subscribers (rounded down to three significant figures by YouTube), views and public videos.

list_accessible_customers

read-only

List the Google Ads accounts this Google login can access directly, with name, currency, time zone, status and whether each is a manager (MCC) or test account. Accounts that can't be read (for example, not enabled) are listed with an error. Client accounts reached only through a manager are not listed; use list_child_accounts on the manager. Describes at most 50 accounts.

list_child_accounts

read-only

List the client accounts under a manager (MCC) account, with name, currency, time zone, status, whether each is itself a manager, and its level below the manager.

customer_id* string
The manager account's customer ID, with or without dashes, e.g. "123-456-7890".
login_customer_id string
Only when this Google login reaches customer_id through a manager (MCC) account: that manager's customer ID, e.g. "111-222-3333".
max_level integer
How many levels below the manager to include (1 = direct clients only). default: 1

search

read-only

Run a read-only Google Ads Query Language (GAQL) query, e.g. "SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS". Only SELECT queries are accepted. Rows are returned as Google sends them: camelCase field names, 64-bit numbers as strings, money in micros (millionths of the account currency). Reference: https://developers.google.com/google-ads/api/docs/query/overview

customer_id* string
The Google Ads account (customer) ID, with or without dashes, e.g. "123-456-7890". list_accessible_customers and list_child_accounts return them.
query* string
The GAQL query. Must start with SELECT.
login_customer_id string
Only when this Google login reaches customer_id through a manager (MCC) account: that manager's customer ID, e.g. "111-222-3333".
max_rows integer
Most rows to return (1–10000). Add a LIMIT clause to the query to keep results small. default: 1000

campaign_performance

read-only

Per-campaign performance for a date range: impressions, clicks, cost, conversions, conversion value, CTR and average CPC, with status and channel type, sorted by cost. Cost and CPC are in the account currency. Dates are in the account's time zone. Give start_date and end_date, or during (default LAST_30_DAYS, not including today).

customer_id* string
The Google Ads account (customer) ID, with or without dashes, e.g. "123-456-7890". list_accessible_customers and list_child_accounts return them.
start_date string
First day, YYYY-MM-DD (inclusive). Use with end_date.
end_date string
Last day, YYYY-MM-DD (inclusive). Use with start_date.
during string
A predefined range, instead of start_date and end_date. LAST_7_DAYS | LAST_30_DAYS | THIS_MONTH | LAST_MONTH
include_removed boolean
Include removed campaigns. default: false
login_customer_id string
Only when this Google login reaches customer_id through a manager (MCC) account: that manager's customer ID, e.g. "111-222-3333".

FAQ

Data tool questions.

What are data tools?

Operations a connected account offers besides posting, such as reports and lookups. Each tool has a name, a description and an input schema, and runs straight away when you call it.

Which accounts have tools?

Right now: Facebook, Instagram, Google Search Console, Google Analytics, YouTube and Google Ads.

Can a tool change anything?

Most tools only read. Any tool that makes a change is marked “makes changes” here and has read_only set to false in its description.

What happens if access is lost?

The call returns 409 with code reconnect_required, the account is flagged in the dashboard, and the account.needs_reconnect webhook fires.

Are tool calls retried?

No. Tools run once, synchronously. If the platform is busy you get 503 with code temporarily_unavailable, and a Retry-After header when the platform sent one.

Put your data to work.

Create a free account, connect an account and send your first post in a few minutes.