Skip to content

Insights

The Insights edge returns delivery and conversion metrics for an ad account or for any object below it. It is the only way to read performance data. Every object exposes it:

Verify against Ads Manager

The same report is available on screen at ads-manager.huydata.com with the platform's own column names; its Totals row is the reference for your pipeline. See Ads Manager.

Endpoint Default level Scope
GET /act_<account_id>/insights account Everything in the account. Use level to break it down.
GET /<campaign_id>/insights campaign One campaign.
GET /<adset_id>/insights adset One ad set.
GET /<ad_id>/insights ad One ad.

For a daily pull, the account endpoint with level=ad and time_increment=1 is the most efficient: one paginated request per account per day range.

How a response is shaped

{
  "data": [
    {
      "campaign_id": "12020064400866904",
      "campaign_name": "DMS_FB_AND_T1_INSTALL_202604",
      "spend": "854.51",
      "impressions": "81675",
      "clicks": "556",
      "actions": [
        { "action_type": "video_view", "value": "29369" },
        { "action_type": "link_click", "value": "556" },
        { "action_type": "mobile_app_install", "value": "127" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "10" },
        { "action_type": "omni_purchase", "value": "10" }
      ],
      "date_start": "2026-10-26",
      "date_stop": "2026-10-26"
    },
    "..."
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0OjI" },
    "next": "https://graph.huydata.com/v21.0/act_199454714457591/insights?...&after=b2Zmc2V0OjI"
  }
}

Each element of data is one row: one object at the requested level, one time bucket (date_start/date_stop), and, if breakdowns=country was used, one country. Four rules apply to every row:

  1. All metric values are strings, including counts ("impressions": "81675") and money ("spend": "854.51"). Convert them yourself.
  2. date_start and date_stop are always present, even if you did not request them.
  3. Rows with no delivery are not returned. If an ad did not spend on a day, or did not spend in a country, there is no row for it. The absence of a row means zero.
  4. Conversion metrics are arrays of { "action_type", "value" }, not flat numbers. See Actions and action values.

Parameters

Parameter Type Required Description
access_token string yes Personal token (or Authorization: Bearer).
level string no Aggregation level: account, campaign, adset or ad. Default depends on the endpoint (see table above).
fields string no Comma-separated list of dimensions and metrics (see below). Default impressions,spend,clicks,actions.
time_range JSON object no {"since":"YYYY-MM-DD","until":"YYYY-MM-DD"}, both inclusive, UTC. Must be URL-encoded. Takes precedence over date_preset.
date_preset string no Relative range: yesterday, last_3d, last_7d, last_14d, last_28d, last_30d, last_90d, this_month, last_month, maximum, today. See below.
time_increment string no all_days (default): one bucket for the whole range. 1: one bucket per day. Any integer 1–90: buckets of N days. monthly: calendar months.
breakdowns string no Only country is supported. Adds a country key to each row and splits rows by country.
filtering JSON array no [{"field":..., "operator":..., "value":...}]. See Filtering. Must be URL-encoded.
limit int no Rows per page. Default 25, maximum 500 (larger values are clamped to 500).
after string no Cursor from a previous page. See Paging.

If neither time_range nor date_preset is given, the range is the last 30 days ending yesterday.

time_range

A JSON object with since and until in YYYY-MM-DD. Both are inclusive. With curl, pass it through --data-urlencode so the braces and quotes are encoded:

curl -G "https://graph.huydata.com/v21.0/act_199454714457591/insights" \
  -d "access_token=$META_ACCESS_TOKEN" \
  --data-urlencode 'time_range={"since":"2026-10-25","until":"2026-10-27"}'

Days that are not yet available (today and the future) are silently dropped from the range; days before 2026-06-30 (the start of the history) likewise. A range that is entirely unavailable returns {"data": []}. A range with until before since is error 100.

date_preset

Preset Range (today = T, in UTC)
yesterday T-1
last_3d T-3 .. T-1
last_7d T-7 .. T-1
last_14d, last_28d, last_30d, last_90d T-N .. T-1
this_month first day of the current month .. T-1
last_month the whole previous calendar month
maximum 2026-06-30 .. T-1
today T. Always returns no rows, because today's data is not yet available.

