@trillboards/cli 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,7 +20,7 @@ $ npm install -g @trillboards/cli
20
20
  $ trillboards COMMAND
21
21
  running command...
22
22
  $ trillboards (--version)
23
- @trillboards/cli/0.1.9 linux-x64 node-v22.23.4
23
+ @trillboards/cli/0.1.10 linux-x64 node-v22.23.4
24
24
  $ trillboards --help [COMMAND]
25
25
  USAGE
26
26
  $ trillboards COMMAND
@@ -599,14 +599,19 @@ One approved metric answered for a day or window, at its grain.
599
599
  ```
600
600
  USAGE
601
601
  $ trillboards generated generated-approved-metric-get METRIC [--api-key <value>] [--base-url <value>] [--format json|table|yaml]
602
- [--board_id <value>] [--brands <value>] [--by <value>] [--day <value>] [--daypart <value>] [--dimensions <value>]
603
- [--grade <value>] [--grain <value>] [--markets <value>] [--population <value>] [--screens <value>] [--stats <value>]
604
- [--window <value>] [--window_end <value>]
602
+ [--agencies <value>] [--board_id <value>] [--boards <value>] [--brands <value>] [--by <value>] [--categories
603
+ <value>] [--cbsas <value>] [--day <value>] [--daypart <value>] [--dimensions <value>] [--formats <value>] [--grade
604
+ <value>] [--grain <value>] [--markets <value>] [--media_owners <value>] [--parents <value>] [--population <value>]
605
+ [--screens <value>] [--stats <value>] [--surfaces <value>] [--window <value>] [--window_end <value>]
605
606
 
606
607
  ARGUMENTS
607
608
  METRIC An approved metric name.
608
609
 
609
610
  FLAGS
611
+ --agencies=<value>
612
+ Agency names, |-separated (or repeated): the brands one of them holds as agency of record (Winmo), any case. Taken
613
+ by: creative_brand_history.
614
+
610
615
  --api-key=<value>
611
616
  [env: TRILLBOARDS_API_KEY] API key (or set TRILLBOARDS_API_KEY env var)
612
617
 
@@ -616,12 +621,22 @@ FLAGS
616
621
  --board_id=<value>
617
622
  Board face id (board metrics). Taken by: board_measured_impressions_per_spot, board_pass_audience.
618
623
 
624
+ --boards=<value>
625
+ Face keys, |-separated (or repeated): f:<board id>:<face index> or p:<point id>. Taken by: creative_brand_history.
626
+
619
627
  --brands=<value>
620
628
  Comma-separated resolved brand ids. Taken by: creative_brand_history.
621
629
 
622
630
  --by=<value>
623
631
  Condition scope (board metrics): daypart, light, weather or speed. Taken by: board_measured_impressions_per_spot.
624
632
 
633
+ --categories=<value>
634
+ Comma-separated IAB tier-1 codes (IAB1..IAB25): the brands of those categories. A slice filter narrows the
635
+ denominators with the rows. Taken by: creative_brand_history.
636
+
637
+ --cbsas=<value>
638
+ Comma-separated 5-digit Census CBSA codes (OMB July 2023 delineation). Taken by: creative_brand_history.
639
+
625
640
  --day=<value>
626
641
  One day (YYYY-MM-DD). Give day or window; neither is the last settled day. Taken by: camera_people_per_screen_hour,
627
642
  camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct, demographic_share, sensing_census,
@@ -633,12 +648,18 @@ FLAGS
633
648
  Daypart filter (board metrics). Taken by: board_measured_impressions_per_spot, board_pass_audience.
634
649
 
635
650
  --dimensions=<value>
636
- Comma-separated audience dimensions (dimension= is the one-value spelling). Taken by: demographic_share.
651
+ Comma-separated dimensions (dimension= is the one-value spelling): the audience dimensions of a demographics metric
652
+ (default all), or the slices creative_brand_history cuts its rows by (category, parent, agency, media_owner, format,
653
+ surface, board, cbsa; default none), every share over its slice. Taken by: demographic_share,
654
+ creative_brand_history.
637
655
 
638
656
  --format=<option>
639
657
  Output format
640
658
  <options: json|table|yaml>
641
659
 
660
+ --formats=<value>
661
+ Comma-separated face formats: static, digital. Taken by: creative_brand_history.
662
+
642
663
  --grade=<value>
643
664
  Camera evidence grade: face_backed or person_backed. Taken by: camera_people_per_screen_hour,
644
665
  camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct.
@@ -655,6 +676,14 @@ FLAGS
655
676
  creative_street_presence, creative_vacancy_rate, creative_brand_history, seatbelt_compliance,
656
677
  seatbelt_unbuckled_ride_rate.
657
678
 
679
+ --media_owners=<value>
680
+ Media owner names, |-separated (or repeated): the faces whose registry owner holds a name's letters and digits, any
681
+ case and punctuation. Taken by: creative_brand_history.
682
+
683
+ --parents=<value>
684
+ Comma-separated brand graph ids: the brands whose parent company is in one of those Wikidata families. Taken by:
685
+ creative_brand_history.
686
+
658
687
  --population=<value>
659
688
  The population the shares are over. Taken by: sensing_census, same_panel_index.
660
689
 
@@ -667,6 +696,9 @@ FLAGS
667
696
  Comma-separated statistics (mean, p50, ...), from the metric's allowed stats. Taken by:
668
697
  camera_people_per_screen_hour, camera_head_pose_index.
669
698
 
699
+ --surfaces=<value>
700
+ Comma-separated reader surfaces: billboard, digital_board, bus_shelter, kiosk. Taken by: creative_brand_history.
701
+
670
702
  --window=<value>
671
703
  An inclusive span, YYYY-MM-DD..YYYY-MM-DD, up to the metric's max_window_days. Taken by:
672
704
  camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct, demographic_share,
@@ -1056,28 +1088,34 @@ Ad-sighting records: outdoor ads our cab cameras read, each with a signed photo
1056
1088
 
1057
1089
  ```
1058
1090
  USAGE
1059
- $ trillboards generated generated-data-api-ad-sightings [--api-key <value>] [--base-url <value>] [--format json|table|yaml] [--brand <value>]
1060
- [--brand_id <value>] [--market <value>] [--surface <value>] [--board_id <value>] [--creative_id <value>]
1061
- [--instrument <value>] [--from <value>] [--to <value>] [--limit <value>] [--cursor <value>]
1091
+ $ trillboards generated generated-data-api-ad-sightings [--api-key <value>] [--base-url <value>] [--format json|table|yaml] [--brand
1092
+ <value>...] [--brand_id <value>...] [--market <value>...] [--surface <value>...] [--board_id <value>...]
1093
+ [--creative_id <value>...] [--instrument <value>...] [--category <value>...] [--media_owner <value>...] [--from
1094
+ <value>] [--to <value>] [--limit <value>] [--cursor <value>]
1062
1095
 
1063
1096
  FLAGS
