@feastalytics/cli 0.1.13 → 0.1.14
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,391 @@ var CLI_MANIFEST = {
|
|
|
13810
13903
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
13811
13904
|
}
|
|
13812
13905
|
},
|
|
13906
|
+
{
|
|
13907
|
+
"id": "getCampaignBreakdown",
|
|
13908
|
+
"domain": "campaigns",
|
|
13909
|
+
"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.
|
|
13910
|
+
|
|
13911
|
+
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. 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).
|
|
13912
|
+
|
|
13913
|
+
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.`,
|
|
13914
|
+
"type": "query",
|
|
13915
|
+
"path": [
|
|
13916
|
+
"api",
|
|
13917
|
+
"campaigns",
|
|
13918
|
+
"app",
|
|
13919
|
+
"breakdown"
|
|
13920
|
+
],
|
|
13921
|
+
"inputJsonSchema": {
|
|
13922
|
+
"type": "object",
|
|
13923
|
+
"properties": {
|
|
13924
|
+
"refs": {
|
|
13925
|
+
"type": "array",
|
|
13926
|
+
"items": {
|
|
13927
|
+
"anyOf": [
|
|
13928
|
+
{
|
|
13929
|
+
"type": "object",
|
|
13930
|
+
"properties": {
|
|
13931
|
+
"type": {
|
|
13932
|
+
"type": "string",
|
|
13933
|
+
"const": "campaign"
|
|
13934
|
+
},
|
|
13935
|
+
"campaign": {
|
|
13936
|
+
"type": "object",
|
|
13937
|
+
"properties": {
|
|
13938
|
+
"campaignId": {
|
|
13939
|
+
"type": "string",
|
|
13940
|
+
"minLength": 1
|
|
13941
|
+
}
|
|
13942
|
+
},
|
|
13943
|
+
"required": [
|
|
13944
|
+
"campaignId"
|
|
13945
|
+
],
|
|
13946
|
+
"additionalProperties": false
|
|
13947
|
+
}
|
|
13948
|
+
},
|
|
13949
|
+
"required": [
|
|
13950
|
+
"type",
|
|
13951
|
+
"campaign"
|
|
13952
|
+
],
|
|
13953
|
+
"additionalProperties": false
|
|
13954
|
+
},
|
|
13955
|
+
{
|
|
13956
|
+
"type": "object",
|
|
13957
|
+
"properties": {
|
|
13958
|
+
"type": {
|
|
13959
|
+
"type": "string",
|
|
13960
|
+
"const": "channel"
|
|
13961
|
+
},
|
|
13962
|
+
"channel": {
|
|
13963
|
+
"type": "object",
|
|
13964
|
+
"properties": {
|
|
13965
|
+
"campaignId": {
|
|
13966
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
13967
|
+
},
|
|
13968
|
+
"channel": {
|
|
13969
|
+
"type": "string",
|
|
13970
|
+
"enum": [
|
|
13971
|
+
"facebook",
|
|
13972
|
+
"influencer",
|
|
13973
|
+
"tiktok",
|
|
13974
|
+
"google",
|
|
13975
|
+
"misc",
|
|
13976
|
+
"referral",
|
|
13977
|
+
"unknown"
|
|
13978
|
+
]
|
|
13979
|
+
}
|
|
13980
|
+
},
|
|
13981
|
+
"required": [
|
|
13982
|
+
"campaignId",
|
|
13983
|
+
"channel"
|
|
13984
|
+
],
|
|
13985
|
+
"additionalProperties": false
|
|
13986
|
+
}
|
|
13987
|
+
},
|
|
13988
|
+
"required": [
|
|
13989
|
+
"type",
|
|
13990
|
+
"channel"
|
|
13991
|
+
],
|
|
13992
|
+
"additionalProperties": false
|
|
13993
|
+
},
|
|
13994
|
+
{
|
|
13995
|
+
"type": "object",
|
|
13996
|
+
"properties": {
|
|
13997
|
+
"type": {
|
|
13998
|
+
"type": "string",
|
|
13999
|
+
"const": "fbCampaign"
|
|
14000
|
+
},
|
|
14001
|
+
"fbCampaign": {
|
|
14002
|
+
"type": "object",
|
|
14003
|
+
"properties": {
|
|
14004
|
+
"campaignId": {
|
|
14005
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14006
|
+
},
|
|
14007
|
+
"fbCampaignId": {
|
|
14008
|
+
"anyOf": [
|
|
14009
|
+
{
|
|
14010
|
+
"type": "string",
|
|
14011
|
+
"minLength": 1
|
|
14012
|
+
},
|
|
14013
|
+
{
|
|
14014
|
+
"type": "null"
|
|
14015
|
+
}
|
|
14016
|
+
]
|
|
14017
|
+
}
|
|
14018
|
+
},
|
|
14019
|
+
"required": [
|
|
14020
|
+
"campaignId",
|
|
14021
|
+
"fbCampaignId"
|
|
14022
|
+
],
|
|
14023
|
+
"additionalProperties": false
|
|
14024
|
+
}
|
|
14025
|
+
},
|
|
14026
|
+
"required": [
|
|
14027
|
+
"type",
|
|
14028
|
+
"fbCampaign"
|
|
14029
|
+
],
|
|
14030
|
+
"additionalProperties": false
|
|
14031
|
+
},
|
|
14032
|
+
{
|
|
14033
|
+
"type": "object",
|
|
14034
|
+
"properties": {
|
|
14035
|
+
"type": {
|
|
14036
|
+
"type": "string",
|
|
14037
|
+
"const": "fbAdset"
|
|
14038
|
+
},
|
|
14039
|
+
"fbAdset": {
|
|
14040
|
+
"type": "object",
|
|
14041
|
+
"properties": {
|
|
14042
|
+
"campaignId": {
|
|
14043
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14044
|
+
},
|
|
14045
|
+
"fbCampaignId": {
|
|
14046
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14047
|
+
},
|
|
14048
|
+
"fbAdsetId": {
|
|
14049
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14050
|
+
}
|
|
14051
|
+
},
|
|
14052
|
+
"required": [
|
|
14053
|
+
"campaignId",
|
|
14054
|
+
"fbCampaignId",
|
|
14055
|
+
"fbAdsetId"
|
|
14056
|
+
],
|
|
14057
|
+
"additionalProperties": false
|
|
14058
|
+
}
|
|
14059
|
+
},
|
|
14060
|
+
"required": [
|
|
14061
|
+
"type",
|
|
14062
|
+
"fbAdset"
|
|
14063
|
+
],
|
|
14064
|
+
"additionalProperties": false
|
|
14065
|
+
},
|
|
14066
|
+
{
|
|
14067
|
+
"type": "object",
|
|
14068
|
+
"properties": {
|
|
14069
|
+
"type": {
|
|
14070
|
+
"type": "string",
|
|
14071
|
+
"const": "fbAd"
|
|
14072
|
+
},
|
|
14073
|
+
"fbAd": {
|
|
14074
|
+
"type": "object",
|
|
14075
|
+
"properties": {
|
|
14076
|
+
"campaignId": {
|
|
14077
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14078
|
+
},
|
|
14079
|
+
"fbCampaignId": {
|
|
14080
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14081
|
+
},
|
|
14082
|
+
"fbAdsetId": {
|
|
14083
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14084
|
+
},
|
|
14085
|
+
"fbAdId": {
|
|
14086
|
+
"type": "string",
|
|
14087
|
+
"minLength": 1
|
|
14088
|
+
}
|
|
14089
|
+
},
|
|
14090
|
+
"required": [
|
|
14091
|
+
"campaignId",
|
|
14092
|
+
"fbCampaignId",
|
|
14093
|
+
"fbAdsetId",
|
|
14094
|
+
"fbAdId"
|
|
14095
|
+
],
|
|
14096
|
+
"additionalProperties": false
|
|
14097
|
+
}
|
|
14098
|
+
},
|
|
14099
|
+
"required": [
|
|
14100
|
+
"type",
|
|
14101
|
+
"fbAd"
|
|
14102
|
+
],
|
|
14103
|
+
"additionalProperties": false
|
|
14104
|
+
},
|
|
14105
|
+
{
|
|
14106
|
+
"type": "object",
|
|
14107
|
+
"properties": {
|
|
14108
|
+
"type": {
|
|
14109
|
+
"type": "string",
|
|
14110
|
+
"const": "googleCampaign"
|
|
14111
|
+
},
|
|
14112
|
+
"googleCampaign": {
|
|
14113
|
+
"type": "object",
|
|
14114
|
+
"properties": {
|
|
14115
|
+
"campaignId": {
|
|
14116
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14117
|
+
},
|
|
14118
|
+
"googleCampaignId": {
|
|
14119
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14120
|
+
}
|
|
14121
|
+
},
|
|
14122
|
+
"required": [
|
|
14123
|
+
"campaignId",
|
|
14124
|
+
"googleCampaignId"
|
|
14125
|
+
],
|
|
14126
|
+
"additionalProperties": false
|
|
14127
|
+
}
|
|
14128
|
+
},
|
|
14129
|
+
"required": [
|
|
14130
|
+
"type",
|
|
14131
|
+
"googleCampaign"
|
|
14132
|
+
],
|
|
14133
|
+
"additionalProperties": false
|
|
14134
|
+
},
|
|
14135
|
+
{
|
|
14136
|
+
"type": "object",
|
|
14137
|
+
"properties": {
|
|
14138
|
+
"type": {
|
|
14139
|
+
"type": "string",
|
|
14140
|
+
"const": "tiktokCampaign"
|
|
14141
|
+
},
|
|
14142
|
+
"tiktokCampaign": {
|
|
14143
|
+
"type": "object",
|
|
14144
|
+
"properties": {
|
|
14145
|
+
"campaignId": {
|
|
14146
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14147
|
+
},
|
|
14148
|
+
"utmCampaignId": {
|
|
14149
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14150
|
+
}
|
|
14151
|
+
},
|
|
14152
|
+
"required": [
|
|
14153
|
+
"campaignId",
|
|
14154
|
+
"utmCampaignId"
|
|
14155
|
+
],
|
|
14156
|
+
"additionalProperties": false
|
|
14157
|
+
}
|
|
14158
|
+
},
|
|
14159
|
+
"required": [
|
|
14160
|
+
"type",
|
|
14161
|
+
"tiktokCampaign"
|
|
14162
|
+
],
|
|
14163
|
+
"additionalProperties": false
|
|
14164
|
+
},
|
|
14165
|
+
{
|
|
14166
|
+
"type": "object",
|
|
14167
|
+
"properties": {
|
|
14168
|
+
"type": {
|
|
14169
|
+
"type": "string",
|
|
14170
|
+
"const": "miscSource"
|
|
14171
|
+
},
|
|
14172
|
+
"miscSource": {
|
|
14173
|
+
"type": "object",
|
|
14174
|
+
"properties": {
|
|
14175
|
+
"campaignId": {
|
|
14176
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14177
|
+
},
|
|
14178
|
+
"source": {
|
|
14179
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14180
|
+
}
|
|
14181
|
+
},
|
|
14182
|
+
"required": [
|
|
14183
|
+
"campaignId",
|
|
14184
|
+
"source"
|
|
14185
|
+
],
|
|
14186
|
+
"additionalProperties": false
|
|
14187
|
+
}
|
|
14188
|
+
},
|
|
14189
|
+
"required": [
|
|
14190
|
+
"type",
|
|
14191
|
+
"miscSource"
|
|
14192
|
+
],
|
|
14193
|
+
"additionalProperties": false
|
|
14194
|
+
},
|
|
14195
|
+
{
|
|
14196
|
+
"type": "object",
|
|
14197
|
+
"properties": {
|
|
14198
|
+
"type": {
|
|
14199
|
+
"type": "string",
|
|
14200
|
+
"const": "referrer"
|
|
14201
|
+
},
|
|
14202
|
+
"referrer": {
|
|
14203
|
+
"type": "object",
|
|
14204
|
+
"properties": {
|
|
14205
|
+
"campaignId": {
|
|
14206
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14207
|
+
},
|
|
14208
|
+
"referrerSerialNumber": {
|
|
14209
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14210
|
+
}
|
|
14211
|
+
},
|
|
14212
|
+
"required": [
|
|
14213
|
+
"campaignId",
|
|
14214
|
+
"referrerSerialNumber"
|
|
14215
|
+
],
|
|
14216
|
+
"additionalProperties": false
|
|
14217
|
+
}
|
|
14218
|
+
},
|
|
14219
|
+
"required": [
|
|
14220
|
+
"type",
|
|
14221
|
+
"referrer"
|
|
14222
|
+
],
|
|
14223
|
+
"additionalProperties": false
|
|
14224
|
+
},
|
|
14225
|
+
{
|
|
14226
|
+
"type": "object",
|
|
14227
|
+
"properties": {
|
|
14228
|
+
"type": {
|
|
14229
|
+
"type": "string",
|
|
14230
|
+
"const": "creator"
|
|
14231
|
+
},
|
|
14232
|
+
"creator": {
|
|
14233
|
+
"type": "object",
|
|
14234
|
+
"properties": {
|
|
14235
|
+
"campaignId": {
|
|
14236
|
+
"$ref": "#/properties/refs/items/anyOf/0/properties/campaign/properties/campaignId"
|
|
14237
|
+
},
|
|
14238
|
+
"promoCode": {
|
|
14239
|
+
"$ref": "#/properties/refs/items/anyOf/2/properties/fbCampaign/properties/fbCampaignId"
|
|
14240
|
+
}
|
|
14241
|
+
},
|
|
14242
|
+
"required": [
|
|
14243
|
+
"campaignId",
|
|
14244
|
+
"promoCode"
|
|
14245
|
+
],
|
|
14246
|
+
"additionalProperties": false
|
|
14247
|
+
}
|
|
14248
|
+
},
|
|
14249
|
+
"required": [
|
|
14250
|
+
"type",
|
|
14251
|
+
"creator"
|
|
14252
|
+
],
|
|
14253
|
+
"additionalProperties": false
|
|
14254
|
+
}
|
|
14255
|
+
]
|
|
14256
|
+
},
|
|
14257
|
+
"minItems": 1,
|
|
14258
|
+
"maxItems": 100
|
|
14259
|
+
},
|
|
14260
|
+
"start": {
|
|
14261
|
+
"type": "string",
|
|
14262
|
+
"format": "date-time"
|
|
14263
|
+
},
|
|
14264
|
+
"end": {
|
|
14265
|
+
"type": "string",
|
|
14266
|
+
"format": "date-time"
|
|
14267
|
+
},
|
|
14268
|
+
"attributionWindow": {
|
|
14269
|
+
"type": "string",
|
|
14270
|
+
"enum": [
|
|
14271
|
+
"infinite",
|
|
14272
|
+
"7day",
|
|
14273
|
+
"14day"
|
|
14274
|
+
],
|
|
14275
|
+
"default": "infinite"
|
|
14276
|
+
}
|
|
14277
|
+
},
|
|
14278
|
+
"required": [
|
|
14279
|
+
"refs",
|
|
14280
|
+
"start",
|
|
14281
|
+
"end"
|
|
14282
|
+
],
|
|
14283
|
+
"additionalProperties": false,
|
|
14284
|
+
"$schema": "http://json-schema.org/draft-07/schema#"
|
|
14285
|
+
}
|
|
14286
|
+
},
|
|
13813
14287
|
{
|
|
13814
14288
|
"id": "getCampaignKpis",
|
|
13815
14289
|
"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, where unit is COUNT, PERCENTAGE (0-1) or CURRENCY (cents). Covers ad performance (spend, impressions, 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.",
|
|
14290
|
+
"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, where unit is COUNT, PERCENTAGE (0-1) or CURRENCY (cents). 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
14291
|
"type": "query",
|
|
13818
14292
|
"path": [
|
|
13819
14293
|
"api",
|
|
@@ -13922,7 +14396,7 @@ var CLI_MANIFEST = {
|
|
|
13922
14396
|
{
|
|
13923
14397
|
"id": "getInfluencerBoardConfig",
|
|
13924
14398
|
"domain": "creators",
|
|
13925
|
-
"description": "Read a location's creator program settings
|
|
14399
|
+
"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
14400
|
"type": "query",
|
|
13927
14401
|
"path": [
|
|
13928
14402
|
"api",
|
|
@@ -14441,13 +14915,13 @@ var CLI_MANIFEST = {
|
|
|
14441
14915
|
{
|
|
14442
14916
|
"id": "listCampaigns",
|
|
14443
14917
|
"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.",
|
|
14918
|
+
"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
14919
|
"type": "query",
|
|
14446
14920
|
"path": [
|
|
14447
14921
|
"api",
|
|
14448
14922
|
"campaigns",
|
|
14449
14923
|
"app",
|
|
14450
|
-
"
|
|
14924
|
+
"listSummaries"
|
|
14451
14925
|
],
|
|
14452
14926
|
"inputJsonSchema": null
|
|
14453
14927
|
},
|
|
@@ -14494,7 +14968,7 @@ var CLI_MANIFEST = {
|
|
|
14494
14968
|
{
|
|
14495
14969
|
"id": "listCreatorConversations",
|
|
14496
14970
|
"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.",
|
|
14971
|
+
"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
14972
|
"type": "query",
|
|
14499
14973
|
"path": [
|
|
14500
14974
|
"api",
|
|
@@ -17665,6 +18139,32 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
17665
18139
|
"setCustomProperty"
|
|
17666
18140
|
],
|
|
17667
18141
|
"additionalProperties": false
|
|
18142
|
+
},
|
|
18143
|
+
{
|
|
18144
|
+
"type": "object",
|
|
18145
|
+
"properties": {
|
|
18146
|
+
"type": {
|
|
18147
|
+
"type": "string",
|
|
18148
|
+
"const": "sendWalletPush"
|
|
18149
|
+
},
|
|
18150
|
+
"sendWalletPush": {
|
|
18151
|
+
"type": "object",
|
|
18152
|
+
"properties": {
|
|
18153
|
+
"message": {
|
|
18154
|
+
"type": "string"
|
|
18155
|
+
}
|
|
18156
|
+
},
|
|
18157
|
+
"required": [
|
|
18158
|
+
"message"
|
|
18159
|
+
],
|
|
18160
|
+
"additionalProperties": false
|
|
18161
|
+
}
|
|
18162
|
+
},
|
|
18163
|
+
"required": [
|
|
18164
|
+
"type",
|
|
18165
|
+
"sendWalletPush"
|
|
18166
|
+
],
|
|
18167
|
+
"additionalProperties": false
|
|
17668
18168
|
}
|
|
17669
18169
|
]
|
|
17670
18170
|
}
|
|
@@ -19497,6 +19997,32 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
19497
19997
|
"setCustomProperty"
|
|
19498
19998
|
],
|
|
19499
19999
|
"additionalProperties": false
|
|
20000
|
+
},
|
|
20001
|
+
{
|
|
20002
|
+
"type": "object",
|
|
20003
|
+
"properties": {
|
|
20004
|
+
"type": {
|
|
20005
|
+
"type": "string",
|
|
20006
|
+
"const": "sendWalletPush"
|
|
20007
|
+
},
|
|
20008
|
+
"sendWalletPush": {
|
|
20009
|
+
"type": "object",
|
|
20010
|
+
"properties": {
|
|
20011
|
+
"message": {
|
|
20012
|
+
"type": "string"
|
|
20013
|
+
}
|
|
20014
|
+
},
|
|
20015
|
+
"required": [
|
|
20016
|
+
"message"
|
|
20017
|
+
],
|
|
20018
|
+
"additionalProperties": false
|
|
20019
|
+
}
|
|
20020
|
+
},
|
|
20021
|
+
"required": [
|
|
20022
|
+
"type",
|
|
20023
|
+
"sendWalletPush"
|
|
20024
|
+
],
|
|
20025
|
+
"additionalProperties": false
|
|
19500
20026
|
}
|
|
19501
20027
|
]
|
|
19502
20028
|
}
|
|
@@ -19718,7 +20244,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
19718
20244
|
{
|
|
19719
20245
|
"id": "stageFunnelEdit",
|
|
19720
20246
|
"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.",
|
|
20247
|
+
"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
20248
|
"type": "mutation",
|
|
19723
20249
|
"path": [
|
|
19724
20250
|
"api",
|
|
@@ -20473,7 +20999,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
20473
20999
|
"form"
|
|
20474
21000
|
],
|
|
20475
21001
|
"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
|
|
21002
|
+
"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
21003
|
},
|
|
20478
21004
|
{
|
|
20479
21005
|
"type": "object",
|
|
@@ -20493,6 +21019,24 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
20493
21019
|
},
|
|
20494
21020
|
"collectEmail": {
|
|
20495
21021
|
"type": "boolean"
|
|
21022
|
+
},
|
|
21023
|
+
"properties": {
|
|
21024
|
+
"type": "array",
|
|
21025
|
+
"items": {
|
|
21026
|
+
"type": "object",
|
|
21027
|
+
"properties": {
|
|
21028
|
+
"propertyId": {
|
|
21029
|
+
"type": "string"
|
|
21030
|
+
},
|
|
21031
|
+
"required": {
|
|
21032
|
+
"type": "boolean"
|
|
21033
|
+
}
|
|
21034
|
+
},
|
|
21035
|
+
"required": [
|
|
21036
|
+
"propertyId"
|
|
21037
|
+
],
|
|
21038
|
+
"additionalProperties": false
|
|
21039
|
+
}
|
|
20496
21040
|
}
|
|
20497
21041
|
},
|
|
20498
21042
|
"additionalProperties": false
|
|
@@ -20504,7 +21048,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
20504
21048
|
"signUpForm"
|
|
20505
21049
|
],
|
|
20506
21050
|
"additionalProperties": false,
|
|
20507
|
-
"description": "Sign up form widget with MemberInfoForm. Submit buttons are controlled by other renderables."
|
|
21051
|
+
"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
21052
|
},
|
|
20509
21053
|
{
|
|
20510
21054
|
"type": "object",
|
|
@@ -21733,6 +22277,9 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
21733
22277
|
],
|
|
21734
22278
|
"additionalProperties": false
|
|
21735
22279
|
},
|
|
22280
|
+
"secondary": {
|
|
22281
|
+
"$ref": "#/properties/config/properties/theme/properties/palette/properties/primary"
|
|
22282
|
+
},
|
|
21736
22283
|
"mode": {
|
|
21737
22284
|
"type": "string",
|
|
21738
22285
|
"enum": [
|
|
@@ -21757,9 +22304,15 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
21757
22304
|
"properties": {
|
|
21758
22305
|
"default": {
|
|
21759
22306
|
"type": "string"
|
|
22307
|
+
},
|
|
22308
|
+
"paper": {
|
|
22309
|
+
"type": "string"
|
|
21760
22310
|
}
|
|
21761
22311
|
},
|
|
21762
22312
|
"additionalProperties": false
|
|
22313
|
+
},
|
|
22314
|
+
"divider": {
|
|
22315
|
+
"type": "string"
|
|
21763
22316
|
}
|
|
21764
22317
|
},
|
|
21765
22318
|
"additionalProperties": false
|
|
@@ -22619,6 +23172,9 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
22619
23172
|
"isReservationFunnel": {
|
|
22620
23173
|
"type": "boolean"
|
|
22621
23174
|
},
|
|
23175
|
+
"excludeFromTextBlasts": {
|
|
23176
|
+
"type": "boolean"
|
|
23177
|
+
},
|
|
22622
23178
|
"isCreating": {
|
|
22623
23179
|
"type": "boolean"
|
|
22624
23180
|
},
|
|
@@ -23078,7 +23634,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23078
23634
|
{
|
|
23079
23635
|
"id": "updateInfluencerBoardConfig",
|
|
23080
23636
|
"domain": "creators",
|
|
23081
|
-
"description": "Create or update a location's creator program. This is an upsert
|
|
23637
|
+
"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
23638
|
"type": "mutation",
|
|
23083
23639
|
"path": [
|
|
23084
23640
|
"api",
|
|
@@ -23101,19 +23657,22 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23101
23657
|
"calendarConfigured": {
|
|
23102
23658
|
"type": "boolean"
|
|
23103
23659
|
},
|
|
23104
|
-
"schedulingMode": {
|
|
23105
|
-
"type": "string",
|
|
23106
|
-
"enum": [
|
|
23107
|
-
"self_schedule_approval",
|
|
23108
|
-
"apply_only"
|
|
23109
|
-
]
|
|
23110
|
-
},
|
|
23111
23660
|
"approverUserId": {
|
|
23112
23661
|
"type": [
|
|
23113
23662
|
"string",
|
|
23114
23663
|
"null"
|
|
23115
23664
|
]
|
|
23116
23665
|
},
|
|
23666
|
+
"bookingNotificationEmails": {
|
|
23667
|
+
"type": "array",
|
|
23668
|
+
"items": {
|
|
23669
|
+
"type": "string",
|
|
23670
|
+
"maxLength": 254,
|
|
23671
|
+
"format": "email"
|
|
23672
|
+
},
|
|
23673
|
+
"maxItems": 20,
|
|
23674
|
+
"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."
|
|
23675
|
+
},
|
|
23117
23676
|
"passConfigured": {
|
|
23118
23677
|
"type": "boolean"
|
|
23119
23678
|
},
|
|
@@ -23171,7 +23730,19 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23171
23730
|
"type": "null"
|
|
23172
23731
|
}
|
|
23173
23732
|
],
|
|
23174
|
-
"description": "
|
|
23733
|
+
"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."
|
|
23734
|
+
},
|
|
23735
|
+
"staffBookingNotes": {
|
|
23736
|
+
"anyOf": [
|
|
23737
|
+
{
|
|
23738
|
+
"type": "string",
|
|
23739
|
+
"maxLength": 2e3
|
|
23740
|
+
},
|
|
23741
|
+
{
|
|
23742
|
+
"type": "null"
|
|
23743
|
+
}
|
|
23744
|
+
],
|
|
23745
|
+
"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
23746
|
},
|
|
23176
23747
|
"minFollowerCount": {
|
|
23177
23748
|
"anyOf": [
|
|
@@ -23222,6 +23793,9 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23222
23793
|
"type": "null"
|
|
23223
23794
|
}
|
|
23224
23795
|
]
|
|
23796
|
+
},
|
|
23797
|
+
"agentPaused": {
|
|
23798
|
+
"type": "boolean"
|
|
23225
23799
|
}
|
|
23226
23800
|
},
|
|
23227
23801
|
"required": [
|
|
@@ -23644,7 +24218,8 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23644
24218
|
"enum": [
|
|
23645
24219
|
"square",
|
|
23646
24220
|
"toast-api",
|
|
23647
|
-
"toast-csv"
|
|
24221
|
+
"toast-csv",
|
|
24222
|
+
"spoton"
|
|
23648
24223
|
]
|
|
23649
24224
|
},
|
|
23650
24225
|
"isComplete": {
|
|
@@ -23902,7 +24477,7 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23902
24477
|
{
|
|
23903
24478
|
"id": "updateOrganization",
|
|
23904
24479
|
"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.",
|
|
24480
|
+
"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
24481
|
"type": "mutation",
|
|
23907
24482
|
"path": [
|
|
23908
24483
|
"api",
|
|
@@ -23924,6 +24499,70 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23924
24499
|
"null"
|
|
23925
24500
|
]
|
|
23926
24501
|
},
|
|
24502
|
+
"periodCalendar": {
|
|
24503
|
+
"anyOf": [
|
|
24504
|
+
{
|
|
24505
|
+
"anyOf": [
|
|
24506
|
+
{
|
|
24507
|
+
"type": "object",
|
|
24508
|
+
"properties": {
|
|
24509
|
+
"type": {
|
|
24510
|
+
"type": "string",
|
|
24511
|
+
"const": "fiscal"
|
|
24512
|
+
},
|
|
24513
|
+
"fiscal": {
|
|
24514
|
+
"type": "object",
|
|
24515
|
+
"properties": {
|
|
24516
|
+
"pattern": {
|
|
24517
|
+
"type": "string",
|
|
24518
|
+
"enum": [
|
|
24519
|
+
"4-4-5",
|
|
24520
|
+
"4-5-4",
|
|
24521
|
+
"5-4-4",
|
|
24522
|
+
"13x4"
|
|
24523
|
+
]
|
|
24524
|
+
},
|
|
24525
|
+
"yearEndWeekday": {
|
|
24526
|
+
"type": "string",
|
|
24527
|
+
"enum": [
|
|
24528
|
+
"sunday",
|
|
24529
|
+
"monday",
|
|
24530
|
+
"tuesday",
|
|
24531
|
+
"wednesday",
|
|
24532
|
+
"thursday",
|
|
24533
|
+
"friday",
|
|
24534
|
+
"saturday"
|
|
24535
|
+
]
|
|
24536
|
+
},
|
|
24537
|
+
"yearEndRule": {
|
|
24538
|
+
"type": "string",
|
|
24539
|
+
"enum": [
|
|
24540
|
+
"nearestDec31",
|
|
24541
|
+
"lastInDecember"
|
|
24542
|
+
]
|
|
24543
|
+
}
|
|
24544
|
+
},
|
|
24545
|
+
"required": [
|
|
24546
|
+
"pattern",
|
|
24547
|
+
"yearEndWeekday",
|
|
24548
|
+
"yearEndRule"
|
|
24549
|
+
],
|
|
24550
|
+
"additionalProperties": false
|
|
24551
|
+
}
|
|
24552
|
+
},
|
|
24553
|
+
"required": [
|
|
24554
|
+
"type",
|
|
24555
|
+
"fiscal"
|
|
24556
|
+
],
|
|
24557
|
+
"additionalProperties": false
|
|
24558
|
+
}
|
|
24559
|
+
]
|
|
24560
|
+
},
|
|
24561
|
+
{
|
|
24562
|
+
"type": "null"
|
|
24563
|
+
}
|
|
24564
|
+
]
|
|
24565
|
+
},
|
|
23927
24566
|
"scanRefractoryPeriodMs": {
|
|
23928
24567
|
"type": "number"
|
|
23929
24568
|
},
|
|
@@ -23953,9 +24592,6 @@ Example - opted-in members with more than 5 visits, newest first:
|
|
|
23953
24592
|
"isReadOnly": {
|
|
23954
24593
|
"type": "boolean"
|
|
23955
24594
|
},
|
|
23956
|
-
"isContactCardEnabled": {
|
|
23957
|
-
"type": "boolean"
|
|
23958
|
-
},
|
|
23959
24595
|
"staffInstructions": {
|
|
23960
24596
|
"anyOf": [
|
|
23961
24597
|
{
|
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.14",
|
|
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": {
|