time_increment

Value Result
all_days (default) One row per object covering the whole range. date_start = since, date_stop = until. Use this for totals.
1 One row per object per day. date_start = date_stop = the report date. Use this for a daily pull.
7, 14, ... (1–90) Buckets of N days counted from since. The last bucket may be shorter.
monthly Calendar months, clipped to the range.

The default is all_days, so a request without time_increment over a 30-day range gives you a single aggregated row, not 30 daily rows.

fields

Fields fall into two groups. Dimensions describe the row, metrics measure it.

Dimensions

Field Allowed at level Description
account_id all Numeric account id (no act_).
account_name all Account name, e.g. Dragon Merge Saga (Android).
campaign_id, campaign_name campaign, adset, ad Parent campaign.
adset_id, adset_name adset, ad Parent ad set.
ad_id, ad_name ad The ad.
objective all Always OUTCOME_APP_PROMOTION.
date_start, date_stop all Bucket boundaries; always returned anyway.

Requesting a dimension that is finer than the level (for example ad_name with level=campaign) is error 100: (#100) ad_name is not available at this level; raise the level parameter.

Metrics

Field Type Description
spend string, 2 decimals Amount spent in USD. "854.51".
impressions string, integer Times the ad was shown.
reach string, integer Distinct people reached.
frequency string, 6 decimals impressions / reach.
clicks string, integer All clicks. Equals the link_click action.
ctr string, 6 decimals Click-through rate in percent: clicks / impressions * 100. "0.680747" means 0.68 %.
cpc string, 6 decimals spend / clicks.
cpm string, 6 decimals spend / impressions * 1000.
actions array Conversion counts by action_type. See below.
action_values array Conversion value (USD) by action_type. See below.
cost_per_action_type array spend / actions by action_type. See below.
purchase_roas array purchase value / spend as omni_purchase. See below.
video_play_actions array [{ "action_type": "video_view", "value": "..." }], or [] for image ads.

Requesting a name that is neither a dimension nor a metric (for example installs) is error 100: (#100) installs is not valid for fields param. please check ... for all valid values.

Actions and action values

Conversions are not separate columns. They are entries in the actions array, keyed by action_type. The same keys are used in action_values, cost_per_action_type and purchase_roas.

action_type In actions In action_values In cost_per_action_type Meaning
video_view count (omitted for image ads) — — Video plays.
link_click count, always present — always present Clicks. Same number as the clicks metric.
mobile_app_install count, always present — present when > 0 App installs.
app_custom_event.fb_mobile_purchase count, present when > 0 USD, present when > 0 present when > 0 In-app purchases and their value.
omni_purchase count, present when > 0 USD, present when > 0 — Duplicate of fb_mobile_purchase. Same count, same value. Do not add the two together.

Practical reading rules:

  • Installs = the mobile_app_install entry of actions. Missing entry means 0 (it is in fact always present, possibly as "0").
  • Purchases = the app_custom_event.fb_mobile_purchase entry of actions. Missing means
  • When it is present, omni_purchase is present with the identical value: pick one of the two.
  • Purchase value = the app_custom_event.fb_mobile_purchase entry of action_values. When there are no purchases, action_values is [].
  • purchase_roas is [{ "action_type": "omni_purchase", "value": "0.316134" }], i.e. purchase value divided by spend; [] when there are no purchases. A value of "0.316134" is a 31.6 % return on ad spend.
  • cost_per_action_type gives spend / count for link_click (always), mobile_app_install and app_custom_event.fb_mobile_purchase (when the count is > 0).

Example of a campaign-level row with every metric requested:

curl -G "https://graph.huydata.com/v21.0/act_199454714457591/insights" \
  -d "access_token=$META_ACCESS_TOKEN" \
  -d "level=campaign" \
  -d "fields=campaign_id,campaign_name,objective,spend,impressions,reach,frequency,clicks,ctr,cpc,cpm,actions,action_values,cost_per_action_type,purchase_roas,video_play_actions" \
  --data-urlencode 'time_range={"since":"2026-10-26","until":"2026-10-26"}' \
  -d "time_increment=1"
{
  "data": [
    {
      "campaign_id": "12020064400866904",
      "campaign_name": "DMS_FB_AND_T1_INSTALL_202604",
      "objective": "OUTCOME_APP_PROMOTION",
      "spend": "854.51",
      "impressions": "81675",
      "reach": "57463",
      "frequency": "1.421349",
      "clicks": "556",
      "ctr": "0.680747",
      "cpc": "1.536888",
      "cpm": "10.462320",
      "actions": [
        { "action_type": "video_view", "value": "29369" },
        { "action_type": "link_click", "value": "556" },
        { "action_type": "mobile_app_install", "value": "127" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "10" },
        { "action_type": "omni_purchase", "value": "10" }
      ],
      "action_values": [
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "270.14" },
        { "action_type": "omni_purchase", "value": "270.14" }
      ],
      "cost_per_action_type": [
        { "action_type": "link_click", "value": "1.536888" },
        { "action_type": "mobile_app_install", "value": "6.728425" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "85.451000" }
      ],
      "purchase_roas": [
        { "action_type": "omni_purchase", "value": "0.316134" }
      ],
      "video_play_actions": [
        { "action_type": "video_view", "value": "29369" }
      ],
      "date_start": "2026-10-26",
      "date_stop": "2026-10-26"
    },
    {
      "campaign_id": "12025898431825415",
      "campaign_name": "DMS_FB_AND_T1_VALUE_202607",
      "objective": "OUTCOME_APP_PROMOTION",
      "spend": "1830.18",
      "impressions": "162767",
      "reach": "117582",
      "frequency": "1.384285",
      "clicks": "1035",
      "ctr": "0.635878",
      "cpc": "1.768290",
      "cpm": "11.244171",
      "actions": [
        { "action_type": "video_view", "value": "53544" },
        { "action_type": "link_click", "value": "1035" },
        { "action_type": "mobile_app_install", "value": "151" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "16" },
        { "action_type": "omni_purchase", "value": "16" }
      ],
      "action_values": [
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "550.78" },
        { "action_type": "omni_purchase", "value": "550.78" }
      ],
      "cost_per_action_type": [
        { "action_type": "link_click", "value": "1.768290" },
        { "action_type": "mobile_app_install", "value": "12.120397" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "114.386250" }
      ],
      "purchase_roas": [
        { "action_type": "omni_purchase", "value": "0.300943" }
      ],
      "video_play_actions": [
        { "action_type": "video_view", "value": "53544" }
      ],
      "date_start": "2026-10-26",
      "date_stop": "2026-10-26"
    },
    "..."
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0OjQ" }
  }
}