1064
- --api-key=<value> [env: TRILLBOARDS_API_KEY] API key (or set TRILLBOARDS_API_KEY env var)
1065
- --base-url=<value> [default: https://api.trillboards.com] API base URL
1066
- --board_id=<value> A board the sighting was matched to, repeatable.
1067
- --brand=<value> A brand, repeatable for a brand set (competitors). Matched however it is typed: "McDonald's",
1068
- "mcdonalds" and "Mc Donalds" find the same records.
1069
- --brand_id=<value> A resolved brand id, repeatable. Combined with `brand` as either-or.
1070
- --creative_id=<value> A sighted creative (the campaign artwork), repeatable.
1071
- --cursor=<value> The `next_cursor` of the previous page.
1072
- --format=<option> Output format
1073
- <options: json|table|yaml>
1074
- --from=<value> Start (inclusive), YYYY-MM-DD or an ISO-8601 instant. Default: 30 days before `to`.
1075
- --instrument=<value> The reading instrument (ssr-v2, ssr-v1, vlmtext-v1, edge_ocr_v1), repeatable.
1076
- --limit=<value> Records per page, 1..500 (default 50). The page limit is reserved; the records returned are
1077
- billed.
1078
- --market=<value> A market as COUNTRY:CODE (US DMA or CA CMA), repeatable.
1079
- --surface=<value> The surface kind as read (billboard, storefront, bus_shelter, ...), repeatable.
1080
- --to=<value> End (exclusive). Default: now. The span is at most 400 days.
1097
+ --api-key=<value> [env: TRILLBOARDS_API_KEY] API key (or set TRILLBOARDS_API_KEY env var)
1098
+ --base-url=<value> [default: https://api.trillboards.com] API base URL
1099
+ --board_id=<value>... A board the sighting was matched to, repeatable.
1100
+ --brand=<value>... A brand, repeatable for a brand set (competitors). Matched however it is typed:
1101
+ "McDonald's", "mcdonalds" and "Mc Donalds" find the same records.
1102
+ --brand_id=<value>... A resolved brand id, repeatable. Combined with `brand` as either-or.
1103
+ --category=<value>... The brand's IAB tier-1 category (IAB1..IAB25), repeatable: the records whose resolved brand
1104
+ votes in it (brand_knowledge_graph.iab_category, the `category` field).
1105
+ --creative_id=<value>... A sighted creative (the campaign artwork), repeatable.
1106
+ --cursor=<value> The `next_cursor` of the previous page.
1107
+ --format=<option> Output format
1108
+ <options: json|table|yaml>
1109
+ --from=<value> Start (inclusive), YYYY-MM-DD or an ISO-8601 instant. Default: 30 days before `to`.
1110
+ --instrument=<value>... The reading instrument (ssr-v2, ssr-v1, vlmtext-v1, edge_ocr_v1), repeatable.
1111
+ --limit=<value> Records per page, 1..500 (default 50). The page limit is reserved; the records returned are
1112
+ billed.
1113
+ --market=<value>... A market as COUNTRY:CODE (US DMA or CA CMA), repeatable.
1114
+ --media_owner=<value>... A media owner, repeatable: the records matched to a face whose owner (`publisher_name`, the
1115
+ registry's) holds the name's letters and digits, any case and punctuation (Lamar finds
1116
+ LAMAR-PITTSBURGH and Lamar (Cincinnati)).
1117
+ --surface=<value>... The surface kind as read (billboard, storefront, bus_shelter, ...), repeatable.
1118
+ --to=<value> End (exclusive). Default: now. The span is at most 400 days.
1081
1119
 
1082
1120
  DESCRIPTION
1083
1121
  Ad-sighting records: outdoor ads our cab cameras read, each with a signed photo link.
@@ -1092,23 +1130,46 @@ Outdoor creative history by brand, market and month, from the creative ledger.
1092
1130
 
1093
1131
  ```
1094
1132
  USAGE
1095
- $ trillboards generated generated-data-api-ad-sightings-history [--api-key <value>] [--base-url <value>] [--format json|table|yaml] [--brand <value>]
1096
- [--brand_id <value>] [--market <value>] [--from <value>] [--to <value>] [--grain <value>] [--limit <value>]
1097
- [--cursor <value>]
1133
+ $ trillboards generated generated-data-api-ad-sightings-history [--api-key <value>] [--base-url <value>] [--format <value>...] [--brand <value>...]
1134
+ [--brand_id <value>...] [--market <value>...] [--from <value>] [--to <value>] [--grain <value>] [--dimension
1135
+ <value>...] [--category <value>...] [--parent <value>...] [--agency <value>...] [--media_owner <value>...]
1136
+ [--surface <value>...] [--board <value>...] [--cbsa <value>...] [--limit <value>] [--cursor <value>]
1098
1137
 
1099
1138
  FLAGS
1100
- --api-key=<value> [env: TRILLBOARDS_API_KEY] API key (or set TRILLBOARDS_API_KEY env var)
1101
- --base-url=<value> [default: https://api.trillboards.com] API base URL
1102
- --brand=<value> A brand by name, repeatable (competitors). Resolved to its brand id the way the brand search does.
1103
- --brand_id=<value> A resolved brand id, repeatable.
1104
- --cursor=<value> The `next_cursor` of the previous page.
1105
- --format=<option> Output format
1106
- <options: json|table|yaml>
1107
- --from=<value> First month (YYYY-MM) or day. Default: 12 months before `to`.
1108
- --grain=<value> market_month (default) or fleet_month.
1109
- --limit=<value> Rows per page, 1..500 (default 100). The page limit is reserved; the rows returned are billed.
1110
- --market=<value> A market as COUNTRY:CODE, repeatable.
1111
- --to=<value> Last month (YYYY-MM, inclusive) or day. Default: this month.
1139
+ --agency=<value>... Narrow to brands this agency holds as agency of record (Winmo), by name in any case,
1140
+ repeatable.
1141
+ --api-key=<value> [env: TRILLBOARDS_API_KEY] API key (or set TRILLBOARDS_API_KEY env var)
1142
+ --base-url=<value> [default: https://api.trillboards.com] API base URL
1143
+ --board=<value>... Narrow to faces by face key, repeatable for a set of boards: f:<board id>:<face index> (a
1144
+ registered face) or p:<point id> (an unregistered board point), the `face_key` a board slice
1145
+ answers with.
1146
+ --brand=<value>... A brand by name, repeatable (competitors). Resolved to its brand id the way the brand search
1147
+ does.
1148
+ --brand_id=<value>... A resolved brand id, repeatable.
1149
+ --category=<value>... Narrow to brands of an IAB tier-1 category (IAB1..IAB25), repeatable. A slice filter narrows
1150
+ the denominators with the rows: the shares are within the categories named.
1151
+ --cbsa=<value>... Narrow to faces in a Census CBSA (5-digit code, OMB July 2023 delineation), repeatable.
1152
+ --cursor=<value> The `next_cursor` of the previous page.
1153
+ --dimension=<value>... A slice the rows are cut by, repeatable: category, parent, agency (what the brand is),
1154
+ media_owner, format, surface, board, cbsa (where it ran). Each row is a brand within its
1155
+ slice, and every share is over its slice: a slice recomputes every denominator, and every
1156
+ distinct count is counted within it. The market vacancy is cut by where-it-ran slices only.
1157
+ --format=<value>... Narrow to static or digital faces, repeatable.
1158
+ --from=<value> First month (YYYY-MM) or day. Default: 12 months before `to`.
1159
+ --grain=<value> market_month (default) or fleet_month; market_week or fleet_week (ISO weeks from their
1160
+ Monday, each counted whole, every week the from..to span touches); market_window or
1161
+ fleet_window (the from..to span as one period). A fleet grain drops the market: with
1162
+ dimension=cbsa it is the CBSA geography.
1163
+ --limit=<value> Rows per page, 1..500 (default 100). The page limit is reserved; the rows returned are
1164
+ billed.
1165
+ --market=<value>... A market as COUNTRY:CODE, repeatable.
1166
+ --media_owner=<value>... Narrow to faces whose registry owner holds the name's letters and digits, any case and
1167
+ punctuation (Lamar finds LAMAR-PITTSBURGH and Lamar (Cincinnati)), repeatable.
1168
+ --parent=<value>... Narrow to brands whose parent company is in this brand graph id's family (the `parent_id` a
1169
+ parent slice answers with), repeatable.
1170
+ --surface=<value>... Narrow to faces of a reader surface (billboard, digital_board, bus_shelter, kiosk),
1171
+ repeatable.
1172
+ --to=<value> Last month (YYYY-MM, inclusive) or day. Default: this month.
1112
1173
 
1113
1174
  DESCRIPTION
1114
1175
  Outdoor creative history by brand, market and month, from the creative ledger.
@@ -6,18 +6,26 @@ export default class Getapprovedmetric extends BaseCommand {
6
6
  metric: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
7
  };
8
8
  static flags: {
9
+ agencies: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
10
  board_id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ boards: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
12
  brands: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
13
  by: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ categories: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ cbsas: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
16
  day: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
17
  daypart: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
18
  dimensions: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ formats: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
20
  grade: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
21
  grain: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
22
  markets: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ media_owners: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ parents: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
25
  population: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
26
  screens: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
27
  stats: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
28
+ surfaces: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
29
  window: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
30
  window_end: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
31
  'api-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
@@ -12,18 +12,26 @@ export default class Getapprovedmetric extends BaseCommand {
12
12
  };
13
13
  static flags = {
14
14
  ...BaseCommand.baseFlags,
15
+ 'agencies': Flags.string({ description: 'Agency names, |-separated (or repeated): the brands one of them holds as agency of record (Winmo), any case. Taken by: creative_brand_history.' }),
15
16
  'board_id': Flags.string({ description: 'Board face id (board metrics). Taken by: board_measured_impressions_per_spot, board_pass_audience.' }),
17
+ 'boards': Flags.string({ description: 'Face keys, |-separated (or repeated): f:<board id>:<face index> or p:<point id>. Taken by: creative_brand_history.' }),
16
18
  'brands': Flags.string({ description: 'Comma-separated resolved brand ids. Taken by: creative_brand_history.' }),
17
19
  'by': Flags.string({ description: 'Condition scope (board metrics): daypart, light, weather or speed. Taken by: board_measured_impressions_per_spot.' }),
20
+ 'categories': Flags.string({ description: 'Comma-separated IAB tier-1 codes (IAB1..IAB25): the brands of those categories. A slice filter narrows the denominators with the rows. Taken by: creative_brand_history.' }),
21
+ 'cbsas': Flags.string({ description: 'Comma-separated 5-digit Census CBSA codes (OMB July 2023 delineation). Taken by: creative_brand_history.' }),
18
22
  'day': Flags.string({ description: 'One day (YYYY-MM-DD). Give day or window; neither is the last settled day. Taken by: camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct, demographic_share, sensing_census, same_panel_index, radio_identifiers_per_person, creative_sightings, creative_share_of_voice, creative_street_presence, creative_vacancy_rate, creative_brand_history, seatbelt_compliance, seatbelt_unbuckled_ride_rate.' }),
19
23
  'daypart': Flags.string({ description: 'Daypart filter (board metrics). Taken by: board_measured_impressions_per_spot, board_pass_audience.' }),
20
- 'dimensions': Flags.string({ description: 'Comma-separated audience dimensions (dimension= is the one-value spelling). Taken by: demographic_share.' }),
24
+ 'dimensions': Flags.string({ description: 'Comma-separated dimensions (dimension= is the one-value spelling): the audience dimensions of a demographics metric (default all), or the slices creative_brand_history cuts its rows by (category, parent, agency, media_owner, format, surface, board, cbsa; default none), every share over its slice. Taken by: demographic_share, creative_brand_history.' }),
25
+ 'formats': Flags.string({ description: 'Comma-separated face formats: static, digital. Taken by: creative_brand_history.' }),
21
26
  'grade': Flags.string({ description: 'Camera evidence grade: face_backed or person_backed. Taken by: camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct.' }),
22
27
  'grain': Flags.string({ description: 'The answer grain (screen_hour, screen_day, fleet_day, market_day, market_month, ...): one of the metric\'s grains. Taken by: camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct, demographic_share, sensing_census, same_panel_index, radio_identifiers_per_person, creative_sightings, creative_share_of_voice, creative_street_presence, creative_vacancy_rate, creative_brand_history, seatbelt_compliance, seatbelt_unbuckled_ride_rate.' }),
23
28
  'markets': Flags.string({ description: 'Comma-separated markets as COUNTRY:CODE (US DMA, CA CMA). Taken by: creative_sightings, creative_share_of_voice, creative_street_presence, creative_vacancy_rate, creative_brand_history, seatbelt_compliance, seatbelt_unbuckled_ride_rate.' }),
29
+ 'media_owners': Flags.string({ description: 'Media owner names, |-separated (or repeated): the faces whose registry owner holds a name\'s letters and digits, any case and punctuation. Taken by: creative_brand_history.' }),
30
+ 'parents': Flags.string({ description: 'Comma-separated brand graph ids: the brands whose parent company is in one of those Wikidata families. Taken by: creative_brand_history.' }),
24
31
  'population': Flags.string({ description: 'The population the shares are over. Taken by: sensing_census, same_panel_index.' }),
25
32
  'screens': Flags.string({ description: 'Comma-separated 24-hex screen ids, up to the metric\'s max_screens. Taken by: camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct, demographic_share, seatbelt_compliance, seatbelt_unbuckled_ride_rate.' }),
26
33
  'stats': Flags.string({ description: 'Comma-separated statistics (mean, p50, ...), from the metric\'s allowed stats. Taken by: camera_people_per_screen_hour, camera_head_pose_index.' }),
34
+ 'surfaces': Flags.string({ description: 'Comma-separated reader surfaces: billboard, digital_board, bus_shelter, kiosk. Taken by: creative_brand_history.' }),
27
35
  'window': Flags.string({ description: 'An inclusive span, YYYY-MM-DD..YYYY-MM-DD, up to the metric\'s max_window_days. Taken by: camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct, demographic_share, same_panel_index, radio_identifiers_per_person, creative_sightings, creative_share_of_voice, creative_street_presence, creative_vacancy_rate, creative_brand_history, seatbelt_compliance, seatbelt_unbuckled_ride_rate.' }),
28
36
  'window_end': Flags.string({ description: 'Currency window end (board metrics). Taken by: board_measured_impressions_per_spot, board_pass_audience.' }),
29
37
  };
@@ -36,30 +44,46 @@ export default class Getapprovedmetric extends BaseCommand {
36
44
  let urlPath = '/v1/advertiser/measurement/metrics/{metric}';
37
45
  urlPath = urlPath.replace('{metric}', args['metric']);
38
46
  const params = {};
47
+ if (flags['agencies'])
48
+ params['agencies'] = flags['agencies'];
39
49
  if (flags['board_id'])
40
50
  params['board_id'] = flags['board_id'];
51
+ if (flags['boards'])
52
+ params['boards'] = flags['boards'];
41
53
  if (flags['brands'])
42
54
  params['brands'] = flags['brands'];
43
55
  if (flags['by'])
44
56
  params['by'] = flags['by'];
57
+ if (flags['categories'])
58
+ params['categories'] = flags['categories'];
59
+ if (flags['cbsas'])
60
+ params['cbsas'] = flags['cbsas'];
45
61
  if (flags['day'])
46
62
  params['day'] = flags['day'];
47
63
  if (flags['daypart'])
48
64
  params['daypart'] = flags['daypart'];
49
65
  if (flags['dimensions'])
50
66
  params['dimensions'] = flags['dimensions'];
67
+ if (flags['formats'])
68
+ params['formats'] = flags['formats'];
51
69
  if (flags['grade'])
52
70
  params['grade'] = flags['grade'];
53
71
  if (flags['grain'])
54
72
  params['grain'] = flags['grain'];
55
73
  if (flags['markets'])
56
74
  params['markets'] = flags['markets'];
75
+ if (flags['media_owners'])
76
+ params['media_owners'] = flags['media_owners'];
77
+ if (flags['parents'])
78
+ params['parents'] = flags['parents'];
57
79
  if (flags['population'])
58
80
  params['population'] = flags['population'];
59
81
  if (flags['screens'])
60
82
  params['screens'] = flags['screens'];
61
83
  if (flags['stats'])
62
84
  params['stats'] = flags['stats'];
85
+ if (flags['surfaces'])
86
+ params['surfaces'] = flags['surfaces'];
63
87
  if (flags['window'])
64
88
  params['window'] = flags['window'];
65
89
  if (flags['window_end'])
@@ -4,17 +4,25 @@ export default class Dataapiadsightingshistory extends BaseCommand {
4
4
  static examples: string[];
5
5
  static args: {};
6
6
  static flags: {
7
- brand: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
- brand_id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
- market: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ brand: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ brand_id: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ market: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
10
  from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
11
  to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
12
  grain: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ dimension: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ category: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ parent: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ agency: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ media_owner: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ format: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ surface: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ board: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ cbsa: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
22
  limit: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
23
  cursor: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
24
  'api-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
25
  'base-url': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
17
- format: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
26
  };
19
27
  run(): Promise<void>;
20
28
  }
@@ -10,12 +10,21 @@ export default class Dataapiadsightingshistory extends BaseCommand {
10
10
  static args = {};
11
11
  static flags = {
12
12
  ...BaseCommand.baseFlags,
13
- 'brand': Flags.string({ description: 'A brand by name, repeatable (competitors). Resolved to its brand id the way the brand search does.' }),
14
- 'brand_id': Flags.string({ description: 'A resolved brand id, repeatable.' }),
15
- 'market': Flags.string({ description: 'A market as COUNTRY:CODE, repeatable.' }),
13
+ 'brand': Flags.string({ description: 'A brand by name, repeatable (competitors). Resolved to its brand id the way the brand search does.', multiple: true }),
14
+ 'brand_id': Flags.string({ description: 'A resolved brand id, repeatable.', multiple: true }),
15
+ 'market': Flags.string({ description: 'A market as COUNTRY:CODE, repeatable.', multiple: true }),
16
16
  'from': Flags.string({ description: 'First month (YYYY-MM) or day. Default: 12 months before `to`.' }),
17
17
  'to': Flags.string({ description: 'Last month (YYYY-MM, inclusive) or day. Default: this month.' }),
18
- 'grain': Flags.string({ description: 'market_month (default) or fleet_month.' }),
18
+ 'grain': Flags.string({ description: 'market_month (default) or fleet_month; market_week or fleet_week (ISO weeks from their Monday, each counted whole, every week the from..to span touches); market_window or fleet_window (the from..to span as one period). A fleet grain drops the market: with dimension=cbsa it is the CBSA geography.' }),
19
+ 'dimension': Flags.string({ description: 'A slice the rows are cut by, repeatable: category, parent, agency (what the brand is), media_owner, format, surface, board, cbsa (where it ran). Each row is a brand within its slice, and every share is over its slice: a slice recomputes every denominator, and every distinct count is counted within it. The market vacancy is cut by where-it-ran slices only.', multiple: true }),
20
+ 'category': Flags.string({ description: 'Narrow to brands of an IAB tier-1 category (IAB1..IAB25), repeatable. A slice filter narrows the denominators with the rows: the shares are within the categories named.', multiple: true }),
21
+ 'parent': Flags.string({ description: 'Narrow to brands whose parent company is in this brand graph id\'s family (the `parent_id` a parent slice answers with), repeatable.', multiple: true }),
22
+ 'agency': Flags.string({ description: 'Narrow to brands this agency holds as agency of record (Winmo), by name in any case, repeatable.', multiple: true }),
23
+ 'media_owner': Flags.string({ description: 'Narrow to faces whose registry owner holds the name\'s letters and digits, any case and punctuation (Lamar finds LAMAR-PITTSBURGH and Lamar (Cincinnati)), repeatable.', multiple: true }),
24
+ 'format': Flags.string({ description: 'Narrow to static or digital faces, repeatable.', multiple: true }),
25
+ 'surface': Flags.string({ description: 'Narrow to faces of a reader surface (billboard, digital_board, bus_shelter, kiosk), repeatable.', multiple: true }),
26
+ 'board': Flags.string({ description: 'Narrow to faces by face key, repeatable for a set of boards: f:<board id>:<face index> (a registered face) or p:<point id> (an unregistered board point), the `face_key` a board slice answers with.', multiple: true }),
27
+ 'cbsa': Flags.string({ description: 'Narrow to faces in a Census CBSA (5-digit code, OMB July 2023 delineation), repeatable.', multiple: true }),
19
28
  'limit': Flags.string({ description: 'Rows per page, 1..500 (default 100). The page limit is reserved; the rows returned are billed.' }),
20
29
  'cursor': Flags.string({ description: 'The `next_cursor` of the previous page.' }),
21
30
  };
@@ -27,11 +36,11 @@ export default class Dataapiadsightingshistory extends BaseCommand {
27
36
  this.error('Not logged in. Run: trillboards login');
28
37
  let urlPath = '/v1/data/ad-sightings/history';
29
38
  const params = {};
30
- if (flags['brand'])
39
+ if (flags['brand'] && flags['brand'].length > 0)
31
40
  params['brand'] = flags['brand'];
32
- if (flags['brand_id'])
41
+ if (flags['brand_id'] && flags['brand_id'].length > 0)
33
42
  params['brand_id'] = flags['brand_id'];
34
- if (flags['market'])
43
+ if (flags['market'] && flags['market'].length > 0)
35
44
  params['market'] = flags['market'];
36
45
  if (flags['from'])
37
46
  params['from'] = flags['from'];
@@ -39,6 +48,24 @@ export default class Dataapiadsightingshistory extends BaseCommand {
39
48
  params['to'] = flags['to'];
40
49
  if (flags['grain'])
41
50
  params['grain'] = flags['grain'];
51
+ if (flags['dimension'] && flags['dimension'].length > 0)
52
+ params['dimension'] = flags['dimension'];
53
+ if (flags['category'] && flags['category'].length > 0)
54
+ params['category'] = flags['category'];
55
+ if (flags['parent'] && flags['parent'].length > 0)
56
+ params['parent'] = flags['parent'];
57
+ if (flags['agency'] && flags['agency'].length > 0)
58
+ params['agency'] = flags['agency'];
59
+ if (flags['media_owner'] && flags['media_owner'].length > 0)
60
+ params['media_owner'] = flags['media_owner'];
61
+ if (flags['format'] && flags['format'].length > 0)
62
+ params['format'] = flags['format'];
63
+ if (flags['surface'] && flags['surface'].length > 0)
64
+ params['surface'] = flags['surface'];
65
+ if (flags['board'] && flags['board'].length > 0)
66
+ params['board'] = flags['board'];
67
+ if (flags['cbsa'] && flags['cbsa'].length > 0)
68
+ params['cbsa'] = flags['cbsa'];
42
69
  if (flags['limit'])
43
70
  params['limit'] = flags['limit'];
44
71
  if (flags['cursor'])
@@ -4,13 +4,15 @@ export default class Dataapiadsightings extends BaseCommand {
4
4
  static examples: string[];
5
5
  static args: {};
6
6
  static flags: {
7
- brand: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
- brand_id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
- market: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
- surface: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
- board_id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
- creative_id: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
- instrument: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ brand: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ brand_id: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ market: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ surface: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ board_id: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ creative_id: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ instrument: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ category: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ media_owner: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
16
  from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
17
  to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
18
  limit: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
@@ -10,13 +10,15 @@ export default class Dataapiadsightings extends BaseCommand {
10
10
  static args = {};
11
11
  static flags = {
12
12
  ...BaseCommand.baseFlags,
13
- 'brand': Flags.string({ description: 'A brand, repeatable for a brand set (competitors). Matched however it is typed: "McDonald\'s", "mcdonalds" and "Mc Donalds" find the same records.' }),
14
- 'brand_id': Flags.string({ description: 'A resolved brand id, repeatable. Combined with `brand` as either-or.' }),
15
- 'market': Flags.string({ description: 'A market as COUNTRY:CODE (US DMA or CA CMA), repeatable.' }),
16
- 'surface': Flags.string({ description: 'The surface kind as read (billboard, storefront, bus_shelter, ...), repeatable.' }),
17
- 'board_id': Flags.string({ description: 'A board the sighting was matched to, repeatable.' }),
18
- 'creative_id': Flags.string({ description: 'A sighted creative (the campaign artwork), repeatable.' }),
19
- 'instrument': Flags.string({ description: 'The reading instrument (ssr-v2, ssr-v1, vlmtext-v1, edge_ocr_v1), repeatable.' }),
13
+ 'brand': Flags.string({ description: 'A brand, repeatable for a brand set (competitors). Matched however it is typed: "McDonald\'s", "mcdonalds" and "Mc Donalds" find the same records.', multiple: true }),
14
+ 'brand_id': Flags.string({ description: 'A resolved brand id, repeatable. Combined with `brand` as either-or.', multiple: true }),
15
+ 'market': Flags.string({ description: 'A market as COUNTRY:CODE (US DMA or CA CMA), repeatable.', multiple: true }),
16
+ 'surface': Flags.string({ description: 'The surface kind as read (billboard, storefront, bus_shelter, ...), repeatable.', multiple: true }),
17
+ 'board_id': Flags.string({ description: 'A board the sighting was matched to, repeatable.', multiple: true }),
18
+ 'creative_id': Flags.string({ description: 'A sighted creative (the campaign artwork), repeatable.', multiple: true }),
19
+ 'instrument': Flags.string({ description: 'The reading instrument (ssr-v2, ssr-v1, vlmtext-v1, edge_ocr_v1), repeatable.', multiple: true }),
20
+ 'category': Flags.string({ description: 'The brand\'s IAB tier-1 category (IAB1..IAB25), repeatable: the records whose resolved brand votes in it (brand_knowledge_graph.iab_category, the `category` field).', multiple: true }),
21
+ 'media_owner': Flags.string({ description: 'A media owner, repeatable: the records matched to a face whose owner (`publisher_name`, the registry\'s) holds the name\'s letters and digits, any case and punctuation (Lamar finds LAMAR-PITTSBURGH and Lamar (Cincinnati)).', multiple: true }),
20
22
  'from': Flags.string({ description: 'Start (inclusive), YYYY-MM-DD or an ISO-8601 instant. Default: 30 days before `to`.' }),
21
23
  'to': Flags.string({ description: 'End (exclusive). Default: now. The span is at most 400 days.' }),
22
24
  'limit': Flags.string({ description: 'Records per page, 1..500 (default 50). The page limit is reserved; the records returned are billed.' }),
@@ -30,20 +32,24 @@ export default class Dataapiadsightings extends BaseCommand {
30
32
  this.error('Not logged in. Run: trillboards login');
31
33
  let urlPath = '/v1/data/ad-sightings';
32
34
  const params = {};
33
- if (flags['brand'])
35
+ if (flags['brand'] && flags['brand'].length > 0)
34
36
  params['brand'] = flags['brand'];
35
- if (flags['brand_id'])
37
+ if (flags['brand_id'] && flags['brand_id'].length > 0)
36
38
  params['brand_id'] = flags['brand_id'];
37
- if (flags['market'])
39
+ if (flags['market'] && flags['market'].length > 0)
38
40
  params['market'] = flags['market'];
39
- if (flags['surface'])
41
+ if (flags['surface'] && flags['surface'].length > 0)
40
42
  params['surface'] = flags['surface'];
41
- if (flags['board_id'])
43
+ if (flags['board_id'] && flags['board_id'].length > 0)
42
44
  params['board_id'] = flags['board_id'];
43
- if (flags['creative_id'])
45
+ if (flags['creative_id'] && flags['creative_id'].length > 0)
44
46
  params['creative_id'] = flags['creative_id'];
45
- if (flags['instrument'])
47
+ if (flags['instrument'] && flags['instrument'].length > 0)
46
48
  params['instrument'] = flags['instrument'];
49
+ if (flags['category'] && flags['category'].length > 0)
50
+ params['category'] = flags['category'];
51
+ if (flags['media_owner'] && flags['media_owner'].length > 0)
52
+ params['media_owner'] = flags['media_owner'];
47
53
  if (flags['from'])
48
54
  params['from'] = flags['from'];
49
55
  if (flags['to'])
package/dist/http.d.ts CHANGED
@@ -15,6 +15,7 @@ export interface ApiRequestOptions {
15
15
  token?: string;
16
16
  baseUrl: string;
17
17
  body?: unknown;
18
- params?: Record<string, string>;
18
+ /** Query parameters; a list is sent once per value (?board=a&board=b). */
19
+ params?: Record<string, string | string[]>;
19
20
  }
20
21
  export declare function apiRequest(method: string, path: string, options: ApiRequestOptions): Promise<unknown>;
package/dist/http.js CHANGED
@@ -20,7 +20,13 @@ export async function apiRequest(method, path, options) {
20
20
  const url = new URL(path, options.baseUrl);
21
21
  if (options.params) {
22
22
  for (const [k, v] of Object.entries(options.params)) {
23
- url.searchParams.set(k, v);
23
+ if (Array.isArray(v)) {
24
+ for (const each of v)
25
+ url.searchParams.append(k, each);
26
+ }
27
+ else {
28
+ url.searchParams.set(k, v);
29
+ }
24
30
  }
25
31
  }
26
32
  const headers = {
@@ -1442,6 +1442,13 @@
1442
1442
  ],
1443
1443
  "type": "option"
1444
1444
  },
1445
+ "agencies": {
1446
+ "description": "Agency names, |-separated (or repeated): the brands one of them holds as agency of record (Winmo), any case. Taken by: creative_brand_history.",
1447
+ "name": "agencies",
1448
+ "hasDynamicHelp": false,
1449
+ "multiple": false,
1450
+ "type": "option"
1451
+ },
1445
1452
  "board_id": {
1446
1453
  "description": "Board face id (board metrics). Taken by: board_measured_impressions_per_spot, board_pass_audience.",
1447
1454
  "name": "board_id",
@@ -1449,6 +1456,13 @@
1449
1456
  "multiple": false,
1450
1457
  "type": "option"
1451
1458
  },
1459
+ "boards": {
1460
+ "description": "Face keys, |-separated (or repeated): f:<board id>:<face index> or p:<point id>. Taken by: creative_brand_history.",
1461
+ "name": "boards",
1462
+ "hasDynamicHelp": false,
1463
+ "multiple": false,
1464
+ "type": "option"
1465
+ },
1452
1466
  "brands": {
1453
1467
  "description": "Comma-separated resolved brand ids. Taken by: creative_brand_history.",
1454
1468
  "name": "brands",
@@ -1463,6 +1477,20 @@
1463
1477
  "multiple": false,
1464
1478
  "type": "option"
1465
1479
  },
1480
+ "categories": {
1481
+ "description": "Comma-separated IAB tier-1 codes (IAB1..IAB25): the brands of those categories. A slice filter narrows the denominators with the rows. Taken by: creative_brand_history.",
1482
+ "name": "categories",
1483
+ "hasDynamicHelp": false,
1484
+ "multiple": false,
1485
+ "type": "option"
1486
+ },
1487
+ "cbsas": {
1488
+ "description": "Comma-separated 5-digit Census CBSA codes (OMB July 2023 delineation). Taken by: creative_brand_history.",
1489
+ "name": "cbsas",
1490
+ "hasDynamicHelp": false,
1491
+ "multiple": false,
1492
+ "type": "option"
1493
+ },
1466
1494
  "day": {
1467
1495
  "description": "One day (YYYY-MM-DD). Give day or window; neither is the last settled day. Taken by: camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct, demographic_share, sensing_census, same_panel_index, radio_identifiers_per_person, creative_sightings, creative_share_of_voice, creative_street_presence, creative_vacancy_rate, creative_brand_history, seatbelt_compliance, seatbelt_unbuckled_ride_rate.",
1468
1496
  "name": "day",
@@ -1478,12 +1506,19 @@
1478
1506
  "type": "option"
1479
1507
  },
1480
1508
  "dimensions": {
1481
- "description": "Comma-separated audience dimensions (dimension= is the one-value spelling). Taken by: demographic_share.",
1509
+ "description": "Comma-separated dimensions (dimension= is the one-value spelling): the audience dimensions of a demographics metric (default all), or the slices creative_brand_history cuts its rows by (category, parent, agency, media_owner, format, surface, board, cbsa; default none), every share over its slice. Taken by: demographic_share, creative_brand_history.",
1482
1510
  "name": "dimensions",
1483
1511
  "hasDynamicHelp": false,
1484
1512
  "multiple": false,
1485
1513
  "type": "option"
1486
1514
  },
1515
+ "formats": {
1516
+ "description": "Comma-separated face formats: static, digital. Taken by: creative_brand_history.",
1517
+ "name": "formats",
1518
+ "hasDynamicHelp": false,
1519
+ "multiple": false,
1520
+ "type": "option"
1521
+ },
1487
1522
  "grade": {
1488
1523
  "description": "Camera evidence grade: face_backed or person_backed. Taken by: camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct.",
1489
1524
  "name": "grade",
@@ -1505,6 +1540,20 @@
1505
1540
  "multiple": false,
1506
1541
  "type": "option"
1507
1542
  },
1543
+ "media_owners": {
1544
+ "description": "Media owner names, |-separated (or repeated): the faces whose registry owner holds a name's letters and digits, any case and punctuation. Taken by: creative_brand_history.",
1545
+ "name": "media_owners",
1546
+ "hasDynamicHelp": false,
1547
+ "multiple": false,
1548
+ "type": "option"
1549
+ },
1550
+ "parents": {
1551
+ "description": "Comma-separated brand graph ids: the brands whose parent company is in one of those Wikidata families. Taken by: creative_brand_history.",
1552
+ "name": "parents",
1553
+ "hasDynamicHelp": false,
1554
+ "multiple": false,
1555
+ "type": "option"
1556
+ },
1508
1557
  "population": {
1509
1558
  "description": "The population the shares are over. Taken by: sensing_census, same_panel_index.",
1510
1559
  "name": "population",
@@ -1526,6 +1575,13 @@
1526
1575
  "multiple": false,
1527
1576
  "type": "option"
1528
1577
  },
1578
+ "surfaces": {
1579
+ "description": "Comma-separated reader surfaces: billboard, digital_board, bus_shelter, kiosk. Taken by: creative_brand_history.",
1580
+ "name": "surfaces",
1581
+ "hasDynamicHelp": false,
1582
+ "multiple": false,
1583
+ "type": "option"
1584
+ },
1529
1585
  "window": {
1530
1586
  "description": "An inclusive span, YYYY-MM-DD..YYYY-MM-DD, up to the metric's max_window_days. Taken by: camera_people_per_screen_hour, camera_dwell_capped_ms, camera_head_pose_index, camera_gaze_pct, demographic_share, same_panel_index, radio_identifiers_per_person, creative_sightings, creative_share_of_voice, creative_street_presence, creative_vacancy_rate, creative_brand_history, seatbelt_compliance, seatbelt_unbuckled_ride_rate.",
1531
1587
  "name": "window",
@@ -2531,36 +2587,31 @@
2531
2587
  "type": "option"
2532
2588
  },
2533
2589
  "format": {
2534
- "description": "Output format",
2590
+ "description": "Narrow to static or digital faces, repeatable.",
2535
2591
  "name": "format",
2536
2592
  "hasDynamicHelp": false,
2537
- "multiple": false,
2538
- "options": [
2539
- "json",
2540
- "table",
2541
- "yaml"
2542
- ],
2593
+ "multiple": true,
2543
2594
  "type": "option"
2544
2595
  },
2545
2596
  "brand": {
2546
2597
  "description": "A brand by name, repeatable (competitors). Resolved to its brand id the way the brand search does.",
2547
2598
  "name": "brand",
2548
2599
  "hasDynamicHelp": false,
2549
- "multiple": false,
2600
+ "multiple": true,
2550
2601
  "type": "option"
2551
2602
  },
2552
2603
  "brand_id": {
2553
2604
  "description": "A resolved brand id, repeatable.",
2554
2605
  "name": "brand_id",
2555
2606
  "hasDynamicHelp": false,
2556
- "multiple": false,
2607
+ "multiple": true,
2557
2608
  "type": "option"
2558
2609
  },
2559
2610
  "market": {
2560
2611
  "description": "A market as COUNTRY:CODE, repeatable.",
2561
2612
  "name": "market",
2562
2613
  "hasDynamicHelp": false,
2563
- "multiple": false,
2614
+ "multiple": true,
2564
2615
  "type": "option"
2565
2616
  },
2566
2617
  "from": {
@@ -2578,12 +2629,68 @@
2578
2629
  "type": "option"
2579
2630
  },
2580
2631
  "grain": {
2581
- "description": "market_month (default) or fleet_month.",
2632
+ "description": "market_month (default) or fleet_month; market_week or fleet_week (ISO weeks from their Monday, each counted whole, every week the from..to span touches); market_window or fleet_window (the from..to span as one period). A fleet grain drops the market: with dimension=cbsa it is the CBSA geography.",
2582
2633
  "name": "grain",
2583
2634
  "hasDynamicHelp": false,
2584
2635
  "multiple": false,
2585
2636
  "type": "option"
2586
2637
  },
2638
+ "dimension": {
2639
+ "description": "A slice the rows are cut by, repeatable: category, parent, agency (what the brand is), media_owner, format, surface, board, cbsa (where it ran). Each row is a brand within its slice, and every share is over its slice: a slice recomputes every denominator, and every distinct count is counted within it. The market vacancy is cut by where-it-ran slices only.",
2640
+ "name": "dimension",
2641
+ "hasDynamicHelp": false,
2642
+ "multiple": true,
2643
+ "type": "option"
2644
+ },
2645
+ "category": {
2646
+ "description": "Narrow to brands of an IAB tier-1 category (IAB1..IAB25), repeatable. A slice filter narrows the denominators with the rows: the shares are within the categories named.",
2647
+ "name": "category",
2648
+ "hasDynamicHelp": false,
2649
+ "multiple": true,
2650
+ "type": "option"
2651
+ },
2652
+ "parent": {
2653
+ "description": "Narrow to brands whose parent company is in this brand graph id's family (the `parent_id` a parent slice answers with), repeatable.",
2654
+ "name": "parent",
2655
+ "hasDynamicHelp": false,
2656
+ "multiple": true,
2657
+ "type": "option"
2658
+ },
2659
+ "agency": {
2660
+ "description": "Narrow to brands this agency holds as agency of record (Winmo), by name in any case, repeatable.",
2661
+ "name": "agency",
2662
+ "hasDynamicHelp": false,
2663
+ "multiple": true,
2664
+ "type": "option"
2665
+ },
2666
+ "media_owner": {
2667
+ "description": "Narrow to faces whose registry owner holds the name's letters and digits, any case and punctuation (Lamar finds LAMAR-PITTSBURGH and Lamar (Cincinnati)), repeatable.",
2668
+ "name": "media_owner",
2669
+ "hasDynamicHelp": false,
2670
+ "multiple": true,
2671
+ "type": "option"
2672
+ },
2673
+ "surface": {
2674
+ "description": "Narrow to faces of a reader surface (billboard, digital_board, bus_shelter, kiosk), repeatable.",
2675
+ "name": "surface",
2676
+ "hasDynamicHelp": false,
2677
+ "multiple": true,
2678
+ "type": "option"
2679
+ },
2680
+ "board": {
2681
+ "description": "Narrow to faces by face key, repeatable for a set of boards: f:<board id>:<face index> (a registered face) or p:<point id> (an unregistered board point), the `face_key` a board slice answers with.",
2682
+ "name": "board",
2683
+ "hasDynamicHelp": false,
2684
+ "multiple": true,
2685
+ "type": "option"
2686
+ },
2687
+ "cbsa": {
2688
+ "description": "Narrow to faces in a Census CBSA (5-digit code, OMB July 2023 delineation), repeatable.",
2689
+ "name": "cbsa",
2690
+ "hasDynamicHelp": false,
2691
+ "multiple": true,
2692
+ "type": "option"
2693
+ },
2587
2694
  "limit": {
2588
2695
  "description": "Rows per page, 1..500 (default 100). The page limit is reserved; the rows returned are billed.",
2589
2696
  "name": "limit",
@@ -2655,49 +2762,63 @@
2655
2762
  "description": "A brand, repeatable for a brand set (competitors). Matched however it is typed: \"McDonald's\", \"mcdonalds\" and \"Mc Donalds\" find the same records.",
2656
2763
  "name": "brand",
2657
2764
  "hasDynamicHelp": false,
2658
- "multiple": false,
2765
+ "multiple": true,
2659
2766
  "type": "option"
2660
2767
  },
2661
2768
  "brand_id": {
2662
2769
  "description": "A resolved brand id, repeatable. Combined with `brand` as either-or.",
2663
2770
  "name": "brand_id",
2664
2771
  "hasDynamicHelp": false,
2665
- "multiple": false,
2772
+ "multiple": true,
2666
2773
  "type": "option"
2667
2774
  },
2668
2775
  "market": {
2669
2776
  "description": "A market as COUNTRY:CODE (US DMA or CA CMA), repeatable.",
2670
2777
  "name": "market",
2671
2778
  "hasDynamicHelp": false,
2672
- "multiple": false,
2779
+ "multiple": true,
2673
2780
  "type": "option"
2674
2781
  },
2675
2782
  "surface": {
2676
2783
  "description": "The surface kind as read (billboard, storefront, bus_shelter, ...), repeatable.",
2677
2784
  "name": "surface",
2678
2785
  "hasDynamicHelp": false,
2679
- "multiple": false,
2786
+ "multiple": true,
2680
2787
  "type": "option"
2681
2788
  },
2682
2789
  "board_id": {
2683
2790
  "description": "A board the sighting was matched to, repeatable.",
2684
2791
  "name": "board_id",
2685
2792
  "hasDynamicHelp": false,
2686
- "multiple": false,
2793
+ "multiple": true,
2687
2794
  "type": "option"
2688
2795
  },
2689
2796
  "creative_id": {
2690
2797
  "description": "A sighted creative (the campaign artwork), repeatable.",
2691
2798
  "name": "creative_id",
2692
2799
  "hasDynamicHelp": false,
2693
- "multiple": false,
2800
+ "multiple": true,
2694
2801
  "type": "option"
2695
2802
  },
2696
2803
  "instrument": {
2697
2804
  "description": "The reading instrument (ssr-v2, ssr-v1, vlmtext-v1, edge_ocr_v1), repeatable.",
2698
2805
  "name": "instrument",
2699
2806
  "hasDynamicHelp": false,
2700
- "multiple": false,
2807
+ "multiple": true,
2808
+ "type": "option"
2809
+ },
2810
+ "category": {
2811
+ "description": "The brand's IAB tier-1 category (IAB1..IAB25), repeatable: the records whose resolved brand votes in it (brand_knowledge_graph.iab_category, the `category` field).",
2812
+ "name": "category",
2813
+ "hasDynamicHelp": false,
2814
+ "multiple": true,
2815
+ "type": "option"
2816
+ },
2817
+ "media_owner": {
2818
+ "description": "A media owner, repeatable: the records matched to a face whose owner (`publisher_name`, the registry's) holds the name's letters and digits, any case and punctuation (Lamar finds LAMAR-PITTSBURGH and Lamar (Cincinnati)).",
2819
+ "name": "media_owner",
2820
+ "hasDynamicHelp": false,
2821
+ "multiple": true,
2701
2822
  "type": "option"
2702
2823
  },
2703
2824
  "from": {
@@ -6776,13 +6897,15 @@
6776
6897
  "tail.js"
6777
6898
  ]
6778
6899
  },
6779
- "sandbox:create": {
6900
+ "screens:watch": {
6780
6901
  "aliases": [],
6781
6902
  "args": {},
6782
- "description": "Create a sandbox test screen",
6903
+ "description": "Live fleet dashboard — watch all screens in real-time",
6783
6904
  "examples": [
6784
- "<%= config.bin %> sandbox create",
6785
- "<%= config.bin %> sandbox create --format json"
6905
+ "<%= config.bin %> screens watch",
6906
+ "<%= config.bin %> screens watch --filter online",
6907
+ "<%= config.bin %> screens watch --sort earnings",
6908
+ "<%= config.bin %> screens watch --format json"
6786
6909
  ],
6787
6910
  "flags": {
6788
6911
  "api-key": {
@@ -6812,11 +6935,43 @@
6812
6935
  "yaml"
6813
6936
  ],
6814
6937
  "type": "option"
6938
+ },
6939
+ "filter": {
6940
+ "description": "Filter screens by status",
6941
+ "name": "filter",
6942
+ "hasDynamicHelp": false,
6943
+ "multiple": false,
6944
+ "options": [
6945
+ "online",
6946
+ "offline"
6947
+ ],
6948
+ "type": "option"
6949
+ },
6950
+ "interval": {
6951
+ "description": "Refresh interval in seconds",
6952
+ "name": "interval",
6953
+ "default": 10,
6954
+ "hasDynamicHelp": false,
6955
+ "multiple": false,
6956
+ "type": "option"
6957
+ },
6958
+ "sort": {
6959
+ "description": "Sort column",
6960
+ "name": "sort",
6961
+ "default": "name",
6962
+ "hasDynamicHelp": false,
6963
+ "multiple": false,
6964
+ "options": [
6965
+ "name",
6966
+ "earnings",
6967
+ "fill-rate"
6968
+ ],
6969
+ "type": "option"
6815
6970
  }
6816
6971
  },
6817
6972
  "hasDynamicHelp": false,
6818
6973
  "hiddenAliases": [],
6819
- "id": "sandbox:create",
6974
+ "id": "screens:watch",
6820
6975
  "pluginAlias": "@trillboards/cli",
6821
6976
  "pluginName": "@trillboards/cli",
6822
6977
  "pluginType": "core",
@@ -6826,24 +6981,17 @@
6826
6981
  "relativePath": [
6827
6982
  "dist",
6828
6983
  "commands",
6829
- "sandbox",
6830
- "create.js"
6984
+ "screens",
6985
+ "watch.js"
6831
6986
  ]
6832
6987
  },
6833
- "sandbox:emit": {
6988
+ "sandbox:create": {
6834
6989
  "aliases": [],
6835
- "args": {
6836
- "event_type": {
6837
- "description": "Event type to emit (e.g. impression.recorded, heartbeat)",
6838
- "name": "event_type",
6839
- "required": true
6840
- }
6841
- },
6842
- "description": "Emit a test event in the sandbox",
6990
+ "args": {},
6991
+ "description": "Create a sandbox test screen",
6843
6992
  "examples": [
6844
- "<%= config.bin %> sandbox emit impression.recorded",
6845
- "<%= config.bin %> sandbox emit heartbeat",
6846
- "<%= config.bin %> sandbox emit impression.recorded --data '{\"cpm\": 3.50}'"
6993
+ "<%= config.bin %> sandbox create",
6994
+ "<%= config.bin %> sandbox create --format json"
6847
6995
  ],
6848
6996
  "flags": {
6849
6997
  "api-key": {
@@ -6873,19 +7021,11 @@
6873
7021
  "yaml"
6874
7022
  ],
6875
7023
  "type": "option"
6876
- },
6877
- "data": {
6878
- "char": "d",
6879
- "description": "Additional event data (JSON string)",
6880
- "name": "data",
6881
- "hasDynamicHelp": false,
6882
- "multiple": false,
6883
- "type": "option"
6884
7024
  }
6885
7025
  },
6886
7026
  "hasDynamicHelp": false,
6887
7027
  "hiddenAliases": [],
6888
- "id": "sandbox:emit",
7028
+ "id": "sandbox:create",
6889
7029
  "pluginAlias": "@trillboards/cli",
6890
7030
  "pluginName": "@trillboards/cli",
6891
7031
  "pluginType": "core",
@@ -6896,16 +7036,23 @@
6896
7036
  "dist",
6897
7037
  "commands",
6898
7038
  "sandbox",
6899
- "emit.js"
7039
+ "create.js"
6900
7040
  ]
6901
7041
  },
6902
- "sandbox:reset": {
7042
+ "sandbox:emit": {
6903
7043
  "aliases": [],
6904
- "args": {},
6905
- "description": "Reset the sandbox — delete all test screens and events",
7044
+ "args": {
7045
+ "event_type": {
7046
+ "description": "Event type to emit (e.g. impression.recorded, heartbeat)",
7047
+ "name": "event_type",
7048
+ "required": true
7049
+ }
7050
+ },
7051
+ "description": "Emit a test event in the sandbox",
6906
7052
  "examples": [
6907
- "<%= config.bin %> sandbox reset",
6908
- "<%= config.bin %> sandbox reset --format json"
7053
+ "<%= config.bin %> sandbox emit impression.recorded",
7054
+ "<%= config.bin %> sandbox emit heartbeat",
7055
+ "<%= config.bin %> sandbox emit impression.recorded --data '{\"cpm\": 3.50}'"
6909
7056
  ],
6910
7057
  "flags": {
6911
7058
  "api-key": {
@@ -6935,11 +7082,19 @@
6935
7082
  "yaml"
6936
7083
  ],
6937
7084
  "type": "option"
7085
+ },
7086
+ "data": {
7087
+ "char": "d",
7088
+ "description": "Additional event data (JSON string)",
7089
+ "name": "data",
7090
+ "hasDynamicHelp": false,
7091
+ "multiple": false,
7092
+ "type": "option"
6938
7093
  }
6939
7094
  },
6940
7095
  "hasDynamicHelp": false,
6941
7096
  "hiddenAliases": [],
6942
- "id": "sandbox:reset",
7097
+ "id": "sandbox:emit",
6943
7098
  "pluginAlias": "@trillboards/cli",
6944
7099
  "pluginName": "@trillboards/cli",
6945
7100
  "pluginType": "core",
@@ -6950,16 +7105,16 @@
6950
7105
  "dist",
6951
7106
  "commands",
6952
7107
  "sandbox",
6953
- "reset.js"
7108
+ "emit.js"
6954
7109
  ]
6955
7110
  },
6956
- "sandbox:status": {
7111
+ "sandbox:reset": {
6957
7112
  "aliases": [],
6958
7113
  "args": {},
6959
- "description": "Show sandbox status — screens and recent events",
7114
+ "description": "Reset the sandbox — delete all test screens and events",
6960
7115
  "examples": [
6961
- "<%= config.bin %> sandbox status",
6962
- "<%= config.bin %> sandbox status --format json"
7116
+ "<%= config.bin %> sandbox reset",
7117
+ "<%= config.bin %> sandbox reset --format json"
6963
7118
  ],
6964
7119
  "flags": {
6965
7120
  "api-key": {
@@ -6993,7 +7148,7 @@
6993
7148
  },
6994
7149
  "hasDynamicHelp": false,
6995
7150
  "hiddenAliases": [],
6996
- "id": "sandbox:status",
7151
+ "id": "sandbox:reset",
6997
7152
  "pluginAlias": "@trillboards/cli",
6998
7153
  "pluginName": "@trillboards/cli",
6999
7154
  "pluginType": "core",
@@ -7004,18 +7159,16 @@
7004
7159
  "dist",
7005
7160
  "commands",
7006
7161
  "sandbox",
7007
- "status.js"
7162
+ "reset.js"
7008
7163
  ]
7009
7164
  },
7010
- "screens:watch": {
7165
+ "sandbox:status": {
7011
7166
  "aliases": [],
7012
7167
  "args": {},
7013
- "description": "Live fleet dashboard — watch all screens in real-time",
7168
+ "description": "Show sandbox status — screens and recent events",
7014
7169
  "examples": [
7015
- "<%= config.bin %> screens watch",
7016
- "<%= config.bin %> screens watch --filter online",
7017
- "<%= config.bin %> screens watch --sort earnings",
7018
- "<%= config.bin %> screens watch --format json"
7170
+ "<%= config.bin %> sandbox status",
7171
+ "<%= config.bin %> sandbox status --format json"
7019
7172
  ],
7020
7173
  "flags": {
7021
7174
  "api-key": {
@@ -7045,43 +7198,11 @@
7045
7198
  "yaml"
7046
7199
  ],
7047
7200
  "type": "option"
7048
- },
7049
- "filter": {
7050
- "description": "Filter screens by status",
7051
- "name": "filter",
7052
- "hasDynamicHelp": false,
7053
- "multiple": false,
7054
- "options": [
7055
- "online",
7056
- "offline"
7057
- ],
7058
- "type": "option"
7059
- },
7060
- "interval": {
7061
- "description": "Refresh interval in seconds",
7062
- "name": "interval",
7063
- "default": 10,
7064
- "hasDynamicHelp": false,
7065
- "multiple": false,
7066
- "type": "option"
7067
- },
7068
- "sort": {
7069
- "description": "Sort column",
7070
- "name": "sort",
7071
- "default": "name",
7072
- "hasDynamicHelp": false,
7073
- "multiple": false,
7074
- "options": [
7075
- "name",
7076
- "earnings",
7077
- "fill-rate"
7078
- ],
7079
- "type": "option"
7080
7201
  }
7081
7202
  },
7082
7203
  "hasDynamicHelp": false,
7083
7204
  "hiddenAliases": [],
7084
- "id": "screens:watch",
7205
+ "id": "sandbox:status",
7085
7206
  "pluginAlias": "@trillboards/cli",
7086
7207
  "pluginName": "@trillboards/cli",
7087
7208
  "pluginType": "core",
@@ -7091,10 +7212,10 @@
7091
7212
  "relativePath": [
7092
7213
  "dist",
7093
7214
  "commands",
7094
- "screens",
7095
- "watch.js"
7215
+ "sandbox",
7216
+ "status.js"
7096
7217
  ]
7097
7218
  }
7098
7219
  },
7099
- "version": "0.1.9"
7220
+ "version": "0.1.10"
7100
7221
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@trillboards/cli",
3
3
  "description": "Official CLI for the Trillboards DOOH API",
4
- "version": "0.1.9",
4
+ "version": "0.1.10",
5
5
  "author": "Trillboards",
6
6
  "bin": {
7
7
  "trillboards": "./bin/run.js"