@feastalytics/cli 0.1.13 → 0.1.15
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/dist/cli.js
CHANGED
|
@@ -8819,6 +8819,32 @@ var CLI_MANIFEST = {
|
|
|
8819
8819
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
8820
8820
|
}
|
|
8821
8821
|
},
|
|
8822
|
+
{
|
|
8823
|
+
"id": "ads_get_custom_audiences",
|
|
8824
|
+
"domain": "ads",
|
|
8825
|
+
"description": "List the custom audiences on an ad account, for the customAudienceIds and excludedCustomAudienceIds template variables. isReadyForUse false means Meta will not deliver to it, usually for too few matched people, so an ad set targeting it reaches nobody, and the size bounds are approximate and go stale while an audience is being updated. An audience belongs to the ad account, so the ids from one account are rejected by another. Nothing here says how fresh the underlying list is: a customer-list audience is a snapshot of whatever was last uploaded, and timeUpdated is when that happened.",
|
|
8826
|
+
"type": "query",
|
|
8827
|
+
"path": [
|
|
8828
|
+
"api",
|
|
8829
|
+
"ads",
|
|
8830
|
+
"facebook",
|
|
8831
|
+
"getCustomAudiences"
|
|
8832
|
+
],
|
|
8833
|
+
"inputJsonSchema": {
|
|
8834
|
+
"type": "object",
|
|
8835
|
+
"properties": {
|
|
8836
|
+
"adAccountId": {
|
|
8837
|
+
"type": "string",
|
|
8838
|
+
"minLength": 1
|
|
8839
|
+
}
|
|
8840
|
+
},
|
|
8841
|
+
"required": [
|
|
8842
|
+
"adAccountId"
|
|
8843
|
+
],
|
|
8844
|
+
"additionalProperties": false,
|
|
8845
|
+
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
8846
|
+
}
|
|
8847
|
+
},
|
|
8822
8848
|
{
|
|
8823
8849
|
"id": "ads_get_datasets",
|
|
8824
8850
|
"domain": "ads",
|
|
@@ -10675,6 +10701,32 @@ var CLI_MANIFEST = {
|
|
|
10675
10701
|
"setCustomProperty"
|
|
10676
10702
|
],
|
|
10677
10703
|
"additionalProperties": false
|
|
10704
|
+
},
|
|
10705
|
+
{
|
|
10706
|
+
"type": "object",
|
|
10707
|
+
"properties": {
|
|
10708
|
+
"type": {
|
|
10709
|
+
"type": "string",
|
|
10710
|
+
"const": "sendWalletPush"
|
|
10711
|
+
},
|
|
10712
|
+
"sendWalletPush": {
|
|
10713
|
+
"type": "object",
|
|
10714
|
+
"properties": {
|
|
10715
|
+
"message": {
|
|
10716
|
+
"type": "string"
|
|
10717
|
+
}
|
|
10718
|
+
},
|
|
10719
|
+
"required": [
|
|
10720
|
+
"message"
|
|
10721
|
+
],
|
|
10722
|
+
"additionalProperties": false
|
|
10723
|
+
}
|
|
10724
|
+
},
|
|
10725
|
+
"required": [
|
|
10726
|
+
"type",
|
|
10727
|
+
"sendWalletPush"
|
|
10728
|
+
],
|
|
10729
|
+
"additionalProperties": false
|
|
10678
10730
|
}
|
|
10679
10731
|
]
|
|
10680
10732
|
}
|
|
@@ -12567,6 +12619,32 @@ var CLI_MANIFEST = {
|
|
|
12567
12619
|
"setCustomProperty"
|
|
12568
12620
|
],
|
|
12569
12621
|
"additionalProperties": false
|
|
12622
|
+
},
|
|
12623
|
+
{
|
|
12624
|
+
"type": "object",
|
|
12625
|
+
"properties": {
|
|
12626
|
+
"type": {
|
|
12627
|
+
"type": "string",
|
|
12628
|
+
"const": "sendWalletPush"
|
|
12629
|
+
},
|
|
12630
|
+
"sendWalletPush": {
|
|
12631
|
+
"type": "object",
|
|
12632
|
+
"properties": {
|
|
12633
|
+
"message": {
|
|
12634
|
+
"type": "string"
|
|
12635
|
+
}
|
|
12636
|
+
},
|
|
12637
|
+
"required": [
|
|
12638
|
+
"message"
|
|
12639
|
+
],
|
|
12640
|
+
"additionalProperties": false
|
|
12641
|
+
}
|
|
12642
|
+
},
|
|
12643
|
+
"required": [
|
|
12644
|
+
"type",
|
|
12645
|
+
"sendWalletPush"
|
|
12646
|
+
],
|
|
12647
|
+
"additionalProperties": false
|
|
12570
12648
|
}
|
|
12571
12649
|
]
|
|
12572
12650
|
}
|
|
@@ -13029,6 +13107,9 @@ var CLI_MANIFEST = {
|
|
|
13029
13107
|
],
|
|
13030
13108
|
"additionalProperties": false
|
|
13031
13109
|
},
|
|
13110
|
+
"secondary": {
|
|
13111
|
+
"$ref": "#/properties/theme/properties/palette/properties/primary"
|
|
13112
|
+
},
|
|
13032
13113
|
"mode": {
|
|
13033
13114
|
"type": "string",
|
|
13034
13115
|
"enum": [
|
|
@@ -13053,9 +13134,15 @@ var CLI_MANIFEST = {
|
|
|
13053
13134
|
"properties": {
|
|
13054
13135
|
"default": {
|
|
13055
13136
|
"type": "string"
|
|
13137
|
+
},
|
|
13138
|
+
"paper": {
|
|
13139
|
+
"type": "string"
|
|
13056
13140
|
}
|
|
13057
13141
|
},
|
|
13058
13142
|
"additionalProperties": false
|
|
13143
|
+
},
|
|
13144
|
+
"divider": {
|
|
13145
|
+
"type": "string"
|
|
13059
13146
|
}
|
|
13060
13147
|
},
|
|
13061
13148
|
"additionalProperties": false
|
|
@@ -13347,7 +13434,7 @@ var CLI_MANIFEST = {
|
|
|
13347
13434
|
{
|
|
13348
13435
|
"id": "createInfluencerPayout",
|
|
13349
13436
|
"domain": "creators",
|
|
13350
|
-
"description": "Charges the organization's card to pay a creator's content bonus. NEVER call this on your own initiative or as part of an automated flow \u2014 every call needs the client's explicit, fresh approval to pay this specific creator, given to you directly; a standing instruction or an inferred intent does not count. The endpoint enforces its own preconditions and refuses otherwise: the visit must have a content submission approved as a paid ad (decideCreatorSubmission with approvalType 'ad' \u2014 organic approvals earn no payout), and no payout may already exist for the visit in any active status \u2014 one payout per visit, so a second call while one is pending, funding, onboarding, or paid is rejected. The bonus amount
|
|
13437
|
+
"description": "Charges the organization's card to pay a creator's content bonus. NEVER call this on your own initiative or as part of an automated flow \u2014 every call needs the client's explicit, fresh approval to pay this specific creator, given to you directly; a standing instruction or an inferred intent does not count. The endpoint enforces its own preconditions and refuses otherwise: the visit must have a content submission approved as a paid ad (decideCreatorSubmission with approvalType 'ad' \u2014 organic approvals earn no payout), and no payout may already exist for the visit in any active status \u2014 one payout per visit, so a second call while one is pending, funding, onboarding, or paid is rejected. A visit whose only attempts are FAILED or REFUNDED may be retried; the retry voids the earlier attempt's open Stripe invoice first and recomputes the default amount the same way. The bonus amount defaults to the one stamped on the submission when it was approved (falling back to the location's board config), and is grossed up so the org covers the Stripe fee. Pass amountCents only when the client explicitly asks to pay this one creator a different amount; it is written back to the submission so reporting matches what was paid. After the charge, Stripe webhooks carry it to the creator (FUNDED \u2192 onboarding if needed \u2192 PAID) with no further action from you; follow progress in queryData creators.creatorPayout.",
|
|
13351
13438
|
"type": "mutation",
|
|
13352
13439
|
"path": [
|
|
13353
13440
|
"api",
|
|
@@ -13360,6 +13447,12 @@ var CLI_MANIFEST = {
|
|
|
13360
13447
|
"eventId": {
|
|
13361
13448
|
"type": "string",
|
|
13362
13449
|
"description": "The creator visit's eventId (creatorVisitApplication.eventId) whose approved paid-ad submission is being paid out."
|
|
13450
|
+
},
|
|
13451
|
+
"amountCents": {
|
|
13452
|
+
"type": "integer",
|
|
13453
|
+
"exclusiveMinimum": 0,
|
|
13454
|
+
"maximum": 5e5,
|
|
13455
|
+
"description": "One-time bonus amount in cents for this payout only, before the Stripe fee gross-up. Omit to pay the default amount. Does not change the board config."
|
|
13363
13456
|
}
|
|
13364
13457
|
},
|
|
13365
13458
|
"required": [
|
|
@@ -13752,7 +13845,7 @@ var CLI_MANIFEST = {
|
|
|
13752
13845
|
{
|
|
13753
13846
|
"id": "getAutomationDraft",
|
|
13754
13847
|
"domain": "automations",
|
|
13755
|
-
"description": "Read an automation draft \u2014 its staged operations, the flows it touches, and the preview links that show those changes highlighted. Use the returned `operations` as `edits` on simulateAutomations to preview what the draft would do.",
|
|
13848
|
+
"description": "Read an automation draft \u2014 its staged operations, the flows it touches, the resulting automations after those operations are merged onto current live state, and the preview links that show those changes highlighted. `resultingAutomations` is what each touched automation will actually look like if the draft is saved \u2014 always check it for fields that silently changed or disappeared, not just the fields the operations explicitly mention. Use the returned `operations` as `edits` on simulateAutomations to preview what the draft would do.",
|
|
13756
13849
|
"type": "query",
|
|
13757
13850
|
"path": [
|
|
13758
13851
|
"api",
|
|
@@ -13810,10 +13903,434 @@ var CLI_MANIFEST = {
|
|
|
13810
13903
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
13811
13904
|
}
|
|
13812
13905
|
},
|
|
13906
|
+
{
|
|
13907
|
+
"id": "getCampaignBenchmarks",
|
|
13908
|
+
"domain": "campaigns",
|
|
13909
|
+
"description": "The definition and target band of every campaign metric id that getCampaignKpis and getCampaignBreakdown return. One entry per id: { id, label, unit, description, formula, benchmark }, where unit is count, percent (0-100), usd (dollars), days or multiple (ROAS, 2 = 2x), and benchmark is { min, good, great } in that unit or null when the metric has no target band. Grade a value as green at or above good, yellow at or above min, red below min; great is a stretch level (null for ROAS). The bands are fleet percentiles (P25/P50/P75 of campaigns with over 500 visitors) rounded to clean numbers, not per-organization; ROAS is anchored at 1x break-even. Call once and reuse; the table does not change per campaign.",
|
|
13910
|
+
"type": "query",
|
|
13911
|
+
"path": [
|
|
13912
|
+
"api",
|
|
13913
|
+
"campaigns",
|
|
13914
|
+
"app",
|
|
13915
|
+
"benchmarks"
|
|
13916
|
+
],
|
|
13917
|
+
"inputJsonSchema": null
|
|
13918
|
+
},
|
|
13919
|
+
{
|
|
13920
|
+
"id": "getCampaignBreakdown",
|
|
13921
|
+
"domain": "campaigns",
|
|
13922
|
+
"description": `A campaign's metrics broken down by channel, Facebook campaign, ad set, ad, referrer and creator, as a tree of nodes, loaded a batch at a time. Pass node refs, get back each node's metrics plus the refs of its children (identifiers only, no metrics). Load children by passing those refs back in.
|
|
13923
|
+
|
|
13924
|
+
Start from { type: "campaign", campaign: { campaignId } }, where campaignId is the Feast campaign id from listCampaigns. It returns the campaign totals and its channel refs. The tree is: campaign \u2192 channel (facebook, influencer, tiktok, google, misc, referral, unknown) \u2192 per channel: facebook \u2192 fbCampaign \u2192 fbAdset \u2192 fbAd; google \u2192 googleCampaign; tiktok \u2192 tiktokCampaign; misc \u2192 miscSource; referral \u2192 referrer; influencer \u2192 creator. Variants split the campaign by pass instead of by session: the campaign node lists them in details.campaign.variants (empty when the campaign has no variants), and { type: "variant", variant: { campaignId, variantId } } with variantId null is the default variant; variant nodes carry only signups, pass registration and show rate, time to show, revenue and revenue per signup. A null id inside a ref is the "Unknown" bucket for sessions that could not be matched. Refs from different campaigns can be mixed in one call (max 100).
|
|
13925
|
+
|
|
13926
|
+
Metrics use start/end as the session window. Units: sessions, visitors, signups, impressions, reach are counts; *Rate, thumbStopRatio, holdRate and uniqueClickthrough are percentages (0-100); spend, cpm, revenue, costPerSignup, revenuePerSignup are USD; averageTimeToShow is days from signup to first scan. A missing metric key means the metric does not apply to that node (for example spend on a Google row); null means it applies but could not be computed (no denominator, or Facebook was unreachable, see details.facebook.error). Facebook delivery metrics are read live from Meta.`,
|
|
13927
|
+
"type": "query",
|
|
13928
|
+
"path": [
|
|
13929
|
+
"api",
|
|
13930
|
+
"campaigns",
|
|
13931
|
+
"app",
|
|
13932
|
+
"breakdown"
|
|
13933
|
+
],
|
|
13934
|
+
"inputJsonSchema": {
|
|
13935
|
+
"type": "object",
|
|
13936
|
+
"properties": {
|
|
13937
|
+
"refs": {
|
|
13938
|
+
"type": "array",
|
|
13939
|
+
"items": {
|
|
13940
|
+
"anyOf": [
|
|
13941
|
+
{
|
|
13942
|
+
"type": "object",
|
|
13943
|
+
"properties": {
|
|
13944
|
+
"type": {
|
|
13945
|
+
"type": "string",
|
|
13946
|
+
"const": "campaign"
|
|
13947
|
+
},
|
|
13948
|
+
"campaign": {
|
|
13949
|
+
"type": "object",
|
|
13950
|
+
"properties": {
|
|
13951
|
+
"campaignId": {
|
|
13952
|
+
"type": "string",
|
|
13953
|
+
"minLength": 1
|
|
13954
|
+
}
|
|
13955
|
+
},
|
|
13956
|
+
"required": [
|
|
13957
|
+
"campaignId"
|
|
13958
|
+
],
|
|
13959
|
+
"additionalProperties": false
|
|
13960
|
+
}
|
|
13961
|
+
},
|
|
13962
|
+
"required": [
|
|
13963
|
+
"type",
|
|
13964
|
+
"campaign"
|
|
13965
|
+
],
|
|
13966
|
+
"additionalProperties": false
|
|
13967
|
+
},
|
|
13968
|
+
{
|
|
13969
|
+
"type": "object",
|
|
13970
|
+
"properties": {
|
|
13971
|
+
"type": {
|
|
13972
|
+
"type": "string",
|
|
13973
|
+
"const": "channel"
|
|
13974
|
+
},
|
|
13975
|
+
"channel": {
|
|
13976
|
+
"type": "object",
|
|
13977
|
+
"properties": {
|
|
13978
|
+
"campaignId": {
|
|
13979
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
13980
|
+
},
|
|
13981
|
+
"channel": {
|
|
13982
|
+
"type": "string",
|
|
13983
|
+
"enum": [
|
|
13984
|
+
"facebook",
|
|
13985
|
+
"influencer",
|
|
13986
|
+
"tiktok",
|
|
13987
|
+
"google",
|
|
13988
|
+
"misc",
|
|
13989
|
+
"referral",
|
|
13990
|
+
"unknown"
|
|
13991
|
+
]
|
|
13992
|
+
}
|
|
13993
|
+
},
|
|
13994
|
+
"required": [
|
|
13995
|
+
"campaignId",
|
|
13996
|
+
"channel"
|
|
13997
|
+
],
|
|
13998
|
+
"additionalProperties": false
|
|
13999
|
+
}
|
|
14000
|
+
},
|
|
14001
|
+
"required": [
|
|
14002
|
+
"type",
|
|
14003
|
+
"channel"
|
|
14004
|
+
],
|
|
14005
|
+
"additionalProperties": false
|
|
14006
|
+
},
|
|
14007
|
+
{
|
|
14008
|
+
"type": "object",
|
|
14009
|
+
"properties": {
|
|
14010
|
+
"type": {
|
|
14011
|
+
"type": "string",
|
|
14012
|
+
"const": "fbCampaign"
|
|
14013
|
+
},
|
|
14014
|
+
"fbCampaign": {
|
|
14015
|
+
"type": "object",
|
|
14016
|
+
"properties": {
|
|
14017
|
+
"campaignId": {
|
|
14018
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14019
|
+
},
|
|
14020
|
+
"fbCampaignId": {
|
|
14021
|
+
"anyOf": [
|
|
14022
|
+
{
|
|
14023
|
+
"type": "string",
|
|
14024
|
+
"minLength": 1
|
|
14025
|
+
},
|
|
14026
|
+
{
|
|
14027
|
+
"type": "null"
|
|
14028
|
+
}
|
|
14029
|
+
]
|
|
14030
|
+
}
|
|
14031
|
+
},
|
|
14032
|
+
"required": [
|
|
14033
|
+
"campaignId",
|
|
14034
|
+
"fbCampaignId"
|
|
14035
|
+
],
|
|
14036
|
+
"additionalProperties": false
|
|
14037
|
+
}
|
|
14038
|
+
},
|
|
14039
|
+
"required": [
|
|
14040
|
+
"type",
|
|
14041
|
+
"fbCampaign"
|
|
14042
|
+
],
|
|
14043
|
+
"additionalProperties": false
|
|
14044
|
+
},
|
|
14045
|
+
{
|
|
14046
|
+
"type": "object",
|
|
14047
|
+
"properties": {
|
|
14048
|
+
"type": {
|
|
14049
|
+
"type": "string",
|
|
14050
|
+
"const": "fbAdset"
|
|
14051
|
+
},
|
|
14052
|
+
"fbAdset": {
|
|
14053
|
+
"type": "object",
|
|
14054
|
+
"properties": {
|
|
14055
|
+
"campaignId": {
|
|
14056
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14057
|
+
},
|
|
14058
|
+
"fbCampaignId": {
|
|
14059
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14060
|
+
},
|
|
14061
|
+
"fbAdsetId": {
|
|
14062
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14063
|
+
}
|
|
14064
|
+
},
|
|
14065
|
+
"required": [
|
|
14066
|
+
"campaignId",
|
|
14067
|
+
"fbCampaignId",
|
|
14068
|
+
"fbAdsetId"
|
|
14069
|
+
],
|
|
14070
|
+
"additionalProperties": false
|
|
14071
|
+
}
|
|
14072
|
+
},
|
|
14073
|
+
"required": [
|
|
14074
|
+
"type",
|
|
14075
|
+
"fbAdset"
|
|
14076
|
+
],
|
|
14077
|
+
"additionalProperties": false
|
|
14078
|
+
},
|
|
14079
|
+
{
|
|
14080
|
+
"type": "object",
|
|
14081
|
+
"properties": {
|
|
14082
|
+
"type": {
|
|
14083
|
+
"type": "string",
|
|
14084
|
+
"const": "fbAd"
|
|
14085
|
+
},
|
|
14086
|
+
"fbAd": {
|
|
14087
|
+
"type": "object",
|
|
14088
|
+
"properties": {
|
|
14089
|
+
"campaignId": {
|
|
14090
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14091
|
+
},
|
|
14092
|
+
"fbCampaignId": {
|
|
14093
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14094
|
+
},
|
|
14095
|
+
"fbAdsetId": {
|
|
14096
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14097
|
+
},
|
|
14098
|
+
"fbAdId": {
|
|
14099
|
+
"type": "string",
|
|
14100
|
+
"minLength": 1
|
|
14101
|
+
}
|
|
14102
|
+
},
|
|
14103
|
+
"required": [
|
|
14104
|
+
"campaignId",
|
|
14105
|
+
"fbCampaignId",
|
|
14106
|
+
"fbAdsetId",
|
|
14107
|
+
"fbAdId"
|
|
14108
|
+
],
|
|
14109
|
+
"additionalProperties": false
|
|
14110
|
+
}
|
|
14111
|
+
},
|
|
14112
|
+
"required": [
|
|
14113
|
+
"type",
|
|
14114
|
+
"fbAd"
|
|
14115
|
+
],
|
|
14116
|
+
"additionalProperties": false
|
|
14117
|
+
},
|
|
14118
|
+
{
|
|
14119
|
+
"type": "object",
|
|
14120
|
+
"properties": {
|
|
14121
|
+
"type": {
|
|
14122
|
+
"type": "string",
|
|
14123
|
+
"const": "googleCampaign"
|
|
14124
|
+
},
|
|
14125
|
+
"googleCampaign": {
|
|
14126
|
+
"type": "object",
|
|
14127
|
+
"properties": {
|
|
14128
|
+
"campaignId": {
|
|
14129
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14130
|
+
},
|
|
14131
|
+
"googleCampaignId": {
|
|
14132
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14133
|
+
}
|
|
14134
|
+
},
|
|
14135
|
+
"required": [
|
|
14136
|
+
"campaignId",
|
|
14137
|
+
"googleCampaignId"
|
|
14138
|
+
],
|
|
14139
|
+
"additionalProperties": false
|
|
14140
|
+
}
|
|
14141
|
+
},
|
|
14142
|
+
"required": [
|
|
14143
|
+
"type",
|
|
14144
|
+
"googleCampaign"
|
|
14145
|
+
],
|
|
14146
|
+
"additionalProperties": false
|
|
14147
|
+
},
|
|
14148
|
+
{
|
|
14149
|
+
"type": "object",
|
|
14150
|
+
"properties": {
|
|
14151
|
+
"type": {
|
|
14152
|
+
"type": "string",
|
|
14153
|
+
"const": "tiktokCampaign"
|
|
14154
|
+
},
|
|
14155
|
+
"tiktokCampaign": {
|
|
14156
|
+
"type": "object",
|
|
14157
|
+
"properties": {
|
|
14158
|
+
"campaignId": {
|
|
14159
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14160
|
+
},
|
|
14161
|
+
"utmCampaignId": {
|
|
14162
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14163
|
+
}
|
|
14164
|
+
},
|
|
14165
|
+
"required": [
|
|
14166
|
+
"campaignId",
|
|
14167
|
+
"utmCampaignId"
|
|
14168
|
+
],
|
|
14169
|
+
"additionalProperties": false
|
|
14170
|
+
}
|
|
14171
|
+
},
|
|
14172
|
+
"required": [
|
|
14173
|
+
"type",
|
|
14174
|
+
"tiktokCampaign"
|
|
14175
|
+
],
|
|
14176
|
+
"additionalProperties": false
|
|
14177
|
+
},
|
|
14178
|
+
{
|
|
14179
|
+
"type": "object",
|
|
14180
|
+
"properties": {
|
|
14181
|
+
"type": {
|
|
14182
|
+
"type": "string",
|
|
14183
|
+
"const": "miscSource"
|
|
14184
|
+
},
|
|
14185
|
+
"miscSource": {
|
|
14186
|
+
"type": "object",
|
|
14187
|
+
"properties": {
|
|
14188
|
+
"campaignId": {
|
|
14189
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14190
|
+
},
|
|
14191
|
+
"source": {
|
|
14192
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14193
|
+
}
|
|
14194
|
+
},
|
|
14195
|
+
"required": [
|
|
14196
|
+
"campaignId",
|
|
14197
|
+
"source"
|
|
14198
|
+
],
|
|
14199
|
+
"additionalProperties": false
|
|
14200
|
+
}
|
|
14201
|
+
},
|
|
14202
|
+
"required": [
|
|
14203
|
+
"type",
|
|
14204
|
+
"miscSource"
|
|
14205
|
+
],
|
|
14206
|
+
"additionalProperties": false
|
|
14207
|
+
},
|
|
14208
|
+
{
|
|
14209
|
+
"type": "object",
|
|
14210
|
+
"properties": {
|
|
14211
|
+
"type": {
|
|
14212
|
+
"type": "string",
|
|
14213
|
+
"const": "referrer"
|
|
14214
|
+
},
|
|
14215
|
+
"referrer": {
|
|
14216
|
+
"type": "object",
|
|
14217
|
+
"properties": {
|
|
14218
|
+
"campaignId": {
|
|
14219
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14220
|
+
},
|
|
14221
|
+
"referrerSerialNumber": {
|
|
14222
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14223
|
+
}
|
|
14224
|
+
},
|
|
14225
|
+
"required": [
|
|
14226
|
+
"campaignId",
|
|
14227
|
+
"referrerSerialNumber"
|
|
14228
|
+
],
|
|
14229
|
+
"additionalProperties": false
|
|
14230
|
+
}
|
|
14231
|
+
},
|
|
14232
|
+
"required": [
|
|
14233
|
+
"type",
|
|
14234
|
+
"referrer"
|
|
14235
|
+
],
|
|
14236
|
+
"additionalProperties": false
|
|
14237
|
+
},
|
|
14238
|
+
{
|
|
14239
|
+
"type": "object",
|
|
14240
|
+
"properties": {
|
|
14241
|
+
"type": {
|
|
14242
|
+
"type": "string",
|
|
14243
|
+
"const": "creator"
|
|
14244
|
+
},
|
|
14245
|
+
"creator": {
|
|
14246
|
+
"type": "object",
|
|
14247
|
+
"properties": {
|
|
14248
|
+
"campaignId": {
|
|
14249
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14250
|
+
},
|
|
14251
|
+
"promoCode": {
|
|
14252
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14253
|
+
}
|
|
14254
|
+
},
|
|
14255
|
+
"required": [
|
|
14256
|
+
"campaignId",
|
|
14257
|
+
"promoCode"
|
|
14258
|
+
],
|
|
14259
|
+
"additionalProperties": false
|
|
14260
|
+
}
|
|
14261
|
+
},
|
|
14262
|
+
"required": [
|
|
14263
|
+
"type",
|
|
14264
|
+
"creator"
|
|
14265
|
+
],
|
|
14266
|
+
"additionalProperties": false
|
|
14267
|
+
},
|
|
14268
|
+
{
|
|
14269
|
+
"type": "object",
|
|
14270
|
+
"properties": {
|
|
14271
|
+
"type": {
|
|
14272
|
+
"type": "string",
|
|
14273
|
+
"const": "variant"
|
|
14274
|
+
},
|
|
14275
|
+
"variant": {
|
|
14276
|
+
"type": "object",
|
|
14277
|
+
"properties": {
|
|
14278
|
+
"campaignId": {
|
|
14279
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14280
|
+
},
|
|
14281
|
+
"variantId": {
|
|
14282
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14283
|
+
}
|
|
14284
|
+
},
|
|
14285
|
+
"required": [
|
|
14286
|
+
"campaignId",
|
|
14287
|
+
"variantId"
|
|
14288
|
+
],
|
|
14289
|
+
"additionalProperties": false
|
|
14290
|
+
}
|
|
14291
|
+
},
|
|
14292
|
+
"required": [
|
|
14293
|
+
"type",
|
|
14294
|
+
"variant"
|
|
14295
|
+
],
|
|
14296
|
+
"additionalProperties": false
|
|
14297
|
+
}
|
|
14298
|
+
]
|
|
14299
|
+
},
|
|
14300
|
+
"minItems": 1,
|
|
14301
|
+
"maxItems": 100
|
|
14302
|
+
},
|
|
14303
|
+
"start": {
|
|
14304
|
+
"type": "string",
|
|
14305
|
+
"format": "date-time"
|
|
14306
|
+
},
|
|
14307
|
+
"end": {
|
|
14308
|
+
"type": "string",
|
|
14309
|
+
"format": "date-time"
|
|
14310
|
+
},
|
|
14311
|
+
"attributionWindow": {
|
|
14312
|
+
"type": "string",
|
|
14313
|
+
"enum": [
|
|
14314
|
+
"infinite",
|
|
14315
|
+
"7day",
|
|
14316
|
+
"14day"
|
|
14317
|
+
],
|
|
14318
|
+
"default": "infinite"
|
|
14319
|
+
}
|
|
14320
|
+
},
|
|
14321
|
+
"required": [
|
|
14322
|
+
"refs",
|
|
14323
|
+
"start",
|
|
14324
|
+
"end"
|
|
14325
|
+
],
|
|
14326
|
+
"additionalProperties": false,
|
|
14327
|
+
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
14328
|
+
}
|
|
14329
|
+
},
|
|
13813
14330
|
{
|
|
13814
14331
|
"id": "getCampaignKpis",
|
|
13815
14332
|
"domain": "campaigns",
|
|
13816
|
-
"description": "Performance metrics for an acquisition campaign. campaignId is the Feast campaign's `id` from listCampaigns (a UUID), NOT the nested Meta campaignId. Returns { id, type, value, unit } per metric,
|
|
14333
|
+
"description": "Performance metrics for an acquisition campaign. campaignId is the Feast campaign's `id` from listCampaigns (a UUID), NOT the nested Meta campaignId. Returns { id, type, value, unit } per metric. Metric ids are the same camelCase ids getCampaignBreakdown uses (signupRate, thumbStopRatio, uniqueClickthrough, revenue, ...), and units match it too: count, percent (0-100), usd (dollars). Rate metrics with a target band carry benchmark: { min, good, great } in the same unit (see getCampaignBenchmarks for the full table and grading rule). Covers ad performance (spend, impressions, hook rate (thumb stop), hold rate, CTR \u2014 sourced from synced Facebook data, so ROAS is revenue divided by spend), the funnel, automations, and results. Metrics whose value would be zero are omitted rather than returned as 0 \u2014 notably spend, so an absent spend metric means no spend OR no sync yet, never a confirmed zero.",
|
|
13817
14334
|
"type": "query",
|
|
13818
14335
|
"path": [
|
|
13819
14336
|
"api",
|
|
@@ -13922,7 +14439,7 @@ var CLI_MANIFEST = {
|
|
|
13922
14439
|
{
|
|
13923
14440
|
"id": "getInfluencerBoardConfig",
|
|
13924
14441
|
"domain": "creators",
|
|
13925
|
-
"description": "Read a location's creator program settings
|
|
14442
|
+
"description": "Read a location's creator program settings (dining credit, creator bonus, follower minimum and booking limits) plus its recruitment offers. Returns config: null when the location has no program yet. Read this before writing recruitment copy: the credit and bonus amounts you are supposed to quote live here and nowhere else. Get a locationId from queryData interface.location.",
|
|
13926
14443
|
"type": "query",
|
|
13927
14444
|
"path": [
|
|
13928
14445
|
"api",
|
|
@@ -14441,13 +14958,13 @@ var CLI_MANIFEST = {
|
|
|
14441
14958
|
{
|
|
14442
14959
|
"id": "listCampaigns",
|
|
14443
14960
|
"domain": "core",
|
|
14444
|
-
"description": "The organization's acquisition campaigns, newest first. Start here to resolve a campaignId: the `id` field (a UUID) is what every other campaign tool takes, NOT the nested Meta campaign id. Also carries each campaign's name, shorthand (used in reservation links), publish state, and referrers. Read one campaign's full configuration with getCampaign.",
|
|
14961
|
+
"description": "The organization's acquisition campaigns, newest first, as summaries. Start here to resolve a campaignId: the `id` field (a UUID) is what every other campaign tool takes, NOT the nested Meta campaign id. Also carries each campaign's name, shorthand (used in reservation links), publish state, and referrers. Read one campaign's full configuration \u2014 promotions, ad copy, banner and image config \u2014 with getCampaign.",
|
|
14445
14962
|
"type": "query",
|
|
14446
14963
|
"path": [
|
|
14447
14964
|
"api",
|
|
14448
14965
|
"campaigns",
|
|
14449
14966
|
"app",
|
|
14450
|
-
"
|
|
14967
|
+
"listSummaries"
|
|
14451
14968
|
],
|
|
14452
14969
|
"inputJsonSchema": null
|
|
14453
14970
|
},
|
|
@@ -14494,7 +15011,7 @@ var CLI_MANIFEST = {
|
|
|
14494
15011
|
{
|
|
14495
15012
|
"id": "listCreatorConversations",
|
|
14496
15013
|
"domain": "creators",
|
|
14497
|
-
"description": "Every creator's SMS conversation with its unread state \u2014 the 'who is waiting on a reply' queue. `hasUnread` means their last message came in after ours and nobody has marked it read; those need a human. Each row carries the last message body, time and direction, the creator's handles, and `visitStatus`, a derived stage that is more reliable than reading raw columns off creatorVisitApplication. Read the full thread behind a row with getCreatorConversation and its userId, and reply with sendText and {type:'creator', userId}. Read-only: marking a conversation read stays in the dashboard.",
|
|
15014
|
+
"description": "Every creator's SMS conversation with its unread state \u2014 the 'who is waiting on a reply' queue. `hasUnread` means their last message came in after ours and nobody has marked it read; those need a human. Each row carries the last message body, time and direction, the creator's handles, `visitLocationIds` (every location they have a visit at, in any status), and `visitStatus`, a derived stage that is more reliable than reading raw columns off creatorVisitApplication. Read the full thread behind a row with getCreatorConversation and its userId, and reply with sendText and {type:'creator', userId}. Read-only: marking a conversation read stays in the dashboard.",
|
|
14498
15015
|
"type": "query",
|
|
14499
15016
|
"path": [
|
|
14500
15017
|
"api",
|
|
@@ -17665,6 +18182,32 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
17665
18182
|
"setCustomProperty"
|
|
17666
18183
|
],
|
|
17667
18184
|
"additionalProperties": false
|
|
18185
|
+
},
|
|
18186
|
+
{
|
|
18187
|
+
"type": "object",
|
|
18188
|
+
"properties": {
|
|
18189
|
+
"type": {
|
|
18190
|
+
"type": "string",
|
|
18191
|
+
"const": "sendWalletPush"
|
|
18192
|
+
},
|
|
18193
|
+
"sendWalletPush": {
|
|
18194
|
+
"type": "object",
|
|
18195
|
+
"properties": {
|
|
18196
|
+
"message": {
|
|
18197
|
+
"type": "string"
|
|
18198
|
+
}
|
|
18199
|
+
},
|
|
18200
|
+
"required": [
|
|
18201
|
+
"message"
|
|
18202
|
+
],
|
|
18203
|
+
"additionalProperties": false
|
|
18204
|
+
}
|
|
18205
|
+
},
|
|
18206
|
+
"required": [
|
|
18207
|
+
"type",
|
|
18208
|
+
"sendWalletPush"
|
|
18209
|
+
],
|
|
18210
|
+
"additionalProperties": false
|
|
17668
18211
|
}
|
|
17669
18212
|
]
|
|
17670
18213
|
}
|
|
@@ -19497,6 +20040,32 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
19497
20040
|
"setCustomProperty"
|
|
19498
20041
|
],
|
|
19499
20042
|
"additionalProperties": false
|
|
20043
|
+
},
|
|
20044
|
+
{
|
|
20045
|
+
"type": "object",
|
|
20046
|
+
"properties": {
|
|
20047
|
+
"type": {
|
|
20048
|
+
"type": "string",
|
|
20049
|
+
"const": "sendWalletPush"
|
|
20050
|
+
},
|
|
20051
|
+
"sendWalletPush": {
|
|
20052
|
+
"type": "object",
|
|
20053
|
+
"properties": {
|
|
20054
|
+
"message": {
|
|
20055
|
+
"type": "string"
|
|
20056
|
+
}
|
|
20057
|
+
},
|
|
20058
|
+
"required": [
|
|
20059
|
+
"message"
|
|
20060
|
+
],
|
|
20061
|
+
"additionalProperties": false
|
|
20062
|
+
}
|
|
20063
|
+
},
|
|
20064
|
+
"required": [
|
|
20065
|
+
"type",
|
|
20066
|
+
"sendWalletPush"
|
|
20067
|
+
],
|
|
20068
|
+
"additionalProperties": false
|
|
19500
20069
|
}
|
|
19501
20070
|
]
|
|
19502
20071
|
}
|
|
@@ -19718,7 +20287,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
19718
20287
|
{
|
|
19719
20288
|
"id": "stageFunnelEdit",
|
|
19720
20289
|
"domain": "funnel",
|
|
19721
|
-
"description": "Stage a single renderable edit onto a funnel draft. The edit is validated against the current screen but not saved to production.",
|
|
20290
|
+
"description": "Stage a single renderable edit onto a funnel draft. The edit is validated against the current screen but not saved to production. Returns a summary of the draft, not its edits \u2014 use getFunnelDraft to read them back, or listFunnelScreens with the draftId to see the funnel with the edits applied.",
|
|
19722
20291
|
"type": "mutation",
|
|
19723
20292
|
"path": [
|
|
19724
20293
|
"api",
|
|
@@ -20473,7 +21042,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
20473
21042
|
"form"
|
|
20474
21043
|
],
|
|
20475
21044
|
"additionalProperties": false,
|
|
20476
|
-
"description": "Form with input fields that prevents duplicate submissions and shows previous values if already submitted. **IMPORTANT RESTRICTION**: This component can ONLY be used in screens that come AFTER the signup screen. Signups
|
|
21045
|
+
"description": "Form with input fields that prevents duplicate submissions and shows previous values if already submitted. **IMPORTANT RESTRICTION**: This component can ONLY be used in screens that come AFTER the signup screen. Signups happen on screens with a signUpForm widget. Do NOT use form components in any screen that appears before or is a screen with a signUpForm in the funnel flow."
|
|
20477
21046
|
},
|
|
20478
21047
|
{
|
|
20479
21048
|
"type": "object",
|
|
@@ -20493,6 +21062,24 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
20493
21062
|
},
|
|
20494
21063
|
"collectEmail": {
|
|
20495
21064
|
"type": "boolean"
|
|
21065
|
+
},
|
|
21066
|
+
"properties": {
|
|
21067
|
+
"type": "array",
|
|
21068
|
+
"items": {
|
|
21069
|
+
"type": "object",
|
|
21070
|
+
"properties": {
|
|
21071
|
+
"propertyId": {
|
|
21072
|
+
"type": "string"
|
|
21073
|
+
},
|
|
21074
|
+
"required": {
|
|
21075
|
+
"type": "boolean"
|
|
21076
|
+
}
|
|
21077
|
+
},
|
|
21078
|
+
"required": [
|
|
21079
|
+
"propertyId"
|
|
21080
|
+
],
|
|
21081
|
+
"additionalProperties": false
|
|
21082
|
+
}
|
|
20496
21083
|
}
|
|
20497
21084
|
},
|
|
20498
21085
|
"additionalProperties": false
|
|
@@ -20504,7 +21091,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
20504
21091
|
"signUpForm"
|
|
20505
21092
|
],
|
|
20506
21093
|
"additionalProperties": false,
|
|
20507
|
-
"description": "Sign up form widget with MemberInfoForm. Submit buttons are controlled by other renderables."
|
|
21094
|
+
"description": "Sign up form widget with MemberInfoForm. Submit buttons are controlled by other renderables. Optionally collects additional custom properties alongside the member's name, phone and email; those values are written against the new member as form submissions before any sign up automation runs."
|
|
20508
21095
|
},
|
|
20509
21096
|
{
|
|
20510
21097
|
"type": "object",
|
|
@@ -21733,6 +22320,9 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
21733
22320
|
],
|
|
21734
22321
|
"additionalProperties": false
|
|
21735
22322
|
},
|
|
22323
|
+
"secondary": {
|
|
22324
|
+
"$ref": "#/properties/config/properties/theme/properties/palette/properties/primary"
|
|
22325
|
+
},
|
|
21736
22326
|
"mode": {
|
|
21737
22327
|
"type": "string",
|
|
21738
22328
|
"enum": [
|
|
@@ -21757,9 +22347,15 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
21757
22347
|
"properties": {
|
|
21758
22348
|
"default": {
|
|
21759
22349
|
"type": "string"
|
|
22350
|
+
},
|
|
22351
|
+
"paper": {
|
|
22352
|
+
"type": "string"
|
|
21760
22353
|
}
|
|
21761
22354
|
},
|
|
21762
22355
|
"additionalProperties": false
|
|
22356
|
+
},
|
|
22357
|
+
"divider": {
|
|
22358
|
+
"type": "string"
|
|
21763
22359
|
}
|
|
21764
22360
|
},
|
|
21765
22361
|
"additionalProperties": false
|
|
@@ -22619,6 +23215,9 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
22619
23215
|
"isReservationFunnel": {
|
|
22620
23216
|
"type": "boolean"
|
|
22621
23217
|
},
|
|
23218
|
+
"excludeFromTextBlasts": {
|
|
23219
|
+
"type": "boolean"
|
|
23220
|
+
},
|
|
22622
23221
|
"isCreating": {
|
|
22623
23222
|
"type": "boolean"
|
|
22624
23223
|
},
|
|
@@ -23078,7 +23677,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23078
23677
|
{
|
|
23079
23678
|
"id": "updateInfluencerBoardConfig",
|
|
23080
23679
|
"domain": "creators",
|
|
23081
|
-
"description": "Create or update a location's creator program. This is an upsert
|
|
23680
|
+
"description": "Create or update a location's creator program. This is an upsert. There is no separate create tool, and the config is keyed by locationId, one per location, so calling it for a location with no program creates one, seeding a 5000-cent dining credit and leaving landingPageConfirmed, calendarConfigured, passConfigured and reimbursementEnabled false. Omitted fields are left alone. Every program is apply-only: creators apply, the approver reviews them, and the creator AI agent texts approved creators to book the visit. reimbursementEnabled switches the board from comping the meal to reimbursing a meal the creator paid for, and foodCreditAmountCents becomes the reimbursement cap rather than a dining credit. It changes what creators are promised on the landing page, brief and rights agreement, so never set it without the client asking for it. The Design creator program task needs a positive credit and landingPageConfirmed. launchInfluencerCampaign checks the same two. maxCreatorsPerMonth caps how many creators the location's recruitment ads source each calendar month; when the cap is reached every recruitment campaign at the location pauses automatically until the 1st of the next month, and changing or clearing the cap reconciles the campaigns immediately. agentPaused: true turns the creator AI agent off for the location: no automated creator texts (AI replies, visit reminders, content follow-ups) until it is set back to false; texts sent by people still deliver.",
|
|
23082
23681
|
"type": "mutation",
|
|
23083
23682
|
"path": [
|
|
23084
23683
|
"api",
|
|
@@ -23101,19 +23700,22 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23101
23700
|
"calendarConfigured": {
|
|
23102
23701
|
"type": "boolean"
|
|
23103
23702
|
},
|
|
23104
|
-
"schedulingMode": {
|
|
23105
|
-
"type": "string",
|
|
23106
|
-
"enum": [
|
|
23107
|
-
"self_schedule_approval",
|
|
23108
|
-
"apply_only"
|
|
23109
|
-
]
|
|
23110
|
-
},
|
|
23111
23703
|
"approverUserId": {
|
|
23112
23704
|
"type": [
|
|
23113
23705
|
"string",
|
|
23114
23706
|
"null"
|
|
23115
23707
|
]
|
|
23116
23708
|
},
|
|
23709
|
+
"bookingNotificationEmails": {
|
|
23710
|
+
"type": "array",
|
|
23711
|
+
"items": {
|
|
23712
|
+
"type": "string",
|
|
23713
|
+
"maxLength": 254,
|
|
23714
|
+
"format": "email"
|
|
23715
|
+
},
|
|
23716
|
+
"maxItems": 20,
|
|
23717
|
+
"description": "Additional email addresses for scheduled, rescheduled, confirmed and cancelled visit emails and Calendar invitations. No Feast account is required. Send an empty array to remove all email-only recipients; omit to preserve them. Requires the organization's booking notification feature to be enabled."
|
|
23718
|
+
},
|
|
23117
23719
|
"passConfigured": {
|
|
23118
23720
|
"type": "boolean"
|
|
23119
23721
|
},
|
|
@@ -23171,7 +23773,19 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23171
23773
|
"type": "null"
|
|
23172
23774
|
}
|
|
23173
23775
|
],
|
|
23174
|
-
"description": "
|
|
23776
|
+
"description": "Instructions sent to the creator by the SMS agent. Despite the name, this covers the whole visit: before (download an app), during (check in with the host), or after (text a receipt). This text is injected into both pre-visit and post-visit SMS prompts. Keep staff-only information in staffBookingNotes instead. Omit to preserve; send null to clear."
|
|
23777
|
+
},
|
|
23778
|
+
"staffBookingNotes": {
|
|
23779
|
+
"anyOf": [
|
|
23780
|
+
{
|
|
23781
|
+
"type": "string",
|
|
23782
|
+
"maxLength": 2e3
|
|
23783
|
+
},
|
|
23784
|
+
{
|
|
23785
|
+
"type": "null"
|
|
23786
|
+
}
|
|
23787
|
+
],
|
|
23788
|
+
"description": "Internal notes included in restaurant booking emails and Calendar events. Never sent to creators or included in the SMS agent's instructions. Use this for staff comp policies, menu suggestions and other team-facing booking details. Omit to preserve; send null to clear."
|
|
23175
23789
|
},
|
|
23176
23790
|
"minFollowerCount": {
|
|
23177
23791
|
"anyOf": [
|
|
@@ -23222,6 +23836,9 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23222
23836
|
"type": "null"
|
|
23223
23837
|
}
|
|
23224
23838
|
]
|
|
23839
|
+
},
|
|
23840
|
+
"agentPaused": {
|
|
23841
|
+
"type": "boolean"
|
|
23225
23842
|
}
|
|
23226
23843
|
},
|
|
23227
23844
|
"required": [
|
|
@@ -23644,7 +24261,8 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23644
24261
|
"enum": [
|
|
23645
24262
|
"square",
|
|
23646
24263
|
"toast-api",
|
|
23647
|
-
"toast-csv"
|
|
24264
|
+
"toast-csv",
|
|
24265
|
+
"spoton"
|
|
23648
24266
|
]
|
|
23649
24267
|
},
|
|
23650
24268
|
"isComplete": {
|
|
@@ -23902,7 +24520,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23902
24520
|
{
|
|
23903
24521
|
"id": "updateOrganization",
|
|
23904
24522
|
"domain": "core",
|
|
23905
|
-
"description": "Update the organization record. Omitted fields are left alone, but staffInstructions is replaced wholesale rather than merged \u2014 send every key you want to keep. minimumSpendValue is in dollars; timezone is an IANA zone. staffInstructions.scan completes the Members Program Visits POS setup task, and .prepaid is additionally required for Campaign POS setup when the promotion allows pre-pay. restaurantType, isArchived and isReadOnly are admin-only and rejected otherwise.",
|
|
24523
|
+
"description": "Update the organization record. Omitted fields are left alone, but staffInstructions is replaced wholesale rather than merged \u2014 send every key you want to keep. minimumSpendValue is in dollars; timezone is an IANA zone. staffInstructions.scan completes the Members Program Visits POS setup task, and .prepaid is additionally required for Campaign POS setup when the promotion allows pre-pay. restaurantType, isArchived and isReadOnly are admin-only and rejected otherwise. periodCalendar sets how Impact and revenue plans group weeks into periods: {type: 'fiscal', fiscal: {pattern: '4-4-5' | '4-5-4' | '5-4-4' | '13x4', yearEndWeekday: 'sunday' through 'saturday', yearEndRule: 'nearestDec31' | 'lastInDecember'}}; null resets it to 13 four-week periods ending on the Sunday nearest Dec 31.",
|
|
23906
24524
|
"type": "mutation",
|
|
23907
24525
|
"path": [
|
|
23908
24526
|
"api",
|
|
@@ -23924,6 +24542,70 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23924
24542
|
"null"
|
|
23925
24543
|
]
|
|
23926
24544
|
},
|
|
24545
|
+
"periodCalendar": {
|
|
24546
|
+
"anyOf": [
|
|
24547
|
+
{
|
|
24548
|
+
"anyOf": [
|
|
24549
|
+
{
|
|
24550
|
+
"type": "object",
|
|
24551
|
+
"properties": {
|
|
24552
|
+
"type": {
|
|
24553
|
+
"type": "string",
|
|
24554
|
+
"const": "fiscal"
|
|
24555
|
+
},
|
|
24556
|
+
"fiscal": {
|
|
24557
|
+
"type": "object",
|
|
24558
|
+
"properties": {
|
|
24559
|
+
"pattern": {
|
|
24560
|
+
"type": "string",
|
|
24561
|
+
"enum": [
|
|
24562
|
+
"4-4-5",
|
|
24563
|
+
"4-5-4",
|
|
24564
|
+
"5-4-4",
|
|
24565
|
+
"13x4"
|
|
24566
|
+
]
|
|
24567
|
+
},
|
|
24568
|
+
"yearEndWeekday": {
|
|
24569
|
+
"type": "string",
|
|
24570
|
+
"enum": [
|
|
24571
|
+
"sunday",
|
|
24572
|
+
"monday",
|
|
24573
|
+
"tuesday",
|
|
24574
|
+
"wednesday",
|
|
24575
|
+
"thursday",
|
|
24576
|
+
"friday",
|
|
24577
|
+
"saturday"
|
|
24578
|
+
]
|
|
24579
|
+
},
|
|
24580
|
+
"yearEndRule": {
|
|
24581
|
+
"type": "string",
|
|
24582
|
+
"enum": [
|
|
24583
|
+
"nearestDec31",
|
|
24584
|
+
"lastInDecember"
|
|
24585
|
+
]
|
|
24586
|
+
}
|
|
24587
|
+
},
|
|
24588
|
+
"required": [
|
|
24589
|
+
"pattern",
|
|
24590
|
+
"yearEndWeekday",
|
|
24591
|
+
"yearEndRule"
|
|
24592
|
+
],
|
|
24593
|
+
"additionalProperties": false
|
|
24594
|
+
}
|
|
24595
|
+
},
|
|
24596
|
+
"required": [
|
|
24597
|
+
"type",
|
|
24598
|
+
"fiscal"
|
|
24599
|
+
],
|
|
24600
|
+
"additionalProperties": false
|
|
24601
|
+
}
|
|
24602
|
+
]
|
|
24603
|
+
},
|
|
24604
|
+
{
|
|
24605
|
+
"type": "null"
|
|
24606
|
+
}
|
|
24607
|
+
]
|
|
24608
|
+
},
|
|
23927
24609
|
"scanRefractoryPeriodMs": {
|
|
23928
24610
|
"type": "number"
|
|
23929
24611
|
},
|
|
@@ -23953,9 +24635,6 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23953
24635
|
"isReadOnly": {
|
|
23954
24636
|
"type": "boolean"
|
|
23955
24637
|
},
|
|
23956
|
-
"isContactCardEnabled": {
|
|
23957
|
-
"type": "boolean"
|
|
23958
|
-
},
|
|
23959
24638
|
"staffInstructions": {
|
|
23960
24639
|
"anyOf": [
|
|
23961
24640
|
{
|
package/feast/SKILL.md
CHANGED
|
@@ -23,6 +23,8 @@ feast call <tool> --org <organizationId> --input '<json>'
|
|
|
23
23
|
|
|
24
24
|
Always `describe` an unfamiliar tool before calling it — the schema tells you the exact required fields, and the CLI validates your `--input` against it locally before sending anything, so a bad payload fails fast with a clear message instead of a confusing server error.
|
|
25
25
|
|
|
26
|
+
That schema is also the boundary for what's worth asking the user about. Before sending a clarifying question, check whether the tool you're about to call has a field for the answer — a question about something the schema can't accept (a limit, a repeat rule, anything not in `describe`'s output) wastes a message and never gets used. Only ask about what the call in front of you can actually configure.
|
|
27
|
+
|
|
26
28
|
## Organizations: never let the API guess
|
|
27
29
|
|
|
28
30
|
Most tools act on one organization, and which one must be explicit: pass it with `--org <organizationId>`. Acting on the wrong restaurant is worse than stopping to ask, so the CLI refuses rather than guessing when the target is ambiguous.
|
|
@@ -16,7 +16,7 @@ Automations have a staging tier, and it is the default path. Changes accumulate
|
|
|
16
16
|
|
|
17
17
|
1. `listAutomationFlows` — find an existing flow. Pass `{ "campaignId": "<id>" }` for a campaign's flows, or `{ "scope": "membersProgram" }` for members-program flows. Reuse a matching flow when one fits.
|
|
18
18
|
2. If none fits, `createAutomationFlow` to make one. If the campaign/members-program has **no flows at all**, strongly prefer `applyAutomationTemplate` (then customize) over building from scratch. Only apply a template when there are no existing flows.
|
|
19
|
-
3. `listAutomations` with `{ "flowId": "<id>" }` to see the automations already in that flow before editing (omit the input to list every automation in the org).
|
|
19
|
+
3. `listAutomations` with `{ "flowId": "<id>" }` to see the automations already in that flow before editing (omit the input to list every automation in the org). **Do this immediately before every `update` op you stage, not just once at the start of the session.** An `update` replaces an automation's entire `actions` array — it does not merge one action in. If you reconstruct `actions` from an earlier tool result or from what you remember discussing, rather than the automation's current live state, you silently drop whatever isn't in your reconstruction (a reward grant, a task action, anything not under discussion in that turn). This is true even a few messages later in the same conversation, once the user has asked for a second or third change to the same automation.
|
|
20
20
|
4. `createAutomationDraft` with a short `title` describing the change in the user's terms ("Shorten the day-3 nudge") — that title is what the reviewer sees. Keep the returned `draftId`; **there is no way to list drafts, so if you lose it the draft is unreachable.**
|
|
21
21
|
5. `stageAutomationEdits` with `{ "draftId": "<id>", "operations": [...] }`. The ops are exactly the ones `batchEditAutomations` takes:
|
|
22
22
|
- `{ "type": "create", "automation": { ...full automation..., "flowId": "<id>" } }` — generate a fresh UUID for the automation's id, set the `flowId`, and include triggers, conditions, actions, send time, and a descriptive title all at once. Create ops require the flowId.
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
### The loop
|
|
10
10
|
|
|
11
11
|
1. **`listFunnelScreens`** `{ "referrer": "<subdomain>", "campaignId": "<id>" }` — read the funnel's screens to get each `screenId` and its renderables' `id`s + content. **Read before any `update` edit** — an update replaces a renderable by id, so you need its current shape. (Omit `campaignId` for a base/members-program funnel.)
|
|
12
|
-
2. **`createFunnelDraft`** `{ "referrer": "...", "campaignId": "..." }` — creates an off-prod overlay; keep the returned `draftId
|
|
12
|
+
2. **`createFunnelDraft`** `{ "referrer": "...", "campaignId": "..." }` — creates an off-prod overlay; keep the returned `draftId` and **reuse it for the rest of the conversation**. One draft holds as many edits as you need, so don't open a second one per change. Start a fresh draft after a promote (which seals the old one) or when you're abandoning what you staged — `discardFunnelDraft` the one you're leaving. Don't adopt a draft you didn't create here: an open one may hold edits someone else staged, and promoting it would ship them. If the user asks you to pick up earlier work, `listFunnelDrafts` shows what's open — confirm which one with them before staging onto it. Nothing is live yet. **Immediately inspect the funnel's current state**: open the draft's preview URL (see step 4 — with no edits staged yet it renders the live funnel as-is) so you have a visual baseline of what you're about to change. If you have a browser/screenshot tool, open and screenshot it now; if you can't view it yourself, share the URL with the user before editing.
|
|
13
13
|
3. **`stageFunnelEdit`** `{ "draftId": "...", "screenId": "...", "edit": <RenderableEdit> }` — one renderable edit per call; the server validates it against the current screen. Repeat per change. A `RenderableEdit` is a discriminated union (`describe stageFunnelEdit` for the full schema):
|
|
14
14
|
- `{ "type": "update", "id": "<renderableId>", "renderable": { ...clone of what you read, with your changes... } }` — keep the same `id`.
|
|
15
15
|
- `{ "type": "create", "renderable": { "id": "<new-uuid>", ... }, "targetId": "<sibling id>", "position": "before" | "after" | "inside" }` — generate a fresh UUID.
|
|
@@ -21,12 +21,14 @@
|
|
|
21
21
|
Iterate: re-run `listFunnelScreens` **with the `draftId`** to read the funnel *with* the staged edits, stage more, re-preview — until it's right.
|
|
22
22
|
5. **`saveFunnelEdits`** `{ "draftId": "..." }` — **promotes to prod, with no confirmation prompt**: applies the draft's edits to the live funnel and marks the draft `promoted`. To abandon instead, `discardFunnelDraft`.
|
|
23
23
|
|
|
24
|
+
**Promote once per piece of work, not once per change.** `stageFunnelEdit` rejects a draft that is not `open`, so a promote ends that draft and the next edit needs a new one. A user asking for four tweaks in a row wants four tweaks, not four promotes — stage them together and promote when the funnel is where they asked for it, or when they say to publish.
|
|
25
|
+
|
|
24
26
|
`saveFunnelEdits` can also take an inline `{ "referrer", "campaignId", "edits": [ { "screenId", "edit" } ] }` array instead of a `draftId` — a one-shot save with no persisted draft (you lose the preview step, so prefer the draft loop when the change is visual).
|
|
25
27
|
|
|
26
28
|
### Domain rules
|
|
27
29
|
- **Base screens vs campaign screens.** A campaign-owned screen is edited in place; a **base/shared screen edited in a campaign context becomes a campaign *override*** — the shared screen is left untouched. `saveFunnelEdits` decides this automatically from the draft's `campaignId`, so a change scoped to one campaign only affects that campaign.
|
|
28
30
|
- **Read before every `update`.** Construct the edit from what `listFunnelScreens` returned (renderable ids are stable), never from memory.
|
|
29
31
|
- **One edit per `stageFunnelEdit`**, staged incrementally; each is validated as it lands.
|
|
30
|
-
- **Drift guard.** `saveFunnelEdits` rejects the promote if the live funnel changed since the draft was created — re-create the draft in that case.
|
|
32
|
+
- **Drift guard.** `saveFunnelEdits` rejects the promote if the live funnel changed since the draft was created — re-create the draft in that case. Do not lean on it to catch someone else editing the same funnel; keeping to one open draft (step 2) is the real protection.
|
|
31
33
|
|
|
32
34
|
---
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feastalytics/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"description": "Command-line client for the Feastalytics platform — list, create, and update campaigns, automations, offers, and members-program rewards from the terminal.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|