Examples

Account totals, default parameters

curl -G "https://graph.huydata.com/v21.0/act_199454714457591/insights" \
  -d "access_token=$META_ACCESS_TOKEN"

Defaults: level=account, fields=impressions,spend,clicks,actions, last 30 days, time_increment=all_days. One row.

{
  "data": [
    {
      "impressions": "17299780",
      "spend": "159788.39",
      "clicks": "115457",
      "actions": [
        { "action_type": "video_view", "value": "5165172" },
        { "action_type": "link_click", "value": "115457" },
        { "action_type": "mobile_app_install", "value": "21315" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "1486" },
        { "action_type": "omni_purchase", "value": "1486" }
      ],
      "date_start": "2026-09-30",
      "date_stop": "2026-10-29"
    }
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0OjE" }
  }
}

Account level, one row per day

curl -G "https://graph.huydata.com/v21.0/act_199454714457591/insights" \
  -d "access_token=$META_ACCESS_TOKEN" \
  -d "level=account" \
  -d "fields=account_id,account_name,spend,impressions,clicks,actions" \
  --data-urlencode 'time_range={"since":"2026-10-25","until":"2026-10-27"}' \
  -d "time_increment=1"
{
  "data": [
    {
      "account_id": "199454714457591",
      "account_name": "Dragon Merge Saga (Android)",
      "spend": "6187.32",
      "impressions": "669111",
      "clicks": "4324",
      "actions": [
        { "action_type": "video_view", "value": "199847" },
        { "action_type": "link_click", "value": "4324" },
        { "action_type": "mobile_app_install", "value": "778" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "58" },
        { "action_type": "omni_purchase", "value": "58" }
      ],
      "date_start": "2026-10-25",
      "date_stop": "2026-10-25"
    },
    {
      "account_id": "199454714457591",
      "account_name": "Dragon Merge Saga (Android)",
      "spend": "5025.29",
      "impressions": "541763",
      "clicks": "3585",
      "actions": [
        { "action_type": "video_view", "value": "168431" },
        { "action_type": "link_click", "value": "3585" },
        { "action_type": "mobile_app_install", "value": "658" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "49" },
        { "action_type": "omni_purchase", "value": "49" }
      ],
      "date_start": "2026-10-26",
      "date_stop": "2026-10-26"
    },
    "..."
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0OjM" }
  }
}

Ad level, daily, broken down by country

This is the shape most daily pulls want. Note the extra country key, and that the same ad appears once per country it delivered in.

curl -G "https://graph.huydata.com/v21.0/act_199454714457591/insights" \
  -d "access_token=$META_ACCESS_TOKEN" \
  -d "level=ad" \
  -d "fields=campaign_name,adset_name,ad_id,ad_name,spend,impressions,clicks,actions,action_values" \
  -d "breakdowns=country" \
  --data-urlencode 'time_range={"since":"2026-10-27","until":"2026-10-27"}' \
  -d "time_increment=1" \
  -d "limit=500"
{
  "data": [
    {
      "campaign_name": "DMS_FB_AND_T1_INSTALL_202604",
      "adset_name": "T1_Interest_Gaming_AU-CA-DE",
      "ad_id": "12022015737750702",
      "ad_name": "VID_UpgradeLoop_v3",
      "spend": "46.47",
      "impressions": "5175",
      "clicks": "35",
      "actions": [
        { "action_type": "video_view", "value": "2153" },
        { "action_type": "link_click", "value": "35" },
        { "action_type": "mobile_app_install", "value": "6" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "1" },
        { "action_type": "omni_purchase", "value": "1" }
      ],
      "action_values": [
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "32.15" },
        { "action_type": "omni_purchase", "value": "32.15" }
      ],
      "country": "AU",
      "date_start": "2026-10-27",
      "date_stop": "2026-10-27"
    },
    {
      "campaign_name": "DMS_FB_AND_T1_INSTALL_202604",
      "adset_name": "T1_Interest_Gaming_AU-CA-DE",
      "ad_id": "12022015737750702",
      "ad_name": "VID_UpgradeLoop_v3",
      "spend": "49.10",
      "impressions": "4470",
      "clicks": "30",
      "actions": [
        { "action_type": "video_view", "value": "2081" },
        { "action_type": "link_click", "value": "30" },
        { "action_type": "mobile_app_install", "value": "8" }
      ],
      "action_values": [],
      "country": "CA",
      "date_start": "2026-10-27",
      "date_stop": "2026-10-27"
    },
    "..."
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0Ojgy" }
  }
}

In the second row there were no purchases in Canada, so actions has no purchase entries and action_values is []. The whole day is 82 rows, so one page of 500 holds it and there is no paging.next; the same request for a 7-day range returns a full first page of 500 rows plus paging.next.

One campaign over a preset range

curl -G "https://graph.huydata.com/v21.0/12020064400866904/insights" \
  -d "access_token=$META_ACCESS_TOKEN" \
  -d "fields=campaign_name,spend,impressions,clicks,actions" \
  -d "date_preset=last_7d"
{
  "data": [
    {
      "campaign_name": "DMS_FB_AND_T1_INSTALL_202604",
      "spend": "6470.65",
      "impressions": "616538",
      "clicks": "4123",
      "actions": [
        { "action_type": "video_view", "value": "223712" },
        { "action_type": "link_click", "value": "4123" },
        { "action_type": "mobile_app_install", "value": "934" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "52" },
        { "action_type": "omni_purchase", "value": "52" }
      ],
      "date_start": "2026-10-23",
      "date_stop": "2026-10-29"
    }
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0OjE" }
  }
}

Monthly buckets

curl -G "https://graph.huydata.com/v21.0/act_199454714457591/insights" \
  -d "access_token=$META_ACCESS_TOKEN" \
  -d "fields=spend,impressions" \
  --data-urlencode 'time_range={"since":"2026-09-15","until":"2026-10-27"}' \
  -d "time_increment=monthly"
{
  "data": [
    { "spend": "79939.49", "impressions": "8742063", "date_start": "2026-09-15", "date_stop": "2026-09-30" },
    { "spend": "144193.18", "impressions": "15608896", "date_start": "2026-10-01", "date_stop": "2026-10-27" }
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0OjI" }
  }
}

Filtering

filtering is a JSON array of rules. All rules must match (logical AND). Filtering is applied before aggregation, so you can filter on country even without breakdowns=country, and on ad.id even at level=campaign.

field Matches
campaign.id, adset.id, ad.id Object ids.
campaign.name, adset.name, ad.name Object names.
country ISO country code.
operator value Meaning
IN array (or scalar) Field is one of the values.
NOT_IN array (or scalar) Field is none of the values.
EQUAL scalar Exact match.
NOT_EQUAL scalar Not equal.
CONTAIN string Field contains the substring. Useful on names, e.g. "_VALUE_".
curl -G "https://graph.huydata.com/v21.0/act_199454714457591/insights" \
  -d "access_token=$META_ACCESS_TOKEN" \
  -d "level=adset" \
  -d "fields=adset_id,adset_name,spend,impressions,actions" \
  --data-urlencode 'filtering=[{"field":"campaign.id","operator":"IN","value":["12020064400866904"]}]' \
  --data-urlencode 'time_range={"since":"2026-10-27","until":"2026-10-27"}'
{
  "data": [
    {
      "adset_id": "12024481725776212",
      "adset_name": "T1_Interest_Gaming_AU-CA-DE",
      "spend": "445.61",
      "impressions": "45976",
      "actions": [
        { "action_type": "video_view", "value": "18504" },
        { "action_type": "link_click", "value": "330" },
        { "action_type": "mobile_app_install", "value": "75" },
        { "action_type": "app_custom_event.fb_mobile_purchase", "value": "2" },
        { "action_type": "omni_purchase", "value": "2" }
      ],
      "date_start": "2026-10-27",
      "date_stop": "2026-10-27"
    },
    {
      "adset_id": "12029269518058219",
      "adset_name": "T1_Broad_AU-CA-DE-GB-US",
      "spend": "246.58",
      "impressions": "21631",
      "actions": [
        { "action_type": "video_view", "value": "9208" },
        { "action_type": "link_click", "value": "140" },
        { "action_type": "mobile_app_install", "value": "27" }
      ],
      "date_start": "2026-10-27",
      "date_stop": "2026-10-27"
    },
    "..."
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0OjM" }
  }
}

Country filter combined with a country breakdown:

curl -G "https://graph.huydata.com/v21.0/act_199454714457591/insights" \
  -d "access_token=$META_ACCESS_TOKEN" \
  -d "level=campaign" \
  -d "fields=campaign_name,spend,impressions" \
  -d "breakdowns=country" \
  --data-urlencode 'filtering=[{"field":"country","operator":"IN","value":["US","GB"]}]' \
  --data-urlencode 'time_range={"since":"2026-10-27","until":"2026-10-27"}'
{
  "data": [
    { "campaign_name": "DMS_FB_AND_T1_INSTALL_202604", "spend": "45.46", "impressions": "3999", "country": "GB", "date_start": "2026-10-27", "date_stop": "2026-10-27" },
    { "campaign_name": "DMS_FB_AND_T1_INSTALL_202604", "spend": "266.44", "impressions": "21787", "country": "US", "date_start": "2026-10-27", "date_stop": "2026-10-27" },
    "..."
  ],
  "paging": {
    "cursors": { "before": "b2Zmc2V0OjA", "after": "b2Zmc2V0OjI" },
    "next": "https://graph.huydata.com/v21.0/act_199454714457591/insights?...&after=b2Zmc2V0OjI"
  }
}

Row ordering

Rows are sorted by date_start, then by object id(s), then by country. Within a page the order is stable, and paging walks the full sorted list, so a daily pull that follows paging.next to the end sees every row exactly once.

Data freshness and the attribution window

Two timing rules determine when you should pull and what you should re-pull.

A report date becomes available at 00:10 UTC of the next day

Metrics are reported per UTC calendar day. The row for report date D exists from 00:10 UTC on D+1. Before that, requests covering D return no rows for D (the day is simply dropped from the range, no error). So:

  • The latest report date you can read today is yesterday (D-1).
  • date_preset=today always returns {"data": []}.
  • Schedule a daily pull after 00:10 UTC and request yesterday.

Installs and purchases keep growing for 3 days

Spend, impressions, reach, clicks and video views are final when the day is first published. Conversions are not: installs are attributed to the ad click that caused them, and a user may install or buy up to several days after clicking. The API therefore keeps adding attributed installs and purchase value to a report date until the date is 3 days old. After that the row is frozen.

Here is the same report date, 2026-10-24, read on four consecutive days (level=account, time_range = that single day):

Read on (UTC) Age of the date spend impressions mobile_app_install fb_mobile_purchase count fb_mobile_purchase value
2026-10-25 1 day 5479.68 612987 661 43 1045.68
2026-10-26 2 days 5479.68 612987 717 46 1304.54
2026-10-27 3 days 5479.68 612987 740 48 1395.41
2026-10-28 4 days 5479.68 612987 740 48 1395.41

Installs and purchase count both rose by about 12 % between the first and the final reading; purchase value by about 33 %. cost_per_action_type and purchase_roas move accordingly, since they are derived from these numbers. At row level (one ad, one country, one day) the change is typically 0 or 1 install or purchase, which is why you must replace whole rows rather than compare single cells.

What this means for a daily pull. Pulling only yesterday is not enough. Every day, request the last 3 report dates (date_preset=last_3d with time_increment=1, or an explicit time_range from D-3 to D-1) and replace what you previously stored for those dates with the new values. Rows for D-3 are final; D-2 and D-1 will still change. Any report date 3 or more days old never changes again and does not need to be re-pulled.

Errors specific to insights

All are HTTP 400, type OAuthException, code 100.

Message Cause
(#100) Invalid parameter: level must be one of account, campaign, adset, ad Bad level.
(#100) installs is not valid for fields param. please check https://ads-docs.huydata.com/meta/insights/ for all valid values Unknown name in fields. Installs live inside actions.
(#100) ad_name is not available at this level; raise the level parameter A dimension finer than level.
(#100) time_range must be a JSON object with 'since' and 'until' in YYYY-MM-DD time_range is not valid JSON, or not URL-encoded, or dates are malformed.
(#100) time_range until must be on or after since Reversed range.
(#100) Invalid parameter: date_preset 'last_week' is not supported Unknown preset.
(#100) time_increment must be an integer between 1 and 90, 'monthly' or 'all_days' Bad time_increment.
(#100) Invalid parameter: breakdowns value 'age' is not supported (only country) Only country is available.
(#100) filtering must be a JSON array of {field, operator, value} filtering is not a JSON array.
(#100) Filtering field 'xyz' is not supported / Filtering operator 'xyz' is not supported Unsupported filter field or operator.
{
  "error": {
    "message": "(#100) time_range must be a JSON object with 'since' and 'until' in YYYY-MM-DD",
    "type": "OAuthException",
    "code": 100,
    "fbtrace_id": "AJBONhJdyY0v1p5rEw4X0"
  }
}