late-sdk 0.0.909 → 0.0.910

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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -19
  3. data/docs/AdAccountsApi.md +88 -12
  4. data/docs/AdCampaignsApi.md +20 -20
  5. data/docs/AdCreativesApi.md +222 -0
  6. data/docs/AdInsightsApi.md +16 -16
  7. data/docs/AdTargetingApi.md +4 -4
  8. data/docs/ConversionsApi.md +8 -8
  9. data/docs/ListPartnershipAdContent200Response.md +18 -0
  10. data/docs/ListPartnershipAdContent200ResponseMediaInner.md +30 -0
  11. data/docs/ListPartnershipAdPermissions200Response.md +18 -0
  12. data/docs/ListPartnershipAdPermissions200ResponsePermissionsInner.md +22 -0
  13. data/docs/ListTikTokAdPixels200Response.md +20 -0
  14. data/docs/ListTikTokAdPixels200ResponsePixelsInner.md +26 -0
  15. data/docs/ListTikTokAdPixels200ResponsePixelsInnerEventDetailsInner.md +22 -0
  16. data/docs/ReachAndFrequencyApi.md +16 -16
  17. data/docs/SetPartnershipAdPermission200Response.md +18 -0
  18. data/docs/SetPartnershipAdPermissionRequest.md +22 -0
  19. data/lib/zernio-sdk/api/ad_accounts_api.rb +81 -6
  20. data/lib/zernio-sdk/api/ad_campaigns_api.rb +10 -10
  21. data/lib/zernio-sdk/api/ad_creatives_api.rb +218 -0
  22. data/lib/zernio-sdk/api/ad_insights_api.rb +8 -8
  23. data/lib/zernio-sdk/api/ad_targeting_api.rb +2 -2
  24. data/lib/zernio-sdk/api/conversions_api.rb +4 -4
  25. data/lib/zernio-sdk/api/reach_and_frequency_api.rb +8 -8
  26. data/lib/zernio-sdk/models/list_partnership_ad_content200_response.rb +149 -0
  27. data/lib/zernio-sdk/models/list_partnership_ad_content200_response_media_inner.rb +205 -0
  28. data/lib/zernio-sdk/models/list_partnership_ad_permissions200_response.rb +149 -0
  29. data/lib/zernio-sdk/models/list_partnership_ad_permissions200_response_permissions_inner.rb +165 -0
  30. data/lib/zernio-sdk/models/list_tik_tok_ad_pixels200_response.rb +158 -0
  31. data/lib/zernio-sdk/models/list_tik_tok_ad_pixels200_response_pixels_inner.rb +187 -0
  32. data/lib/zernio-sdk/models/list_tik_tok_ad_pixels200_response_pixels_inner_event_details_inner.rb +166 -0
  33. data/lib/zernio-sdk/models/set_partnership_ad_permission200_response.rb +147 -0
  34. data/lib/zernio-sdk/models/set_partnership_ad_permission_request.rb +219 -0
  35. data/lib/zernio-sdk/version.rb +1 -1
  36. data/lib/zernio-sdk.rb +9 -0
  37. data/openapi.yaml +632 -154
  38. data/spec/api/ad_accounts_api_spec.rb +17 -3
  39. data/spec/api/ad_campaigns_api_spec.rb +5 -5
  40. data/spec/api/ad_creatives_api_spec.rb +40 -0
  41. data/spec/api/ad_insights_api_spec.rb +4 -4
  42. data/spec/api/ad_targeting_api_spec.rb +1 -1
  43. data/spec/api/conversions_api_spec.rb +2 -2
  44. data/spec/api/reach_and_frequency_api_spec.rb +4 -4
  45. data/spec/models/list_partnership_ad_content200_response_media_inner_spec.rb +72 -0
  46. data/spec/models/list_partnership_ad_content200_response_spec.rb +36 -0
  47. data/spec/models/list_partnership_ad_permissions200_response_permissions_inner_spec.rb +48 -0
  48. data/spec/models/list_partnership_ad_permissions200_response_spec.rb +36 -0
  49. data/spec/models/list_tik_tok_ad_pixels200_response_pixels_inner_event_details_inner_spec.rb +48 -0
  50. data/spec/models/list_tik_tok_ad_pixels200_response_pixels_inner_spec.rb +60 -0
  51. data/spec/models/list_tik_tok_ad_pixels200_response_spec.rb +42 -0
  52. data/spec/models/set_partnership_ad_permission200_response_spec.rb +36 -0
  53. data/spec/models/set_partnership_ad_permission_request_spec.rb +48 -0
  54. data/zernio-sdk-0.0.910.gem +0 -0
  55. metadata +38 -2
  56. data/zernio-sdk-0.0.909.gem +0 -0
data/openapi.yaml CHANGED
@@ -587,6 +587,26 @@ components:
587
587
  description: Recommended delay before retrying, in seconds.
588
588
  schema: { type: integer, example: 60 }
589
589
  responses:
590
+ AccountUnavailable:
591
+ description: 'The account or requested resource was not found or is not accessible. An account ID may have been disconnected and removed. Read GET /v1/accounts for current account IDs.'
592
+ content:
593
+ application/json:
594
+ schema: { $ref: '#/components/schemas/ErrorResponse' }
595
+ example:
596
+ error: 'Account ID not found. It may have been disconnected and removed. Read GET /v1/accounts for current account IDs.'
597
+ type: not_found
598
+ code: account_not_found
599
+ param: accountId
600
+ AccountConnectionRequired:
601
+ description: 'The account exists but is inactive or needs reconnection. Reconnect it, then read GET /v1/accounts for its current account ID before retrying. Code: ads_connection_required.'
602
+ content:
603
+ application/json:
604
+ schema: { $ref: '#/components/schemas/ErrorResponse' }
605
+ example:
606
+ error: 'This account needs reconnection. Reconnect the account, then read GET /v1/accounts for its current account ID before retrying.'
607
+ type: invalid_request_error
608
+ code: ads_connection_required
609
+ param: accountId
590
610
  IdempotencyKeyInFlight:
591
611
  description: Same Idempotency-Key still processing; retry after a short backoff
592
612
  IdempotencyKeyReused:
@@ -24831,6 +24851,7 @@ paths:
24831
24851
  description: The Instagram account ID
24832
24852
  schema: { type: string }
24833
24853
  responses:
24854
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
24834
24855
  '200':
24835
24856
  description: Active stories
24836
24857
  content:
@@ -24854,8 +24875,7 @@ paths:
24854
24875
  timestamp: { type: [string, "null"], format: date-time, description: When the story was posted. }
24855
24876
  '400': { description: Invalid request. }
24856
24877
  '401': { $ref: '#/components/responses/Unauthorized' }
24857
- '404': { description: Instagram account not found. }
24858
-
24878
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
24859
24879
  /v1/accounts/{accountId}/instagram/publishing-limit:
24860
24880
  get:
24861
24881
  x-resource-group: "accounts"
@@ -24877,6 +24897,7 @@ paths:
24877
24897
  description: The ID of the Instagram account
24878
24898
  schema: { type: string }
24879
24899
  responses:
24900
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
24880
24901
  '200':
24881
24902
  description: Remaining publishing quota for the rolling window
24882
24903
  content:
@@ -24893,7 +24914,8 @@ paths:
24893
24914
  quotaDurationSeconds: 86400
24894
24915
  '400': { description: Not an Instagram account }
24895
24916
  '401': { $ref: '#/components/responses/Unauthorized' }
24896
- '404': { description: Account not found }
24917
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
24918
+
24897
24919
  '502': { description: Instagram rejected the request }
24898
24920
 
24899
24921
  /v1/accounts/{accountId}/instagram/audio:
@@ -24933,6 +24955,7 @@ paths:
24933
24955
  description: 'Search keywords. Omit to get the current trending list.'
24934
24956
  schema: { type: string, minLength: 1, maxLength: 200 }
24935
24957
  responses:
24958
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
24936
24959
  '200':
24937
24960
  description: Matching audio assets (may be empty)
24938
24961
  content:
@@ -24945,7 +24968,8 @@ paths:
24945
24968
  items: { $ref: '#/components/schemas/InstagramAudioAsset' }
24946
24969
  '400': { $ref: '#/components/responses/BadRequest' }
24947
24970
  '401': { $ref: '#/components/responses/Unauthorized' }
24948
- '404': { description: Account not found }
24971
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
24972
+
24949
24973
  '502': { description: Instagram rejected the request }
24950
24974
 
24951
24975
  /v1/accounts/{accountId}/instagram/audio/{audioId}:
@@ -24973,6 +24997,7 @@ paths:
24973
24997
  description: Instagram audio asset ID
24974
24998
  schema: { type: string, pattern: '^\d{1,30}$' }
24975
24999
  responses:
25000
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
24976
25001
  '200':
24977
25002
  description: The audio asset
24978
25003
  content:
@@ -24983,7 +25008,8 @@ paths:
24983
25008
  audio: { $ref: '#/components/schemas/InstagramAudioAsset' }
24984
25009
  '400': { $ref: '#/components/responses/BadRequest' }
24985
25010
  '401': { $ref: '#/components/responses/Unauthorized' }
24986
- '404': { description: Account not found }
25011
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
25012
+
24987
25013
  '502': { description: Instagram rejected the request }
24988
25014
 
24989
25015
  /v1/accounts/{accountId}/instagram/stories/{storyId}/insights:
@@ -25021,6 +25047,7 @@ paths:
25021
25047
  description: The Instagram media ID of the story.
25022
25048
  schema: { type: string }
25023
25049
  responses:
25050
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
25024
25051
  '200':
25025
25052
  description: Story insights
25026
25053
  content:
@@ -25058,7 +25085,8 @@ paths:
25058
25085
  totalInteractions: { type: integer }
25059
25086
  '400': { description: Invalid request. }
25060
25087
  '401': { $ref: '#/components/responses/Unauthorized' }
25061
- '404': { description: Instagram account not found. }
25088
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
25089
+
25062
25090
  '502': { description: 'Instagram rejected the request.' }
25063
25091
 
25064
25092
  /v1/accounts/{accountId}/pinterest-boards:
@@ -42847,6 +42875,8 @@ paths:
42847
42875
  - { name: adGroupId, in: query, schema: { type: string }, description: "Numeric Google ad group id filter." }
42848
42876
  - { name: pageToken, in: query, schema: { type: string }, description: "Cursor from paging.nextPageToken of the previous page." }
42849
42877
  responses:
42878
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
42879
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
42850
42880
  '200':
42851
42881
  description: Search terms
42852
42882
  content:
@@ -42889,7 +42919,7 @@ paths:
42889
42919
  operationId: listBidStrategies
42890
42920
  tags: ["Ad Campaigns"]
42891
42921
  x-platforms: ["google"]
42892
- summary: List Google Ads portfolio bid strategies
42922
+ summary: 'List portfolio bid strategies'
42893
42923
  description: >-
42894
42924
  Bidding strategy report: type, status, campaign count, clicks, cost, cost per
42895
42925
  conversion, impressions, average CPC and conversions over the date range (default
@@ -42905,6 +42935,7 @@ paths:
42905
42935
  - { name: fromDate, in: query, schema: { type: string, format: date }, description: "Defaults to 30 days ago." }
42906
42936
  - { name: toDate, in: query, schema: { type: string, format: date }, description: "Defaults to today." }
42907
42937
  responses:
42938
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
42908
42939
  '200':
42909
42940
  description: Portfolio bid strategies
42910
42941
  content:
@@ -42921,7 +42952,8 @@ paths:
42921
42952
  stale: { type: boolean, description: "True when Google's daily API quota was exhausted and this is the last successful fetch, not a live read." }
42922
42953
  '400': { $ref: '#/components/responses/BadRequest' }
42923
42954
  '401': { $ref: '#/components/responses/Unauthorized' }
42924
- '404': { $ref: '#/components/responses/NotFound' }
42955
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
42956
+
42925
42957
  '429': { description: "Google Ads operations budget exhausted; retry later." }
42926
42958
  '501': { description: Only available on Google Ads accounts }
42927
42959
  post:
@@ -42929,7 +42961,7 @@ paths:
42929
42961
  operationId: createBidStrategy
42930
42962
  tags: ["Ad Campaigns"]
42931
42963
  x-platforms: ["google"]
42932
- summary: Create a Google Ads portfolio bid strategy
42964
+ summary: 'Create portfolio bid strategy'
42933
42965
  description: >-
42934
42966
  Creates a standalone bid strategy shared across campaigns. Attach it to a campaign
42935
42967
  with `portfolioBidStrategyId` on POST /v1/ads/create, PUT /v1/ads/campaigns/{campaignId},
@@ -42952,6 +42984,7 @@ paths:
42952
42984
  targetCpa: { type: number, exclusiveMinimum: 0, description: "Required when type is TARGET_CPA, in the account's currency units." }
42953
42985
  targetRoas: { type: number, exclusiveMinimum: 0, description: "Required when type is TARGET_ROAS; a multiplier (2.0 = 2.0x)." }
42954
42986
  responses:
42987
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
42955
42988
  '201':
42956
42989
  description: Bid strategy created
42957
42990
  content:
@@ -42967,7 +43000,8 @@ paths:
42967
43000
  resourceName: { type: string }
42968
43001
  '400': { description: "Invalid input, or Google rejected the strategy (e.g. shared-budget alignment). The message carries Google's error." }
42969
43002
  '401': { $ref: '#/components/responses/Unauthorized' }
42970
- '404': { $ref: '#/components/responses/NotFound' }
43003
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43004
+
42971
43005
  '422': { description: "No Google Ads customer accounts on this connection. Reconnect Google Ads." }
42972
43006
  '429': { description: "Google Ads operations budget exhausted; retry later." }
42973
43007
  '501': { description: Only available on Google Ads accounts }
@@ -42978,7 +43012,7 @@ paths:
42978
43012
  operationId: updateBidStrategy
42979
43013
  tags: ["Ad Campaigns"]
42980
43014
  x-platforms: ["google"]
42981
- summary: Update a Google Ads portfolio bid strategy
43015
+ summary: 'Update portfolio bid strategy'
42982
43016
  description: >-
42983
43017
  Renames or retargets a portfolio bid strategy. The strategy's status is output only
42984
43018
  on Google's side, so it cannot be changed here; remove a strategy in Google Ads.
@@ -43005,6 +43039,7 @@ paths:
43005
43039
  targetCpa: { type: number, exclusiveMinimum: 0 }
43006
43040
  targetRoas: { type: number, exclusiveMinimum: 0 }
43007
43041
  responses:
43042
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43008
43043
  '200':
43009
43044
  description: Bid strategy updated
43010
43045
  content:
@@ -43018,7 +43053,8 @@ paths:
43018
43053
  customerId: { type: string }
43019
43054
  '400': { $ref: '#/components/responses/BadRequest' }
43020
43055
  '401': { $ref: '#/components/responses/Unauthorized' }
43021
- '404': { $ref: '#/components/responses/NotFound' }
43056
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43057
+
43022
43058
  '429': { description: "Google Ads operations budget exhausted; retry later." }
43023
43059
  '501': { description: Only available on Google Ads accounts }
43024
43060
 
@@ -43048,6 +43084,8 @@ paths:
43048
43084
  - { name: chargedOnly, in: query, schema: { type: boolean }, description: "true = only leads Google charged for." }
43049
43085
  - { name: pageToken, in: query, schema: { type: string }, description: "Cursor from paging.nextPageToken of the previous page." }
43050
43086
  responses:
43087
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43088
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43051
43089
  '200':
43052
43090
  description: Local Services leads
43053
43091
  content:
@@ -43093,7 +43131,7 @@ paths:
43093
43131
  operationId: listLocalServicesLeadConversations
43094
43132
  tags: ["Ad Insights"]
43095
43133
  x-platforms: ["google"]
43096
- summary: Conversations of a Local Services lead
43134
+ summary: 'List lead conversations'
43097
43135
  description: |-
43098
43136
  Conversation entries of one Local Services lead: phone calls (duration,
43099
43137
  recording URL) and messages (text, attachment URLs), oldest first. Read
@@ -43108,6 +43146,8 @@ paths:
43108
43146
  - { name: customerId, in: query, schema: { type: string }, description: "Numeric Google Ads customer id (no dashes). Defaults to the account's connected customer." }
43109
43147
  - { name: pageToken, in: query, schema: { type: string }, description: "Cursor from paging.nextPageToken of the previous page." }
43110
43148
  responses:
43149
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43150
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43111
43151
  '200':
43112
43152
  description: Lead conversations
43113
43153
  content:
@@ -43199,7 +43239,7 @@ paths:
43199
43239
  operationId: addAdKeywords
43200
43240
  tags: ["Ad Campaigns"]
43201
43241
  x-platforms: ["google"]
43202
- summary: Add Search keywords to an ad group
43242
+ summary: 'Add Search ad-group keywords'
43203
43243
  description: |
43204
43244
  Adds one or more keyword criteria to an existing Google Search ad group,
43205
43245
  without touching the keywords already there (unlike the whole-set diff on
@@ -43233,6 +43273,7 @@ paths:
43233
43273
  matchType: { type: string, enum: [exact, phrase, broad] }
43234
43274
  negative: { type: boolean, default: false, description: 'Add as ad-group-level negatives instead of positive keywords' }
43235
43275
  responses:
43276
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43236
43277
  '201':
43237
43278
  description: Keywords added
43238
43279
  content:
@@ -43245,7 +43286,8 @@ paths:
43245
43286
  items: { $ref: '#/components/schemas/AdKeyword' }
43246
43287
  '400': { $ref: '#/components/responses/BadRequest' }
43247
43288
  '401': { $ref: '#/components/responses/Unauthorized' }
43248
- '404': { description: 'The ad group ("adSetId") was not found for this account.' }
43289
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43290
+
43249
43291
  '501': { description: Only available on Google Ads accounts }
43250
43292
 
43251
43293
  /v1/ads/keywords/{keywordId}:
@@ -43272,6 +43314,7 @@ paths:
43272
43314
  properties:
43273
43315
  status: { type: string, enum: [active, paused] }
43274
43316
  responses:
43317
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43275
43318
  '200':
43276
43319
  description: Keyword updated
43277
43320
  content:
@@ -43282,7 +43325,8 @@ paths:
43282
43325
  keyword: { $ref: '#/components/schemas/AdKeyword' }
43283
43326
  '400': { $ref: '#/components/responses/BadRequest' }
43284
43327
  '401': { $ref: '#/components/responses/Unauthorized' }
43285
- '404': { description: Keyword not found }
43328
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43329
+
43286
43330
  '422': { description: 'Negative keywords have no status on Google; they cannot be paused or enabled.' }
43287
43331
  delete:
43288
43332
  x-resource-group: "ads"
@@ -43296,6 +43340,7 @@ paths:
43296
43340
  parameters:
43297
43341
  - { name: keywordId, in: path, required: true, schema: { type: string }, description: Zernio keyword ID (not the Google criterion ID) }
43298
43342
  responses:
43343
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43299
43344
  '200':
43300
43345
  description: Keyword removed
43301
43346
  content:
@@ -43307,8 +43352,7 @@ paths:
43307
43352
  keywordId: { type: string }
43308
43353
  '400': { $ref: '#/components/responses/BadRequest' }
43309
43354
  '401': { $ref: '#/components/responses/Unauthorized' }
43310
- '404': { description: Keyword not found }
43311
-
43355
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43312
43356
  /v1/ads/campaigns:
43313
43357
  get:
43314
43358
  x-resource-group: "ads"
@@ -43351,6 +43395,8 @@ paths:
43351
43395
  - { name: hasDelivery, in: query, schema: { type: boolean }, description: "Return only campaigns that delivered between `fromDate` and `toDate`: spend above zero, or impressions served at zero spend. Unlike `status`, which reads a campaign's CURRENT state, this filters on what happened inside the window. Filters the campaign set itself, so `pagination.total` counts only matching campaigns. Mirrors the same filter on /v1/ads/tree." }
43352
43396
  - { name: minSpend, in: query, schema: { type: number, minimum: 0 }, description: "Return only campaigns whose spend between `fromDate` and `toDate` reaches this amount, in each campaign's OWN currency (the `currency` field on the campaign). Implies `hasDelivery`; `minSpend=0` applies no filter. Mirrors the same filter on /v1/ads/tree." }
43353
43397
  responses:
43398
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43399
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43354
43400
  '200':
43355
43401
  description: Paginated campaigns
43356
43402
  content:
@@ -43465,6 +43511,8 @@ paths:
43465
43511
  status: PAUSED
43466
43512
  validateOnly: true
43467
43513
  responses:
43514
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43515
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43468
43516
  '200':
43469
43517
  description: 'Campaign validation passed without creating a campaign.'
43470
43518
  content:
@@ -43578,6 +43626,7 @@ paths:
43578
43626
  - { name: platform, in: query, required: true, schema: { type: string, enum: [google] }, description: "Required: campaign IDs are not globally unique. Only \"google\" is supported today." }
43579
43627
  - { name: customerId, in: query, required: false, schema: { type: string }, description: "Numeric Google Ads customer id (no dashes). Required when the connection has multiple Google Ads accounts; optional (and inferred) when it has only one." }
43580
43628
  responses:
43629
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43581
43630
  '200':
43582
43631
  description: Campaign bidding
43583
43632
  content:
@@ -43593,8 +43642,8 @@ paths:
43593
43642
  '401': { $ref: '#/components/responses/Unauthorized' }
43594
43643
  '403':
43595
43644
  description: "Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans."
43596
- '404':
43597
- description: Campaign not found on Google Ads
43645
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43646
+
43598
43647
  '501':
43599
43648
  description: "Not a Google Ads account: the connection behind accountId resolves to another platform."
43600
43649
 
@@ -43693,8 +43742,9 @@ paths:
43693
43742
  '401': { $ref: '#/components/responses/Unauthorized' }
43694
43743
  '403':
43695
43744
  description: 'Returned with code `ads_allowance_exceeded` when the team has no payment method on file and has reached the 500 free live ads: add a card to resume.'
43696
- '404': { description: Campaign not found }
43697
- '409': { description: "Meta campaign is ABO, or the Google budget is shared without allowSharedBudgetUpdate=true, or sharing state cannot be verified." }
43745
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43746
+
43747
+ '409': { description: 'Meta campaign is ABO, or the Google budget is shared without allowSharedBudgetUpdate=true, or sharing state cannot be verified. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.' }
43698
43748
  '501': { description: Operation not supported on this platform }
43699
43749
 
43700
43750
  delete:
@@ -43730,6 +43780,8 @@ paths:
43730
43780
  platform: { type: string, enum: [facebook, instagram, google] }
43731
43781
  accountId: { type: string, description: "Zernio SocialAccount id owning the ad account. Required only to delete an EMPTY campaign (zero ads), which has no local Ad documents to resolve a token from." }
43732
43782
  responses:
43783
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
43784
+ '400': { $ref: '#/components/responses/BadRequest' }
43733
43785
  '200':
43734
43786
  description: Campaign deleted
43735
43787
  content:
@@ -43740,7 +43792,8 @@ paths:
43740
43792
  deleted: { type: boolean }
43741
43793
  adCount: { type: integer, description: Number of local Ad docs marked cancelled }
43742
43794
  '401': { $ref: '#/components/responses/Unauthorized' }
43743
- '404': { description: Campaign not found }
43795
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
43796
+
43744
43797
  '501': { description: Operation not supported on this platform }
43745
43798
 
43746
43799
  /v1/ads/campaigns/{campaignId}/negative-keywords:
@@ -44285,6 +44338,7 @@ paths:
44285
44338
  status: { type: string, enum: [ACTIVE, PAUSED], default: PAUSED }
44286
44339
  customerId: { type: string, description: "Numeric Google Ads customer id. Only required when the connection has more than one." }
44287
44340
  responses:
44341
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
44288
44342
  '201':
44289
44343
  description: Ad group created
44290
44344
  content:
@@ -44298,7 +44352,8 @@ paths:
44298
44352
  '401': { $ref: '#/components/responses/Unauthorized' }
44299
44353
  '403':
44300
44354
  description: 'Returned with code `ads_allowance_exceeded` when the team has no payment method on file and has reached the 500 free live ads: add a card to resume.'
44301
- '404': { description: accountId does not belong to a Google Ads connection }
44355
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
44356
+
44302
44357
  '501': { description: Only supported on Google Ads }
44303
44358
 
44304
44359
  /v1/ads/ad-sets/{adSetId}/duplicate:
@@ -44429,7 +44484,7 @@ paths:
44429
44484
  operationId: getAdSetDetails
44430
44485
  tags: ["Ad Campaigns"]
44431
44486
  x-platforms: ["meta"]
44432
- summary: Live ad-set details incl. learning phase
44487
+ summary: 'Get live ad-set details'
44433
44488
  description: |-
44434
44489
  Reads the ad set live from Meta, returned verbatim. The default projection includes
44435
44490
  `learning_stage_info` (learning-phase status: LEARNING / SUCCESS / FAIL / WAIVING; Meta
@@ -44443,6 +44498,8 @@ paths:
44443
44498
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token." }
44444
44499
  - { name: fields, in: query, schema: { type: string }, description: "Comma-separated Graph field override (supports nested {} projections)." }
44445
44500
  responses:
44501
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
44502
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
44446
44503
  '200':
44447
44504
  description: The ad set as returned by Meta
44448
44505
  content:
@@ -45263,6 +45320,7 @@ paths:
45263
45320
  pattern: ^\d+$
45264
45321
  description: "Google customer id without dashes. Required when the connection has multiple customers."
45265
45322
  responses:
45323
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
45266
45324
  '200':
45267
45325
  description: "Assets returned."
45268
45326
  content:
@@ -45331,8 +45389,8 @@ paths:
45331
45389
  $ref: '#/components/responses/Unauthorized'
45332
45390
  '403':
45333
45391
  description: "Ads access is required."
45334
- '404':
45335
- $ref: '#/components/responses/NotFound'
45392
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
45393
+
45336
45394
  '429':
45337
45395
  description: "Google Ads operations budget or platform quota exhausted."
45338
45396
  '501':
@@ -45412,6 +45470,7 @@ paths:
45412
45470
  - Analytics
45413
45471
  - Messaging
45414
45472
  responses:
45473
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
45415
45474
  '201':
45416
45475
  description: "Assets created and attached."
45417
45476
  content:
@@ -45439,8 +45498,8 @@ paths:
45439
45498
  $ref: '#/components/responses/Unauthorized'
45440
45499
  '403':
45441
45500
  description: "Ads access is required."
45442
- '404':
45443
- $ref: '#/components/responses/NotFound'
45501
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
45502
+
45444
45503
  '429':
45445
45504
  description: "Google Ads operations budget or platform quota exhausted."
45446
45505
  '501':
@@ -45498,6 +45557,7 @@ paths:
45498
45557
  calloutAsset:
45499
45558
  calloutText: Simple integration
45500
45559
  responses:
45560
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
45501
45561
  '200':
45502
45562
  description: "Assets returned."
45503
45563
  content:
@@ -45513,8 +45573,8 @@ paths:
45513
45573
  $ref: '#/components/responses/Unauthorized'
45514
45574
  '403':
45515
45575
  description: "Ads access is required."
45516
- '404':
45517
- $ref: '#/components/responses/NotFound'
45576
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
45577
+
45518
45578
  '429':
45519
45579
  description: "Google Ads operations budget or platform quota exhausted."
45520
45580
  '501':
@@ -45575,6 +45635,7 @@ paths:
45575
45635
  campaignAssetResourceNames:
45576
45636
  - customers/1234567890/campaignAssets/456~123~CALLOUT
45577
45637
  responses:
45638
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
45578
45639
  '200':
45579
45640
  description: "Assets returned."
45580
45641
  content:
@@ -45590,8 +45651,8 @@ paths:
45590
45651
  $ref: '#/components/responses/Unauthorized'
45591
45652
  '403':
45592
45653
  description: "Ads access is required."
45593
- '404':
45594
- $ref: '#/components/responses/NotFound'
45654
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
45655
+
45595
45656
  '429':
45596
45657
  description: "Google Ads operations budget or platform quota exhausted."
45597
45658
  '501':
@@ -45632,6 +45693,7 @@ paths:
45632
45693
  pattern: ^\d+$
45633
45694
  description: "Google customer id without dashes. Required when the connection has multiple customers."
45634
45695
  responses:
45696
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
45635
45697
  '200':
45636
45698
  description: "Assets returned."
45637
45699
  content:
@@ -45700,8 +45762,8 @@ paths:
45700
45762
  $ref: '#/components/responses/Unauthorized'
45701
45763
  '403':
45702
45764
  description: "Ads access is required."
45703
- '404':
45704
- $ref: '#/components/responses/NotFound'
45765
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
45766
+
45705
45767
  '429':
45706
45768
  description: "Google Ads operations budget or platform quota exhausted."
45707
45769
  '501':
@@ -45781,6 +45843,7 @@ paths:
45781
45843
  - Analytics
45782
45844
  - Messaging
45783
45845
  responses:
45846
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
45784
45847
  '201':
45785
45848
  description: "Assets created and attached."
45786
45849
  content:
@@ -45808,8 +45871,8 @@ paths:
45808
45871
  $ref: '#/components/responses/Unauthorized'
45809
45872
  '403':
45810
45873
  description: "Ads access is required."
45811
- '404':
45812
- $ref: '#/components/responses/NotFound'
45874
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
45875
+
45813
45876
  '429':
45814
45877
  description: "Google Ads operations budget or platform quota exhausted."
45815
45878
  '501':
@@ -45867,6 +45930,7 @@ paths:
45867
45930
  calloutAsset:
45868
45931
  calloutText: Simple integration
45869
45932
  responses:
45933
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
45870
45934
  '200':
45871
45935
  description: "Assets returned."
45872
45936
  content:
@@ -45882,8 +45946,8 @@ paths:
45882
45946
  $ref: '#/components/responses/Unauthorized'
45883
45947
  '403':
45884
45948
  description: "Ads access is required."
45885
- '404':
45886
- $ref: '#/components/responses/NotFound'
45949
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
45950
+
45887
45951
  '429':
45888
45952
  description: "Google Ads operations budget or platform quota exhausted."
45889
45953
  '501':
@@ -45944,6 +46008,7 @@ paths:
45944
46008
  adGroupAssetResourceNames:
45945
46009
  - customers/1234567890/adGroupAssets/456~123~CALLOUT
45946
46010
  responses:
46011
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
45947
46012
  '200':
45948
46013
  description: "Assets returned."
45949
46014
  content:
@@ -45959,8 +46024,8 @@ paths:
45959
46024
  $ref: '#/components/responses/Unauthorized'
45960
46025
  '403':
45961
46026
  description: "Ads access is required."
45962
- '404':
45963
- $ref: '#/components/responses/NotFound'
46027
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
46028
+
45964
46029
  '429':
45965
46030
  description: "Google Ads operations budget or platform quota exhausted."
45966
46031
  '501':
@@ -46084,6 +46149,8 @@ paths:
46084
46149
  additionalProperties: true
46085
46150
  description: "Raw Meta creative spec forwarded verbatim to /generatepreviews. Mutually exclusive with existingCreativeId."
46086
46151
  responses:
46152
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
46153
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
46087
46154
  '200':
46088
46155
  description: Rendered previews
46089
46156
  content:
@@ -46195,7 +46262,7 @@ paths:
46195
46262
  operationId: generateKeywordIdeas
46196
46263
  tags: ["Ad Insights"]
46197
46264
  x-platforms: ["google"]
46198
- summary: Generate keyword ideas (Google Keyword Planner)
46265
+ summary: 'Generate keyword ideas'
46199
46266
  description: |
46200
46267
  Google Ads only. Runs Keyword Planner's generateKeywordIdeas from seed keywords, a seed URL,
46201
46268
  or both, returning idea rows verbatim (avgMonthlySearches, competition, competitionIndex,
@@ -46222,6 +46289,8 @@ paths:
46222
46289
  pageSize: { type: integer, minimum: 1, maximum: 10000 }
46223
46290
  pageToken: { type: string, description: "Cursor from paging.nextPageToken of the previous page." }
46224
46291
  responses:
46292
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
46293
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
46225
46294
  '200':
46226
46295
  description: Keyword idea rows (raw Keyword Planner shape)
46227
46296
  content:
@@ -46249,7 +46318,7 @@ paths:
46249
46318
  operationId: generateKeywordHistoricalMetrics
46250
46319
  tags: ["Ad Insights"]
46251
46320
  x-platforms: ["google"]
46252
- summary: Historical keyword metrics (Google Keyword Planner)
46321
+ summary: 'Get historical keyword metrics'
46253
46322
  description: |
46254
46323
  Google Ads only. Runs Keyword Planner's generateKeywordHistoricalMetrics for up to 1,000
46255
46324
  exact keywords: historical search volume, competition and top-of-page bid ranges, plus
@@ -46274,6 +46343,8 @@ paths:
46274
46343
  includeAdultKeywords: { type: boolean }
46275
46344
  includeAverageCpc: { type: boolean, description: "Adds averageCpcMicros to each row's keywordMetrics." }
46276
46345
  responses:
46346
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
46347
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
46277
46348
  '200':
46278
46349
  description: Historical metric rows (raw Keyword Planner shape)
46279
46350
  content:
@@ -46337,6 +46408,8 @@ paths:
46337
46408
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 500, default: 25 }, description: Rows per page }
46338
46409
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
46339
46410
  responses:
46411
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
46412
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
46340
46413
  '200':
46341
46414
  description: Insight rows (raw platform shape)
46342
46415
  content:
@@ -46366,7 +46439,7 @@ paths:
46366
46439
  operationId: createAdInsightsReport
46367
46440
  tags: ["Ad Insights"]
46368
46441
  x-platforms: ["meta"]
46369
- summary: Submit an async insights report run
46442
+ summary: 'Submit async insights report'
46370
46443
  description: |
46371
46444
  Submits an asynchronous Meta insights report. Same query surface as GET /v1/ads/insights, but
46372
46445
  in the JSON body; Meta processes the report server-side, which is the right choice for long
@@ -46410,6 +46483,8 @@ paths:
46410
46483
  timeIncrement:
46411
46484
  oneOf: [{ type: integer, minimum: 1, maximum: 90 }, { type: string, enum: [monthly, all_days] }]
46412
46485
  responses:
46486
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
46487
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
46413
46488
  '202':
46414
46489
  description: Report run submitted
46415
46490
  content:
@@ -46443,6 +46518,8 @@ paths:
46443
46518
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 500, default: 25 } }
46444
46519
  - { name: after, in: query, schema: { type: string } }
46445
46520
  responses:
46521
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
46522
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
46446
46523
  '200':
46447
46524
  description: Report run status (plus results when completed)
46448
46525
  content:
@@ -47002,6 +47079,7 @@ paths:
47002
47079
  parameters:
47003
47080
  - { name: accountId, in: query, required: true, schema: { type: string }, description: ID of the `tiktokads` (or parent `tiktok` posting) SocialAccount }
47004
47081
  responses:
47082
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47005
47083
  '200':
47006
47084
  description: Business centers
47007
47085
  content:
@@ -47014,7 +47092,8 @@ paths:
47014
47092
  items: { $ref: '#/components/schemas/BusinessCenter' }
47015
47093
  '400': { $ref: '#/components/responses/BadRequest' }
47016
47094
  '401': { $ref: '#/components/responses/Unauthorized' }
47017
- '404': { description: TikTok account not found }
47095
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47096
+
47018
47097
  '422': { description: TikTok Ads not connected }
47019
47098
 
47020
47099
  /v1/ads/activity:
@@ -47041,6 +47120,8 @@ paths:
47041
47120
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 200, default: 50 }, description: Rows per page }
47042
47121
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
47043
47122
  responses:
47123
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47124
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47044
47125
  '200':
47045
47126
  description: Activity rows (raw Meta shape)
47046
47127
  content:
@@ -47066,7 +47147,7 @@ paths:
47066
47147
  operationId: createRfPrediction
47067
47148
  tags: ["Reach and Frequency"]
47068
47149
  x-platforms: ["meta"]
47069
- summary: Create a Reach & Frequency prediction
47150
+ summary: 'Create reach-frequency prediction'
47070
47151
  description: |-
47071
47152
  Creates an R&F prediction. This is a QUOTE, nothing is bought and no ad entities are created.
47072
47153
  Provide a date range plus exactly one of `budgetAmount` (Meta predicts reach) or `reach`
@@ -47099,6 +47180,8 @@ paths:
47099
47180
  targeting: { type: object, description: "Canonical camelCase TargetingSpec (same shape as /v1/ads/create's `targeting`). Defaults to countries: [US]." }
47100
47181
  placements: { type: object, description: "Meta placements object (same shape as /v1/ads/create's `placements`)." }
47101
47182
  responses:
47183
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47184
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47102
47185
  '201':
47103
47186
  description: Prediction created (usually ready within seconds)
47104
47187
  content:
@@ -47120,7 +47203,7 @@ paths:
47120
47203
  operationId: getRfPrediction
47121
47204
  tags: ["Reach and Frequency"]
47122
47205
  x-platforms: ["meta"]
47123
- summary: Read a Reach & Frequency prediction
47206
+ summary: 'Get reach-frequency prediction'
47124
47207
  security:
47125
47208
  - bearerAuth: []
47126
47209
  parameters:
@@ -47128,6 +47211,8 @@ paths:
47128
47211
  - { name: accountId, in: query, required: true, schema: { type: string } }
47129
47212
  - { name: adAccountId, in: query, required: true, schema: { type: string } }
47130
47213
  responses:
47214
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47215
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47131
47216
  '200':
47132
47217
  description: Prediction status and estimates
47133
47218
  content:
@@ -47146,7 +47231,7 @@ paths:
47146
47231
  operationId: cancelRfReservation
47147
47232
  tags: ["Reach and Frequency"]
47148
47233
  x-platforms: ["meta"]
47149
- summary: Cancel a Reach & Frequency reservation
47234
+ summary: 'Cancel reach-frequency booking'
47150
47235
  description: Releases a RESERVATION's locked price and inventory. Unreserved predictions expire on their own.
47151
47236
  security:
47152
47237
  - bearerAuth: []
@@ -47155,6 +47240,8 @@ paths:
47155
47240
  - { name: accountId, in: query, required: true, schema: { type: string } }
47156
47241
  - { name: adAccountId, in: query, required: true, schema: { type: string } }
47157
47242
  responses:
47243
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47244
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47158
47245
  '200':
47159
47246
  description: Reservation cancelled
47160
47247
  '400': { description: "Invalid input, or Meta rejected the cancel" }
@@ -47167,7 +47254,7 @@ paths:
47167
47254
  operationId: reserveRfPrediction
47168
47255
  tags: ["Reach and Frequency"]
47169
47256
  x-platforms: ["meta"]
47170
- summary: Reserve a Reach & Frequency prediction
47257
+ summary: 'Reserve reach-frequency inventory'
47171
47258
  description: |-
47172
47259
  Locks the quoted price + inventory until the returned `expiresAt` and mints a NEW
47173
47260
  prediction id. Pass that RESERVED id (not the original) as `rfPredictionId` on
@@ -47187,6 +47274,8 @@ paths:
47187
47274
  accountId: { type: string }
47188
47275
  adAccountId: { type: string }
47189
47276
  responses:
47277
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47278
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47190
47279
  '201':
47191
47280
  description: Reserved; `prediction.predictionId` is the new RESERVED id
47192
47281
  content:
@@ -47220,6 +47309,8 @@ paths:
47220
47309
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: Rows per page }
47221
47310
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
47222
47311
  responses:
47312
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47313
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47223
47314
  '200':
47224
47315
  description: Ad studies (raw Meta shape)
47225
47316
  content:
@@ -47253,6 +47344,7 @@ paths:
47253
47344
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio Meta Ads or Facebook SocialAccount ID." }
47254
47345
  - { name: adAccountId, in: query, required: true, schema: { type: string, pattern: '^act_[0-9]+$' }, description: "Meta ad account ID including the act_ prefix." }
47255
47346
  responses:
47347
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47256
47348
  '200':
47257
47349
  description: "Instagram identities and Page linkage."
47258
47350
  content:
@@ -47299,7 +47391,8 @@ paths:
47299
47391
  '400': { $ref: '#/components/responses/BadRequest' }
47300
47392
  '401': { $ref: '#/components/responses/Unauthorized' }
47301
47393
  '403': { description: "The account or Meta asset is not accessible." }
47302
- '404': { $ref: '#/components/responses/NotFound' }
47394
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47395
+
47303
47396
  '501': { description: "Only supported on Meta Ads and Facebook accounts." }
47304
47397
 
47305
47398
  /v1/ads/advertisable-applications:
@@ -47316,6 +47409,7 @@ paths:
47316
47409
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio Meta Ads or Facebook SocialAccount ID." }
47317
47410
  - { name: adAccountId, in: query, required: true, schema: { type: string, pattern: '^act_[0-9]+$' }, description: "Meta ad account ID including the act_ prefix." }
47318
47411
  responses:
47412
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47319
47413
  '200':
47320
47414
  description: "Applications available for promotion."
47321
47415
  content:
@@ -47349,7 +47443,8 @@ paths:
47349
47443
  '400': { $ref: '#/components/responses/BadRequest' }
47350
47444
  '401': { $ref: '#/components/responses/Unauthorized' }
47351
47445
  '403': { description: "The account or Meta asset is not accessible." }
47352
- '404': { $ref: '#/components/responses/NotFound' }
47446
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47447
+
47353
47448
  '501': { description: "Only supported on Meta Ads and Facebook accounts." }
47354
47449
 
47355
47450
  /v1/ads/ios-fourteen-campaign-limits:
@@ -47367,6 +47462,7 @@ paths:
47367
47462
  - { name: adAccountId, in: query, required: true, schema: { type: string, pattern: '^act_[0-9]+$' }, description: "Meta ad account ID including the act_ prefix." }
47368
47463
  - { name: applicationId, in: query, required: true, schema: { type: string, pattern: '^[0-9]+$' }, description: "Meta application ID from advertisable-applications." }
47369
47464
  responses:
47465
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47370
47466
  '200':
47371
47467
  description: "Application campaign limits."
47372
47468
  content:
@@ -47389,7 +47485,8 @@ paths:
47389
47485
  '400': { $ref: '#/components/responses/BadRequest' }
47390
47486
  '401': { $ref: '#/components/responses/Unauthorized' }
47391
47487
  '403': { description: "The account or Meta asset is not accessible." }
47392
- '404': { $ref: '#/components/responses/NotFound' }
47488
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47489
+
47393
47490
  '501': { description: "Only supported on Meta Ads and Facebook accounts." }
47394
47491
 
47395
47492
  /v1/ads/businesses:
@@ -47411,6 +47508,8 @@ paths:
47411
47508
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: Rows per page }
47412
47509
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
47413
47510
  responses:
47511
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47512
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47414
47513
  '200':
47415
47514
  description: Businesses (raw Meta shape)
47416
47515
  content:
@@ -47447,6 +47546,8 @@ paths:
47447
47546
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: Rows per page }
47448
47547
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
47449
47548
  responses:
47549
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47550
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47450
47551
  '200':
47451
47552
  description: Ad labels (raw Meta shape)
47452
47553
  content:
@@ -47472,7 +47573,7 @@ paths:
47472
47573
  operationId: listHighDemandPeriods
47473
47574
  tags: ["Ad Accounts"]
47474
47575
  x-platforms: ["meta"]
47475
- summary: High demand periods / budget schedules
47576
+ summary: 'List high-demand periods'
47476
47577
  description: |-
47477
47578
  Scheduled budget increases (Meta's budget-scheduling API). The Graph edge lives on the
47478
47579
  campaign and ad-set nodes only, so exactly one of `campaignId` / `adSetId` (platform
@@ -47487,6 +47588,8 @@ paths:
47487
47588
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: Rows per page }
47488
47589
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
47489
47590
  responses:
47591
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47592
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47490
47593
  '200':
47491
47594
  description: Budget schedules (raw Meta shape)
47492
47595
  content:
@@ -47541,6 +47644,8 @@ paths:
47541
47644
  recurrenceType: { type: string, enum: [ONE_TIME, WEEKLY, MONTHLY] }
47542
47645
  currency: { type: string, description: "Ad account currency, for the ABSOLUTE minor-unit conversion. Ignored for MULTIPLIER." }
47543
47646
  responses:
47647
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47648
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47544
47649
  '201':
47545
47650
  description: Budget schedule created
47546
47651
  content:
@@ -47576,6 +47681,8 @@ paths:
47576
47681
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: Rows per page }
47577
47682
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
47578
47683
  responses:
47684
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47685
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47579
47686
  '200':
47580
47687
  description: Creatives (raw Meta shape)
47581
47688
  content:
@@ -47661,6 +47768,8 @@ paths:
47661
47768
  promotion: { type: PERCENTAGE_OFF, value: 20, code: SAVE20 }
47662
47769
  creativeFeatures: { auto_promotion_tag: OPT_OUT }
47663
47770
  responses:
47771
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47772
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47664
47773
  '201':
47665
47774
  description: Creative created
47666
47775
  content:
@@ -47700,6 +47809,8 @@ paths:
47700
47809
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token." }
47701
47810
  - { name: fields, in: query, schema: { type: string }, description: "Comma-separated Graph field override (supports nested {} projections)." }
47702
47811
  responses:
47812
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47813
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47703
47814
  '200':
47704
47815
  description: Creative details
47705
47816
  content:
@@ -47736,6 +47847,8 @@ paths:
47736
47847
  accountId: { type: string, description: "Zernio SocialAccount id (posting or ads variant); its platform decides where the campaign is created." }
47737
47848
  name: { type: string, maxLength: 255 }
47738
47849
  responses:
47850
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47851
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47739
47852
  '200':
47740
47853
  description: Creative renamed
47741
47854
  content:
@@ -47764,6 +47877,8 @@ paths:
47764
47877
  - { name: creativeId, in: path, required: true, schema: { type: string }, description: Platform creative id }
47765
47878
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token." }
47766
47879
  responses:
47880
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47881
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47767
47882
  '200':
47768
47883
  description: Creative deleted
47769
47884
  content:
@@ -47810,6 +47925,8 @@ paths:
47810
47925
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: Rows per page }
47811
47926
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page. Meta does not document paging on this edge; `after` comes back null when it omits cursors." }
47812
47927
  responses:
47928
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
47929
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47813
47930
  '200':
47814
47931
  description: Value rule sets
47815
47932
  content:
@@ -47886,6 +48003,8 @@ paths:
47886
48003
  description: "Evaluated in order; the first matching rule wins."
47887
48004
  items: { $ref: '#/components/schemas/ValueRule' }
47888
48005
  responses:
48006
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
48007
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47889
48008
  '201':
47890
48009
  description: Value rule set created
47891
48010
  content:
@@ -47920,6 +48039,8 @@ paths:
47920
48039
  - { name: valueRuleSetId, in: path, required: true, schema: { type: string }, description: "Platform value rule set id." }
47921
48040
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token." }
47922
48041
  responses:
48042
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
48043
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47923
48044
  '200':
47924
48045
  description: Value rule set
47925
48046
  content:
@@ -47976,6 +48097,8 @@ paths:
47976
48097
  description: "The COMPLETE rule list. Omitting a rule deletes it on Meta."
47977
48098
  items: { $ref: '#/components/schemas/ValueRule' }
47978
48099
  responses:
48100
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
48101
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
47979
48102
  '200':
47980
48103
  description: Value rule set replaced
47981
48104
  content:
@@ -48010,6 +48133,8 @@ paths:
48010
48133
  - { name: valueRuleSetId, in: path, required: true, schema: { type: string }, description: "Platform value rule set id." }
48011
48134
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token." }
48012
48135
  responses:
48136
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
48137
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48013
48138
  '200':
48014
48139
  description: Value rule set deleted
48015
48140
  content:
@@ -48106,10 +48231,10 @@ paths:
48106
48231
  $ref: "#/components/responses/Unauthorized"
48107
48232
  "403":
48108
48233
  description: "Ads access and permission to the selected account are required."
48109
- "404":
48110
- $ref: "#/components/responses/NotFound"
48234
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48235
+
48111
48236
  "409":
48112
- description: "Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google."
48237
+ description: 'Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.'
48113
48238
  "422":
48114
48239
  description: "Google Ads connection is missing or unavailable."
48115
48240
  "429":
@@ -48210,10 +48335,10 @@ paths:
48210
48335
  $ref: "#/components/responses/Unauthorized"
48211
48336
  "403":
48212
48337
  description: "Ads access and permission to the selected account are required."
48213
- "404":
48214
- $ref: "#/components/responses/NotFound"
48338
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48339
+
48215
48340
  "409":
48216
- description: "Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google."
48341
+ description: 'Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.'
48217
48342
  "422":
48218
48343
  description: "Google Ads connection is missing or unavailable."
48219
48344
  "429":
@@ -48322,10 +48447,10 @@ paths:
48322
48447
  $ref: "#/components/responses/Unauthorized"
48323
48448
  "403":
48324
48449
  description: "Ads access and permission to the selected account are required."
48325
- "404":
48326
- $ref: "#/components/responses/NotFound"
48450
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48451
+
48327
48452
  "409":
48328
- description: "Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google."
48453
+ description: 'Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.'
48329
48454
  "422":
48330
48455
  description: "Google Ads connection is missing or unavailable."
48331
48456
  "429":
@@ -48414,10 +48539,10 @@ paths:
48414
48539
  $ref: "#/components/responses/Unauthorized"
48415
48540
  "403":
48416
48541
  description: "Ads access and permission to the selected account are required."
48417
- "404":
48418
- $ref: "#/components/responses/NotFound"
48542
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48543
+
48419
48544
  "409":
48420
- description: "Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google."
48545
+ description: 'Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.'
48421
48546
  "422":
48422
48547
  description: "Google Ads connection is missing or unavailable."
48423
48548
  "429":
@@ -48495,10 +48620,10 @@ paths:
48495
48620
  $ref: "#/components/responses/Unauthorized"
48496
48621
  "403":
48497
48622
  description: "Ads access and permission to the selected account are required."
48498
- "404":
48499
- $ref: "#/components/responses/NotFound"
48623
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48624
+
48500
48625
  "409":
48501
- description: "Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google."
48626
+ description: 'Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.'
48502
48627
  "422":
48503
48628
  description: "Google Ads connection is missing or unavailable."
48504
48629
  "429":
@@ -48597,10 +48722,10 @@ paths:
48597
48722
  $ref: "#/components/responses/Unauthorized"
48598
48723
  "403":
48599
48724
  description: "Ads access and permission to the selected account are required."
48600
- "404":
48601
- $ref: "#/components/responses/NotFound"
48725
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48726
+
48602
48727
  "409":
48603
- description: "Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google."
48728
+ description: 'Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.'
48604
48729
  "422":
48605
48730
  description: "Google Ads connection is missing or unavailable."
48606
48731
  "429":
@@ -48682,10 +48807,10 @@ paths:
48682
48807
  $ref: "#/components/responses/Unauthorized"
48683
48808
  "403":
48684
48809
  description: "Ads access and permission to the selected account are required."
48685
- "404":
48686
- $ref: "#/components/responses/NotFound"
48810
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48811
+
48687
48812
  "409":
48688
- description: "Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google."
48813
+ description: 'Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.'
48689
48814
  "422":
48690
48815
  description: "Google Ads connection is missing or unavailable."
48691
48816
  "429":
@@ -48772,10 +48897,10 @@ paths:
48772
48897
  $ref: "#/components/responses/Unauthorized"
48773
48898
  "403":
48774
48899
  description: "Ads access and permission to the selected account are required."
48775
- "404":
48776
- $ref: "#/components/responses/NotFound"
48900
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48901
+
48777
48902
  "409":
48778
- description: "Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google."
48903
+ description: 'Ambiguous campaign or account selection. Use a profile-scoped key. A list still attached to a campaign may also be rejected by Google. The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.'
48779
48904
  "422":
48780
48905
  description: "Google Ads connection is missing or unavailable."
48781
48906
  "429":
@@ -48812,6 +48937,7 @@ paths:
48812
48937
  pattern: ^\d+$
48813
48938
  description: "Google customer id without dashes. Required when the connection has multiple customers."
48814
48939
  responses:
48940
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
48815
48941
  '200':
48816
48942
  description: "Assets returned."
48817
48943
  content:
@@ -48847,8 +48973,8 @@ paths:
48847
48973
  $ref: '#/components/responses/Unauthorized'
48848
48974
  '403':
48849
48975
  description: "Ads access is required."
48850
- '404':
48851
- $ref: '#/components/responses/NotFound'
48976
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
48977
+
48852
48978
  '429':
48853
48979
  description: "Google Ads operations budget or platform quota exhausted."
48854
48980
  '501':
@@ -48896,6 +49022,7 @@ paths:
48896
49022
  callouts:
48897
49023
  - Fast setup
48898
49024
  responses:
49025
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
48899
49026
  '201':
48900
49027
  description: "Assets created and attached."
48901
49028
  content:
@@ -48920,8 +49047,8 @@ paths:
48920
49047
  $ref: '#/components/responses/Unauthorized'
48921
49048
  '403':
48922
49049
  description: "Ads access is required."
48923
- '404':
48924
- $ref: '#/components/responses/NotFound'
49050
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49051
+
48925
49052
  '429':
48926
49053
  description: "Google Ads operations budget or platform quota exhausted."
48927
49054
  '501':
@@ -48989,6 +49116,7 @@ paths:
48989
49116
  calloutAsset:
48990
49117
  calloutText: Simple integration
48991
49118
  responses:
49119
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
48992
49120
  '200':
48993
49121
  description: "Assets returned."
48994
49122
  content:
@@ -49006,8 +49134,8 @@ paths:
49006
49134
  $ref: '#/components/responses/Unauthorized'
49007
49135
  '403':
49008
49136
  description: "Ads access is required."
49009
- '404':
49010
- $ref: '#/components/responses/NotFound'
49137
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49138
+
49011
49139
  '429':
49012
49140
  description: "Google Ads operations budget or platform quota exhausted."
49013
49141
  '501':
@@ -49050,6 +49178,7 @@ paths:
49050
49178
  customerId: '1234567890'
49051
49179
  assetId: '123'
49052
49180
  responses:
49181
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49053
49182
  '200':
49054
49183
  description: "Assets returned."
49055
49184
  content:
@@ -49067,8 +49196,8 @@ paths:
49067
49196
  $ref: '#/components/responses/Unauthorized'
49068
49197
  '403':
49069
49198
  description: "Ads access is required."
49070
- '404':
49071
- $ref: '#/components/responses/NotFound'
49199
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49200
+
49072
49201
  '429':
49073
49202
  description: "Google Ads operations budget or platform quota exhausted."
49074
49203
  '501':
@@ -49102,6 +49231,7 @@ paths:
49102
49231
  pattern: ^\d+$
49103
49232
  description: "Google customer id without dashes. Required when the connection has multiple customers."
49104
49233
  responses:
49234
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49105
49235
  '200':
49106
49236
  description: "Assets returned."
49107
49237
  content:
@@ -49148,8 +49278,8 @@ paths:
49148
49278
  $ref: '#/components/responses/Unauthorized'
49149
49279
  '403':
49150
49280
  description: "Ads access is required."
49151
- '404':
49152
- $ref: '#/components/responses/NotFound'
49281
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49282
+
49153
49283
  '429':
49154
49284
  description: "Google Ads operations budget or platform quota exhausted."
49155
49285
  '501':
@@ -49196,6 +49326,7 @@ paths:
49196
49326
  - text: Pricing
49197
49327
  linkUrl: https://zernio.com/pricing
49198
49328
  responses:
49329
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49199
49330
  '201':
49200
49331
  description: "Assets created and attached."
49201
49332
  content:
@@ -49233,8 +49364,8 @@ paths:
49233
49364
  $ref: '#/components/responses/Unauthorized'
49234
49365
  '403':
49235
49366
  description: "Ads access is required."
49236
- '404':
49237
- $ref: '#/components/responses/NotFound'
49367
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49368
+
49238
49369
  '429':
49239
49370
  description: "Google Ads operations budget or platform quota exhausted."
49240
49371
  '501':
@@ -49319,6 +49450,7 @@ paths:
49319
49450
  finalUrls:
49320
49451
  - https://zernio.com/pricing
49321
49452
  responses:
49453
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49322
49454
  '200':
49323
49455
  description: "Assets returned."
49324
49456
  content:
@@ -49336,8 +49468,8 @@ paths:
49336
49468
  $ref: '#/components/responses/Unauthorized'
49337
49469
  '403':
49338
49470
  description: "Ads access is required."
49339
- '404':
49340
- $ref: '#/components/responses/NotFound'
49471
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49472
+
49341
49473
  '429':
49342
49474
  description: "Google Ads operations budget or platform quota exhausted."
49343
49475
  '501':
@@ -49380,6 +49512,7 @@ paths:
49380
49512
  customerId: '1234567890'
49381
49513
  assetId: '123'
49382
49514
  responses:
49515
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49383
49516
  '200':
49384
49517
  description: "Assets returned."
49385
49518
  content:
@@ -49397,8 +49530,8 @@ paths:
49397
49530
  $ref: '#/components/responses/Unauthorized'
49398
49531
  '403':
49399
49532
  description: "Ads access is required."
49400
- '404':
49401
- $ref: '#/components/responses/NotFound'
49533
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49534
+
49402
49535
  '429':
49403
49536
  description: "Google Ads operations budget or platform quota exhausted."
49404
49537
  '501':
@@ -49432,6 +49565,7 @@ paths:
49432
49565
  pattern: ^\d+$
49433
49566
  description: "Google customer id without dashes. Required when the connection has multiple customers."
49434
49567
  responses:
49568
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49435
49569
  '200':
49436
49570
  description: "Assets returned."
49437
49571
  content:
@@ -49475,8 +49609,8 @@ paths:
49475
49609
  $ref: '#/components/responses/Unauthorized'
49476
49610
  '403':
49477
49611
  description: "Ads access is required."
49478
- '404':
49479
- $ref: '#/components/responses/NotFound'
49612
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49613
+
49480
49614
  '429':
49481
49615
  description: "Google Ads operations budget or platform quota exhausted."
49482
49616
  '501':
@@ -49526,6 +49660,7 @@ paths:
49526
49660
  - Analytics
49527
49661
  - Messaging
49528
49662
  responses:
49663
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49529
49664
  '201':
49530
49665
  description: "Assets created and attached."
49531
49666
  content:
@@ -49572,8 +49707,8 @@ paths:
49572
49707
  $ref: '#/components/responses/Unauthorized'
49573
49708
  '403':
49574
49709
  description: "Ads access is required."
49575
- '404':
49576
- $ref: '#/components/responses/NotFound'
49710
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49711
+
49577
49712
  '429':
49578
49713
  description: "Google Ads operations budget or platform quota exhausted."
49579
49714
  '501':
@@ -49638,6 +49773,7 @@ paths:
49638
49773
  - Reporting
49639
49774
  - Messaging
49640
49775
  responses:
49776
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49641
49777
  '200':
49642
49778
  description: "Assets returned."
49643
49779
  content:
@@ -49655,8 +49791,8 @@ paths:
49655
49791
  $ref: '#/components/responses/Unauthorized'
49656
49792
  '403':
49657
49793
  description: "Ads access is required."
49658
- '404':
49659
- $ref: '#/components/responses/NotFound'
49794
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49795
+
49660
49796
  '429':
49661
49797
  description: "Google Ads operations budget or platform quota exhausted."
49662
49798
  '501':
@@ -49699,6 +49835,7 @@ paths:
49699
49835
  customerId: '1234567890'
49700
49836
  assetId: '123'
49701
49837
  responses:
49838
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49702
49839
  '200':
49703
49840
  description: "Assets returned."
49704
49841
  content:
@@ -49716,8 +49853,8 @@ paths:
49716
49853
  $ref: '#/components/responses/Unauthorized'
49717
49854
  '403':
49718
49855
  description: "Ads access is required."
49719
- '404':
49720
- $ref: '#/components/responses/NotFound'
49856
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49857
+
49721
49858
  '429':
49722
49859
  description: "Google Ads operations budget or platform quota exhausted."
49723
49860
  '501':
@@ -49740,6 +49877,8 @@ paths:
49740
49877
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token." }
49741
49878
  - { name: adAccountId, in: query, required: true, schema: { type: string }, description: "Meta ad account id (act_<n>)." }
49742
49879
  responses:
49880
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49881
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
49743
49882
  '200':
49744
49883
  description: Account finances
49745
49884
  content:
@@ -49830,6 +49969,7 @@ paths:
49830
49969
  currency: "EUR"
49831
49970
  timezoneId: 1
49832
49971
  responses:
49972
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
49833
49973
  '201':
49834
49974
  description: "Ad account created. Check connectionUpdated and payment instructions."
49835
49975
  content:
@@ -49871,7 +50011,8 @@ paths:
49871
50011
  content:
49872
50012
  application/json:
49873
50013
  schema: { $ref: '#/components/schemas/ErrorResponse' }
49874
- '404': { $ref: '#/components/responses/NotFound' }
50014
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
50015
+
49875
50016
  '502':
49876
50017
  description: "Creation outcome unknown. Check Ads Manager before repeating this non-idempotent request."
49877
50018
  content:
@@ -49911,6 +50052,9 @@ paths:
49911
50052
  - { name: adAccountId, in: query, required: false, schema: { type: string }, description: "Filter response to a single platform ad account ID (e.g. `act_123` for Meta, advertiser_id for TikTok). Returns at most one item." }
49912
50053
  - { name: limit, in: query, required: false, schema: { type: integer, minimum: 1, maximum: 1000 }, description: "Clamp the returned `accounts[]` length. Useful for typeahead pickers on agency tokens with hundreds of advertisers." }
49913
50054
  responses:
50055
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
50056
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
50057
+ '400': { $ref: '#/components/responses/BadRequest' }
49914
50058
  '200':
49915
50059
  description: Ad accounts
49916
50060
  content:
@@ -50003,6 +50147,7 @@ paths:
50003
50147
  defaultDsaBeneficiary: { type: string, maxLength: 100, description: "Legal entity benefiting from ads on this ad account" }
50004
50148
  defaultDsaPayor: { type: string, maxLength: 100, description: "Legal entity paying for ads on this ad account. Defaults to defaultDsaBeneficiary when omitted." }
50005
50149
  responses:
50150
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
50006
50151
  '200':
50007
50152
  description: DSA defaults updated (re-read from Meta after the write)
50008
50153
  content:
@@ -50019,9 +50164,7 @@ paths:
50019
50164
  '400':
50020
50165
  description: Unsupported platform (non-Meta account) or invalid adAccountId
50021
50166
  '401': { $ref: '#/components/responses/Unauthorized' }
50022
- '404':
50023
- description: Account not found
50024
-
50167
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
50025
50168
  /v1/ads/dsa-defaults:
50026
50169
  get:
50027
50170
  x-resource-group: "ads"
@@ -50039,6 +50182,7 @@ paths:
50039
50182
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Account ID (metaads, or a facebook/instagram posting account)" }
50040
50183
  - { name: adAccountId, in: query, required: true, schema: { type: string }, description: "Meta ad account ID (act_...)" }
50041
50184
  responses:
50185
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
50042
50186
  '200':
50043
50187
  description: Current DSA defaults (empty object when none are set)
50044
50188
  content:
@@ -50055,16 +50199,14 @@ paths:
50055
50199
  '400':
50056
50200
  description: Non-Meta adAccountId
50057
50201
  '401': { $ref: '#/components/responses/Unauthorized' }
50058
- '404':
50059
- description: Account not found
50060
-
50202
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
50061
50203
  /v1/ads/dsa-recommendations:
50062
50204
  get:
50063
50205
  x-resource-group: "ads"
50064
50206
  operationId: getDsaRecommendations
50065
50207
  tags: ["Ad Accounts"]
50066
50208
  x-platforms: ["meta"]
50067
- summary: List DSA beneficiary/payor suggestions
50209
+ summary: 'Get DSA recommendations'
50068
50210
  description: |
50069
50211
  Returns Meta's suggested beneficiary/payor names for an ad account, derived by Meta
50070
50212
  from the account's recent activity. Useful for prefilling `dsaBeneficiary`/`dsaPayor`
@@ -50080,6 +50222,7 @@ paths:
50080
50222
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Account ID (metaads, or a facebook/instagram posting account)" }
50081
50223
  - { name: adAccountId, in: query, required: true, schema: { type: string }, description: "Meta ad account ID (act_...)" }
50082
50224
  responses:
50225
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
50083
50226
  '200':
50084
50227
  description: Suggested DSA strings (may be empty when Meta has no recommendations)
50085
50228
  content:
@@ -50094,9 +50237,7 @@ paths:
50094
50237
  '400':
50095
50238
  description: Non-Meta adAccountId
50096
50239
  '401': { $ref: '#/components/responses/Unauthorized' }
50097
- '404':
50098
- description: Account not found
50099
-
50240
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
50100
50241
  /v1/ads/boost:
50101
50242
  post:
50102
50243
  x-resource-group: "ads"
@@ -50429,6 +50570,7 @@ paths:
50429
50570
  budget: { amount: 2.61, type: daily }
50430
50571
  status: PAUSED
50431
50572
  responses:
50573
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
50432
50574
  '201':
50433
50575
  description: Ad created
50434
50576
  content:
@@ -50445,6 +50587,7 @@ paths:
50445
50587
  description: 'Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans. Also returned with code `ads_allowance_exceeded` when the team has no payment method on file and has reached the 500 free live ads: add a card to resume.'
50446
50588
  '409':
50447
50589
  description: |
50590
+ The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.
50448
50591
  An identical boost request is already in progress (with or without
50449
50592
  an Idempotency-Key). Wait for it to finish instead of retrying.
50450
50593
  '422':
@@ -51595,6 +51738,8 @@ paths:
51595
51738
  promotion: { type: PERCENTAGE_OFF, value: 20, code: SAVE20 }
51596
51739
  creativeFeatures: { auto_promotion_tag: OPT_OUT }
51597
51740
  responses:
51741
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
51742
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
51598
51743
  '200':
51599
51744
  description: 'validateOnly dry-run passed, nothing was created'
51600
51745
  content:
@@ -51957,6 +52102,8 @@ paths:
51957
52102
  - { name: cursor, in: query, schema: { type: string } }
51958
52103
  - { name: since, in: query, schema: { type: integer }, description: Unix seconds. }
51959
52104
  responses:
52105
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52106
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
51960
52107
  '200':
51961
52108
  description: Leads for the form.
51962
52109
  content:
@@ -52047,6 +52194,8 @@ paths:
52047
52194
  imageBase64: { type: string, description: "Raw base64 image bytes, or a full data URL (the data:image/...;base64, prefix is stripped)." }
52048
52195
  filename: { type: string, description: "Optional filename shown in Meta's image library. Defaults to ad_image.jpg." }
52049
52196
  responses:
52197
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52198
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52050
52199
  '201':
52051
52200
  description: Image uploaded
52052
52201
  content:
@@ -52085,6 +52234,8 @@ paths:
52085
52234
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: Rows per page }
52086
52235
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
52087
52236
  responses:
52237
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52238
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52088
52239
  '200':
52089
52240
  description: Ad images (raw Meta shape)
52090
52241
  content:
@@ -52140,6 +52291,8 @@ paths:
52140
52291
  videoBase64: { type: string, description: "Raw base64 video bytes, or a full data URL (the data:video/...;base64, prefix is stripped). Capped by Vercel's body limit (~4.5 MB payload). Provide exactly one of videoUrl or videoBase64." }
52141
52292
  filename: { type: string, description: "Optional filename shown alongside the upload session. Applied only when uploading via videoBase64." }
52142
52293
  responses:
52294
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52295
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52143
52296
  '201':
52144
52297
  description: Video uploaded and ready
52145
52298
  content:
@@ -52189,6 +52342,8 @@ paths:
52189
52342
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: Rows per page }
52190
52343
  - { name: after, in: query, schema: { type: string }, description: "Cursor from paging.after of the previous page." }
52191
52344
  responses:
52345
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52346
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52192
52347
  '200':
52193
52348
  description: Ad videos (raw Meta shape)
52194
52349
  content:
@@ -52229,6 +52384,8 @@ paths:
52229
52384
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "Zernio SocialAccount id (posting or ads variant) used to resolve the Meta token." }
52230
52385
  - { name: adAccountId, in: query, required: true, schema: { type: string }, description: "Meta ad account id (act_<n>) that owns the video." }
52231
52386
  responses:
52387
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52388
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52232
52389
  '200':
52233
52390
  description: Video deleted
52234
52391
  content:
@@ -52262,6 +52419,9 @@ paths:
52262
52419
  - { name: q, in: query, required: true, schema: { type: string }, description: Search query }
52263
52420
  - { name: accountId, in: query, required: true, schema: { type: string }, description: Account ID }
52264
52421
  responses:
52422
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52423
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52424
+ '400': { $ref: '#/components/responses/BadRequest' }
52265
52425
  '200':
52266
52426
  description: Matching interests
52267
52427
  content:
@@ -52369,6 +52529,7 @@ paths:
52369
52529
  - { name: countryCode, in: query, required: false, schema: { type: string, minLength: 2, maxLength: 2 }, description: "ISO 3166-1 alpha-2 country code (e.g. NL) to scope a geo search." }
52370
52530
  - { name: limit, in: query, required: false, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: "Maximum results to return." }
52371
52531
  responses:
52532
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52372
52533
  '200':
52373
52534
  description: Matching targeting options (normalized)
52374
52535
  content:
@@ -52392,9 +52553,7 @@ paths:
52392
52553
  '401': { $ref: '#/components/responses/Unauthorized' }
52393
52554
  '403':
52394
52555
  description: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
52395
- '404':
52396
- description: Account not found, or the platform does not support the requested dimension
52397
-
52556
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52398
52557
  /v1/ads/library:
52399
52558
  get:
52400
52559
  x-resource-group: "ads"
@@ -52445,6 +52604,7 @@ paths:
52445
52604
  - { name: limit, in: query, schema: { type: integer, minimum: 1, maximum: 100, default: 25 }, description: "Rows per page. LinkedIn accepts at most 25." }
52446
52605
  - { name: after, in: query, schema: { type: string }, description: "paging.after of the previous page." }
52447
52606
  responses:
52607
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52448
52608
  '200':
52449
52609
  description: Archived ads (raw platform shape)
52450
52610
  content:
@@ -52503,7 +52663,8 @@ paths:
52503
52663
  '401': { $ref: '#/components/responses/Unauthorized' }
52504
52664
  '403':
52505
52665
  description: "Ads access required (legacy plans need the Ads add-on; included on usage-based plans), or `payment_required`: the billing owner has no payment method on file and no legacy paid plan. Searches are free; the card keeps the shared archive quota for real accounts."
52506
- '404': { description: Account not found }
52666
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52667
+
52507
52668
  '501': { description: Only supported on Meta and LinkedIn accounts }
52508
52669
  '503': { description: "Meta's Ad Library is unavailable on Zernio's side (`PLATFORM_DISABLED`); LinkedIn searches are unaffected." }
52509
52670
 
@@ -52545,6 +52706,7 @@ paths:
52545
52706
  own vocabulary, e.g. Meta `REACH`, `LINK_CLICKS`, `OFFSITE_CONVERSIONS`).
52546
52707
  Some platforms vary the estimate by goal; omit to use the platform default.
52547
52708
  responses:
52709
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52548
52710
  '200':
52549
52711
  description: Normalized reach estimate
52550
52712
  content:
@@ -52564,8 +52726,7 @@ paths:
52564
52726
  '401': { $ref: '#/components/responses/Unauthorized' }
52565
52727
  '403':
52566
52728
  description: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
52567
- '404': { $ref: '#/components/responses/NotFound' }
52568
-
52729
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52569
52730
  /v1/ads/targeting/bid-pricing:
52570
52731
  post:
52571
52732
  x-resource-group: "ads"
@@ -52603,6 +52764,7 @@ paths:
52603
52764
  optimizationTargetType: { type: string, description: "LinkedIn optimizationTargetType, e.g. MAX_CLICK, MAX_IMPRESSION." }
52604
52765
  dailyBudget: { type: number, description: "Optional daily budget in whole account-currency units. LinkedIn refines the suggested bid to this budget." }
52605
52766
  responses:
52767
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52606
52768
  '200':
52607
52769
  description: Pricing insights
52608
52770
  content:
@@ -52636,15 +52798,14 @@ paths:
52636
52798
  '400': { description: "Invalid targeting or unsupported objective/optimization/bid combination." }
52637
52799
  '401': { $ref: '#/components/responses/Unauthorized' }
52638
52800
  '403': { description: "Ads access required." }
52639
- '404': { $ref: '#/components/responses/NotFound' }
52640
-
52801
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52641
52802
  /v1/ads/targeting/supply-forecast:
52642
52803
  post:
52643
52804
  x-resource-group: "ads"
52644
52805
  operationId: getLinkedInSupplyForecast
52645
52806
  tags: ["Ad Targeting"]
52646
52807
  x-platforms: ["linkedin"]
52647
- summary: Impressions, clicks and spend forecast
52808
+ summary: 'Forecast ad delivery'
52648
52809
  description: |
52649
52810
  LinkedIn-only. Forecasted impressions, clicks, spend and ~20 other
52650
52811
  metrics for a targeting spec over a time range. Wraps LinkedIn's
@@ -52689,6 +52850,7 @@ paths:
52689
52850
  enableAudienceExpansion: { type: boolean, description: "Defaults to false." }
52690
52851
  connectedTelevisionOnly: { type: boolean, description: "Defaults to false." }
52691
52852
  responses:
52853
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52692
52854
  '200':
52693
52855
  description: Forecast series
52694
52856
  content:
@@ -52720,8 +52882,7 @@ paths:
52720
52882
  '400': { description: "Invalid targeting, missing budget, or LinkedIn forecast validation error (e.g. END_DATE_MAX_HORIZON_FOR_FORECAST)." }
52721
52883
  '401': { $ref: '#/components/responses/Unauthorized' }
52722
52884
  '403': { description: "Ads access required." }
52723
- '404': { $ref: '#/components/responses/NotFound' }
52724
-
52885
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52725
52886
  /v1/ads/catalogs:
52726
52887
  get:
52727
52888
  x-resource-group: "ads"
@@ -52736,6 +52897,8 @@ paths:
52736
52897
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "A facebook, instagram, or metaads account ID" }
52737
52898
  - { name: adAccountId, in: query, required: true, schema: { type: string }, description: "Meta ad account ID (act_...)" }
52738
52899
  responses:
52900
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52901
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52739
52902
  '200':
52740
52903
  description: Catalogs
52741
52904
  content:
@@ -52770,6 +52933,8 @@ paths:
52770
52933
  - { name: catalogId, in: path, required: true, schema: { type: string }, description: "Meta product catalog ID (from GET /v1/ads/catalogs)" }
52771
52934
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "A facebook, instagram, or metaads account ID" }
52772
52935
  responses:
52936
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52937
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52773
52938
  '200':
52774
52939
  description: Product sets
52775
52940
  content:
@@ -52805,6 +52970,9 @@ paths:
52805
52970
  - { name: platform, in: query, schema: { type: string, enum: [facebook, instagram, googleads, tiktok, tiktokads, pinterest, linkedin, linkedinads, twitter, xads] } }
52806
52971
  - { name: type, in: query, required: false, schema: { type: string, enum: [customer_list, company_list, engagement, meta_engagement, website, website_retargeting, lookalike, saved_targeting] }, description: "Filter to one audience type. `saved_targeting` returns stored TargetingSpec audiences; the other types return uploaded/derived audiences." }
52807
52972
  responses:
52973
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
52974
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
52975
+ '400': { $ref: '#/components/responses/BadRequest' }
52808
52976
  '200':
52809
52977
  description: Audiences
52810
52978
  content:
@@ -53009,6 +53177,8 @@ paths:
53009
53177
  allOf: [{ $ref: '#/components/schemas/TargetingSpec' }]
53010
53178
  description: "The targeting spec to store."
53011
53179
  responses:
53180
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
53181
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
53012
53182
  '201':
53013
53183
  description: Audience created
53014
53184
  content:
@@ -53270,6 +53440,8 @@ paths:
53270
53440
  - { name: accountId, in: query, required: true, schema: { type: string }, description: "SocialAccount _id (must be a metaads account)." }
53271
53441
  - { name: destinationId, in: query, required: true, schema: { type: string }, description: "Meta pixel/dataset ID." }
53272
53442
  responses:
53443
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
53444
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
53273
53445
  '200':
53274
53446
  description: Match-quality rows, one per event name.
53275
53447
  content:
@@ -53398,6 +53570,7 @@ paths:
53398
53570
  adUserData: { type: string, enum: [GRANTED, DENIED] }
53399
53571
  adPersonalization: { type: string, enum: [GRANTED, DENIED] }
53400
53572
  responses:
53573
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
53401
53574
  '200':
53402
53575
  description: |
53403
53576
  Events processed. Inspect `eventsFailed` and `failures[]` to detect
@@ -53437,8 +53610,8 @@ paths:
53437
53610
  description: |
53438
53611
  Ads access required (Ads add-on on legacy plans, included on usage-based plans),
53439
53612
  OR (for LinkedIn) the connected account lacks the `rw_conversions` scope and must be reconnected.
53440
- '404':
53441
- description: Account not found or not accessible.
53613
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
53614
+
53442
53615
  '422':
53443
53616
  description: 'OpenAI Ads only: no tracking tag (pixel) exists yet for this account. Code `TRACKING_TAG_REQUIRED`; create one via `POST /v1/accounts/{accountId}/tracking-tags` first.'
53444
53617
  '429':
@@ -53538,6 +53711,7 @@ paths:
53538
53711
  type: string
53539
53712
  description: ENHANCEMENT only. The original conversion's user agent (improves match quality).
53540
53713
  responses:
53714
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
53541
53715
  '200':
53542
53716
  description: |
53543
53717
  Adjustments processed. Inspect `adjustmentsFailed` and `failures[]` for
@@ -53564,8 +53738,8 @@ paths:
53564
53738
  '401': { $ref: '#/components/responses/Unauthorized' }
53565
53739
  '403':
53566
53740
  description: Ads access required (Ads add-on on legacy plans, included on usage-based plans).
53567
- '404':
53568
- description: Account not found or not accessible.
53741
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
53742
+
53569
53743
  '405':
53570
53744
  description: Conversion adjustments are only available for Google Ads (the account's platform is not `googleads`).
53571
53745
 
@@ -53575,7 +53749,7 @@ paths:
53575
53749
  operationId: listConversionActions
53576
53750
  tags: [Conversions]
53577
53751
  x-platforms: ["google"]
53578
- summary: List conversion actions and their tag snippets
53752
+ summary: 'List conversion actions'
53579
53753
  description: |
53580
53754
  Lists Google Ads conversion actions on the resolved customer, all types by
53581
53755
  default. Each action's `tagSnippets` (global site tag + event snippet) is
@@ -53597,6 +53771,7 @@ paths:
53597
53771
  - { name: customerId, in: query, required: false, schema: { type: string }, description: "Google Ads customer id (digits only). Resolved automatically when the connection has exactly one accessible customer." }
53598
53772
  - { name: type, in: query, required: false, schema: { type: string }, description: "Filter by Google's ConversionActionType enum (e.g. WEBPAGE, UPLOAD_CLICKS)." }
53599
53773
  responses:
53774
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
53600
53775
  '200':
53601
53776
  description: The resolved customer and its conversion actions.
53602
53777
  content:
@@ -53614,7 +53789,8 @@ paths:
53614
53789
  '401': { $ref: '#/components/responses/Unauthorized' }
53615
53790
  '403':
53616
53791
  description: Ads access required (Ads add-on on legacy plans, included on usage-based plans).
53617
- '404': { $ref: '#/components/responses/NotFound' }
53792
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
53793
+
53618
53794
  '501':
53619
53795
  description: Conversion actions are only available for Google Ads (the account's platform is not `googleads`).
53620
53796
  post:
@@ -53622,7 +53798,7 @@ paths:
53622
53798
  operationId: createConversionAction
53623
53799
  tags: [Conversions]
53624
53800
  x-platforms: ["google"]
53625
- summary: Create a website conversion action
53801
+ summary: 'Create website conversion action'
53626
53802
  description: |
53627
53803
  Creates a `WEBPAGE` conversion action (category `DEFAULT`) and returns it with
53628
53804
  its tag snippets, read back after creation since Google never returns them on
@@ -53661,6 +53837,7 @@ paths:
53661
53837
  type: boolean
53662
53838
  description: "When true, always use defaultValue and ignore any value sent with the event. Defaults to true when defaultValue is set."
53663
53839
  responses:
53840
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
53664
53841
  '201':
53665
53842
  description: The created conversion action, with its tag snippets.
53666
53843
  content:
@@ -53673,7 +53850,8 @@ paths:
53673
53850
  '401': { $ref: '#/components/responses/Unauthorized' }
53674
53851
  '403':
53675
53852
  description: Ads access required (Ads add-on on legacy plans, included on usage-based plans).
53676
- '404': { $ref: '#/components/responses/NotFound' }
53853
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
53854
+
53677
53855
  '501':
53678
53856
  description: Conversion actions are only available for Google Ads (the account's platform is not `googleads`).
53679
53857
 
@@ -53708,6 +53886,7 @@ paths:
53708
53886
  schema: { type: string }
53709
53887
  description: SocialAccount ID (metaads, googleads, linkedinads, tiktokads, or openaiads).
53710
53888
  responses:
53889
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
53711
53890
  '200':
53712
53891
  description: Destinations listed
53713
53892
  content:
@@ -53749,8 +53928,8 @@ paths:
53749
53928
  description: |
53750
53929
  Ads access required (Ads add-on on legacy plans, included on usage-based plans),
53751
53930
  OR (for LinkedIn) the connected account lacks the `rw_conversions` scope and must be reconnected.
53752
- '404':
53753
- description: Account not found or not accessible.
53931
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
53932
+
53754
53933
  '429':
53755
53934
  description: LinkedIn rate limit hit. Retry with backoff.
53756
53935
 
@@ -53912,12 +54091,13 @@ paths:
53912
54091
  description: |
53913
54092
  Ads access required (Ads add-on on legacy plans, included on usage-based plans),
53914
54093
  or the connected LinkedIn account lacks the `rw_conversions` scope (reconnect required).
53915
- '404':
53916
- description: Account not found or not accessible.
54094
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54095
+
53917
54096
  '405':
53918
54097
  description: Platform does not support destination creation.
53919
54098
  '409':
53920
54099
  description: |
54100
+ The account may also be inactive or need reconnection (code ads_connection_required). Reconnect it and read GET /v1/accounts for its current ID before retrying.
53921
54101
  Google Ads only. A conversion action with the given name already
53922
54102
  exists but has a different category. Use a different name or use
53923
54103
  the existing destination. Error code: `IDEMPOTENCY_CONFLICT`.
@@ -53946,6 +54126,7 @@ paths:
53946
54126
  schema: { type: string }
53947
54127
  description: Numeric ID or full `urn:li:sponsoredAccount:{id}` URN.
53948
54128
  responses:
54129
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
53949
54130
  '200':
53950
54131
  description: Destination fetched
53951
54132
  content:
@@ -53958,7 +54139,8 @@ paths:
53958
54139
  '400': { description: Validation error. }
53959
54140
  '401': { $ref: '#/components/responses/Unauthorized' }
53960
54141
  '403': { description: Ads add-on or LinkedIn reconnect required. }
53961
- '404': { description: Account or destination not found. }
54142
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54143
+
53962
54144
  '405': { description: Platform does not support fetching a single destination. }
53963
54145
  '429': { description: LinkedIn rate limit hit. Retry with backoff. }
53964
54146
 
@@ -54022,6 +54204,7 @@ paths:
54022
54204
  currencyCode: { type: string, description: ISO 4217. }
54023
54205
  amount: { type: string, description: 'Decimal string (e.g. "49.99").' }
54024
54206
  responses:
54207
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54025
54208
  '200':
54026
54209
  description: Destination updated (re-fetched canonical state)
54027
54210
  content:
@@ -54034,7 +54217,8 @@ paths:
54034
54217
  '400': { description: Invalid body or LinkedIn validation failure. }
54035
54218
  '401': { $ref: '#/components/responses/Unauthorized' }
54036
54219
  '403': { description: Ads add-on or LinkedIn reconnect required. }
54037
- '404': { description: Account or destination not found. }
54220
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54221
+
54038
54222
  '405': { description: Platform does not support updating destinations. }
54039
54223
  '429': { description: LinkedIn rate limit hit. Retry with backoff. }
54040
54224
 
@@ -54063,11 +54247,13 @@ paths:
54063
54247
  schema: { type: string }
54064
54248
  description: Required as query OR in JSON body.
54065
54249
  responses:
54250
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54066
54251
  '204': { description: Soft-deleted. }
54067
54252
  '400': { description: 'adAccountId missing, or accountId is not a valid id.' }
54068
54253
  '401': { $ref: '#/components/responses/Unauthorized' }
54069
54254
  '403': { description: Ads add-on or LinkedIn reconnect required. }
54070
- '404': { description: Account or destination not found. }
54255
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54256
+
54071
54257
  '405': { description: Platform does not support deleting destinations. }
54072
54258
  '429': { description: LinkedIn rate limit hit. Retry with backoff. }
54073
54259
 
@@ -54093,6 +54279,7 @@ paths:
54093
54279
  required: true
54094
54280
  schema: { type: string }
54095
54281
  responses:
54282
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54096
54283
  '200':
54097
54284
  description: Associations listed
54098
54285
  content:
@@ -54112,7 +54299,8 @@ paths:
54112
54299
  '400': { description: Validation error. }
54113
54300
  '401': { $ref: '#/components/responses/Unauthorized' }
54114
54301
  '403': { description: Ads add-on or LinkedIn reconnect required. }
54115
- '404': { description: Account or destination not found. }
54302
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54303
+
54116
54304
  '405': { description: Platform does not support associations. }
54117
54305
  '429': { description: LinkedIn rate limit hit. Retry with backoff. }
54118
54306
 
@@ -54148,6 +54336,7 @@ paths:
54148
54336
  type: string
54149
54337
  description: Numeric campaign ID or full `urn:li:sponsoredCampaign:{id}` URN.
54150
54338
  responses:
54339
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54151
54340
  '200':
54152
54341
  description: |
54153
54342
  Per-campaign batch result. Status is 200 even when some rows
@@ -54174,7 +54363,8 @@ paths:
54174
54363
  '400': { description: Invalid body. }
54175
54364
  '401': { $ref: '#/components/responses/Unauthorized' }
54176
54365
  '403': { description: Ads add-on or LinkedIn reconnect required. }
54177
- '404': { description: Account or destination not found. }
54366
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54367
+
54178
54368
  '405': { description: Platform does not support associations. }
54179
54369
  '429': { description: LinkedIn rate limit hit. Retry with backoff. }
54180
54370
 
@@ -54200,6 +54390,7 @@ paths:
54200
54390
  - { name: adAccountId, in: query, required: true, schema: { type: string } }
54201
54391
  - { name: campaignIds, in: query, required: true, schema: { type: string }, description: 'Comma-separated list of campaign IDs.' }
54202
54392
  responses:
54393
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54203
54394
  '200':
54204
54395
  description: |
54205
54396
  Per-campaign batch result. Status is 200 even when some rows
@@ -54228,7 +54419,8 @@ paths:
54228
54419
  a valid id.
54229
54420
  '401': { $ref: '#/components/responses/Unauthorized' }
54230
54421
  '403': { description: Ads add-on or LinkedIn reconnect required. }
54231
- '404': { description: Account or destination not found. }
54422
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54423
+
54232
54424
  '405': { description: Platform does not support associations. }
54233
54425
  '429': { description: LinkedIn rate limit hit. Retry with backoff. }
54234
54426
 
@@ -54268,6 +54460,7 @@ paths:
54268
54460
  enum: [ALL, DAILY, MONTHLY, YEARLY]
54269
54461
  default: DAILY
54270
54462
  responses:
54463
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54271
54464
  '200':
54272
54465
  description: Metrics rows
54273
54466
  content:
@@ -54290,7 +54483,8 @@ paths:
54290
54483
  '400': { description: Validation error or invalid date range. }
54291
54484
  '401': { $ref: '#/components/responses/Unauthorized' }
54292
54485
  '403': { description: Ads add-on or LinkedIn reconnect required. }
54293
- '404': { description: Account or destination not found. }
54486
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54487
+
54294
54488
  '405': { description: Platform does not support metrics readback. }
54295
54489
  '429': { description: LinkedIn analytics rate limit hit. }
54296
54490
 
@@ -54581,6 +54775,7 @@ paths:
54581
54775
  budgetType: daily
54582
54776
  status: PAUSED
54583
54777
  responses:
54778
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54584
54779
  '201':
54585
54780
  description: |
54586
54781
  Ad(s) created and submitted for review. The route shares its handler with
@@ -54602,7 +54797,8 @@ paths:
54602
54797
  '401': { $ref: '#/components/responses/Unauthorized' }
54603
54798
  '403':
54604
54799
  description: 'Returned with code `ads_allowance_exceeded` when the team has no payment method on file and has reached the 500 free live ads: add a card to resume.'
54605
- '404': { description: Account not found }
54800
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54801
+
54606
54802
  '422': { description: "No Facebook Page resolved for the account" }
54607
54803
  '502': { description: "Meta accepted the request then failed to produce the media (upload session, chunk transfer, processing timeout, or a response with no image hash). Inspect `platformError.reason`." }
54608
54804
 
@@ -54638,6 +54834,7 @@ paths:
54638
54834
  format: uri
54639
54835
  description: "Website shown as the creative's link. Required: Meta rejects tel: as link_data.link; the phone number rides only the CTA."
54640
54836
  responses:
54837
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54641
54838
  '201':
54642
54839
  description: |
54643
54840
  Ad(s) created and submitted for review. The route shares its handler with
@@ -54659,7 +54856,8 @@ paths:
54659
54856
  '401': { $ref: '#/components/responses/Unauthorized' }
54660
54857
  '403':
54661
54858
  description: 'Returned with code `ads_allowance_exceeded` when the team has no payment method on file and has reached the 500 free live ads: add a card to resume.'
54662
- '404': { description: Account not found }
54859
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54860
+
54663
54861
  '422': { description: "No Facebook Page resolved for the account" }
54664
54862
  '502': { description: "Meta accepted the request then failed to produce the media (upload session, chunk transfer, processing timeout, or a response with no image hash). Inspect `platformError.reason`." }
54665
54863
 
@@ -54707,6 +54905,7 @@ paths:
54707
54905
  budgetType: daily
54708
54906
  status: PAUSED
54709
54907
  responses:
54908
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54710
54909
  '201':
54711
54910
  description: |
54712
54911
  CTWA ad(s) created and submitted to Meta for review. Response is a
@@ -54736,7 +54935,8 @@ paths:
54736
54935
  '401': { $ref: '#/components/responses/Unauthorized' }
54737
54936
  '403':
54738
54937
  description: 'Forbidden. Also returned with code `ads_allowance_exceeded` when the team has no payment method on file and has reached the 500 free live ads: add a card to resume.'
54739
- '404': { description: SocialAccount not found. }
54938
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54939
+
54740
54940
  '422':
54741
54941
  description: Page is not connected to a verified WhatsApp number.
54742
54942
  '502':
@@ -54758,6 +54958,8 @@ paths:
54758
54958
  - { name: accountId, in: path, required: true, schema: { type: string }, description: "Meta ads SocialAccount id." }
54759
54959
  - { name: adAccountId, in: query, required: true, schema: { type: string }, description: "Meta ad account id (act_<n>)." }
54760
54960
  responses:
54961
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
54962
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54761
54963
  '200':
54762
54964
  description: Custom conversions
54763
54965
  content:
@@ -54777,7 +54979,7 @@ paths:
54777
54979
  operationId: createCustomConversion
54778
54980
  tags: ["Ad Accounts"]
54779
54981
  x-platforms: ["meta"]
54780
- summary: Create or reuse a custom conversion
54982
+ summary: 'Create custom conversion'
54781
54983
  description: |-
54782
54984
  Provision the Meta custom conversion an ads flow optimises toward, and hand back the
54783
54985
  `customConversionId` for `promotedObject.customConversionId` on POST /v1/ads/create.
@@ -54809,6 +55011,8 @@ paths:
54809
55011
  customEventType: { type: string, description: "Meta custom_event_type, e.g. LEAD, PURCHASE, OTHER." }
54810
55012
  rule: { type: object, description: "Meta conversion rule, forwarded verbatim." }
54811
55013
  responses:
55014
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
55015
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
54812
55016
  '200':
54813
55017
  description: An existing custom conversion was reused
54814
55018
  content:
@@ -56227,6 +56431,7 @@ paths:
56227
56431
  - { name: accountId, in: path, required: true, schema: { type: string }, description: 'Ads SocialAccount id (platform `metaads` or `openaiads`).' }
56228
56432
  - { name: adAccountId, in: query, required: false, schema: { type: string }, description: 'Optional, Meta only. Scope to one ad account, e.g. `act_123456789`. Ignored for OpenAI Ads.' }
56229
56433
  responses:
56434
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
56230
56435
  '200':
56231
56436
  description: Tracking tags listed
56232
56437
  content:
@@ -56241,7 +56446,8 @@ paths:
56241
56446
  '400': { description: 'Account platform not supported, or invalid `adAccountId`.' }
56242
56447
  '401': { $ref: '#/components/responses/Unauthorized' }
56243
56448
  '403': { description: 'Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the Meta token lacks ads permissions (reconnect required).' }
56244
- '404': { description: Account not found or not accessible. }
56449
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
56450
+
56245
56451
  '405': { description: Platform does not support listing tracking tags. }
56246
56452
  '502': { description: 'Meta was unreachable or returned an unclassified error (type: platform_error; the raw Meta payload is in platformError). Retryable.' }
56247
56453
 
@@ -56299,6 +56505,7 @@ paths:
56299
56505
  enum: [order_created, lead_created, items_added, contents_viewed, checkout_started, registration_completed, subscription_created, trial_started, appointment_scheduled, page_viewed, app_installed, app_opened]
56300
56506
  description: 'OpenAI Ads only (ignored by Meta). When set, also provisions a standard conversion event setting wired to the new pixel, so `goal: conversions` ad creates on `POST /v1/ads/create` have an event to reference immediately.'
56301
56507
  responses:
56508
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
56302
56509
  '201':
56303
56510
  description: Tracking tag created
56304
56511
  content:
@@ -56311,7 +56518,8 @@ paths:
56311
56518
  '400': { description: 'Invalid body, invalid `adAccountId`, over the per-business pixel cap, or ad account not in a Business Manager.' }
56312
56519
  '401': { $ref: '#/components/responses/Unauthorized' }
56313
56520
  '403': { description: 'Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the Meta token lacks ads permissions (reconnect required).' }
56314
- '404': { description: Account not found or not accessible. }
56521
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
56522
+
56315
56523
  '405': { description: Platform does not support creating tracking tags. }
56316
56524
  '422': { description: 'OpenAI Ads only: the ad account is not enabled for pixel management. Contact your OpenAI partner representative.' }
56317
56525
  '502': { description: 'Meta was unreachable or returned an unclassified error (type: platform_error; the raw Meta payload is in platformError). Creating a pixel is NOT idempotent, so before retrying confirm with GET /v1/accounts/{accountId}/tracking-tags that no pixel was created.' }
@@ -56335,6 +56543,8 @@ paths:
56335
56543
  - { name: accountId, in: path, required: true, schema: { type: string } }
56336
56544
  - { name: tagId, in: path, required: true, schema: { type: string }, description: 'Pixel id.' }
56337
56545
  responses:
56546
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
56547
+ '400': { $ref: '#/components/responses/BadRequest' }
56338
56548
  '200':
56339
56549
  description: Tracking tag fetched
56340
56550
  content:
@@ -56346,7 +56556,8 @@ paths:
56346
56556
  tag: { $ref: '#/components/schemas/TrackingTag' }
56347
56557
  '401': { $ref: '#/components/responses/Unauthorized' }
56348
56558
  '403': { description: 'Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the Meta token lacks ads permissions (reconnect required).' }
56349
- '404': { description: Account or tracking tag not found. }
56559
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
56560
+
56350
56561
  '405': { description: Platform does not support fetching a tracking tag. }
56351
56562
  '502': { description: 'Meta was unreachable or returned an unclassified error (type: platform_error; the raw Meta payload is in platformError). Retryable.' }
56352
56563
 
@@ -56401,6 +56612,7 @@ paths:
56401
56612
  type: string
56402
56613
  enum: [advertising_and_analytics, analytics_only, empty]
56403
56614
  responses:
56615
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
56404
56616
  '200':
56405
56617
  description: Tracking tag updated (re-fetched canonical state)
56406
56618
  content:
@@ -56413,7 +56625,8 @@ paths:
56413
56625
  '400': { description: Invalid body (e.g. no fields supplied) or Meta validation failure. }
56414
56626
  '401': { $ref: '#/components/responses/Unauthorized' }
56415
56627
  '403': { description: 'Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the Meta token lacks ads permissions (reconnect required).' }
56416
- '404': { description: Account or tracking tag not found. }
56628
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
56629
+
56417
56630
  '405': { description: Platform does not support updating tracking tags. }
56418
56631
  '502': { description: 'Meta was unreachable or returned an unclassified error (type: platform_error; the raw Meta payload is in platformError). Retryable.' }
56419
56632
 
@@ -56431,6 +56644,8 @@ paths:
56431
56644
  - { name: accountId, in: path, required: true, schema: { type: string } }
56432
56645
  - { name: tagId, in: path, required: true, schema: { type: string }, description: 'Pixel id.' }
56433
56646
  responses:
56647
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
56648
+ '400': { $ref: '#/components/responses/BadRequest' }
56434
56649
  '200':
56435
56650
  description: Shared ad accounts listed
56436
56651
  content:
@@ -56444,7 +56659,8 @@ paths:
56444
56659
  items: { $ref: '#/components/schemas/SharedAdAccount' }
56445
56660
  '401': { $ref: '#/components/responses/Unauthorized' }
56446
56661
  '403': { description: 'Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the Meta token lacks ads permissions (reconnect required).' }
56447
- '404': { description: Account or tracking tag not found. }
56662
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
56663
+
56448
56664
  '405': { description: Platform does not support shared accounts. }
56449
56665
  '502': { description: 'Meta was unreachable or returned an unclassified error (type: platform_error; the raw Meta payload is in platformError). Retryable.' }
56450
56666
 
@@ -56475,6 +56691,7 @@ paths:
56475
56691
  properties:
56476
56692
  adAccountId: { type: string, description: 'Ad account to share with, e.g. `act_123456789`.' }
56477
56693
  responses:
56694
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
56478
56695
  '201':
56479
56696
  description: Tracking tag shared with the ad account
56480
56697
  content:
@@ -56487,7 +56704,8 @@ paths:
56487
56704
  '400': { description: 'Invalid body / `adAccountId`, or Meta rejected the share (e.g. personal ad account).' }
56488
56705
  '401': { $ref: '#/components/responses/Unauthorized' }
56489
56706
  '403': { description: 'Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the Meta token lacks ads permissions (reconnect required).' }
56490
- '404': { description: Account or tracking tag not found. }
56707
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
56708
+
56491
56709
  '405': { description: Platform does not support shared accounts. }
56492
56710
  '502': { description: 'Meta was unreachable or returned an unclassified error (type: platform_error; the raw Meta payload is in platformError). Retryable.' }
56493
56711
 
@@ -56508,11 +56726,13 @@ paths:
56508
56726
  - { name: tagId, in: path, required: true, schema: { type: string }, description: 'Pixel id.' }
56509
56727
  - { name: adAccountId, in: query, required: false, schema: { type: string }, description: 'Ad account to unshare, e.g. `act_123456789`. May also be sent in the JSON body.' }
56510
56728
  responses:
56729
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
56511
56730
  '204': { description: Ad account unshared (no content). }
56512
56731
  '400': { description: '`adAccountId` missing (neither query nor body), or Meta rejected the unshare.' }
56513
56732
  '401': { $ref: '#/components/responses/Unauthorized' }
56514
56733
  '403': { description: 'Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the Meta token lacks ads permissions (reconnect required).' }
56515
- '404': { description: Account or tracking tag not found. }
56734
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
56735
+
56516
56736
  '405': { description: Platform does not support shared accounts. }
56517
56737
  '502': { description: 'Meta was unreachable or returned an unclassified error (type: platform_error; the raw Meta payload is in platformError). Retryable.' }
56518
56738
 
@@ -56560,6 +56780,7 @@ paths:
56560
56780
  - { name: startTime, in: query, required: false, schema: { type: integer }, description: 'Unix seconds lower bound.' }
56561
56781
  - { name: endTime, in: query, required: false, schema: { type: integer }, description: 'Unix seconds upper bound.' }
56562
56782
  responses:
56783
+ '409': { $ref: '#/components/responses/AccountConnectionRequired' }
56563
56784
  '200':
56564
56785
  description: Stats fetched
56565
56786
  content:
@@ -56580,7 +56801,8 @@ paths:
56580
56801
  '400': { description: Invalid query parameter. }
56581
56802
  '401': { $ref: '#/components/responses/Unauthorized' }
56582
56803
  '403': { description: 'Ads access required (Ads add-on on legacy plans, included on usage-based plans), or the Meta token lacks ads permissions (reconnect required).' }
56583
- '404': { description: Account or tracking tag not found. }
56804
+ '404': { $ref: '#/components/responses/AccountUnavailable' }
56805
+
56584
56806
  '405': { description: Platform does not support tracking-tag stats. }
56585
56807
  '502': { description: 'Meta was unreachable or returned an unclassified error (type: platform_error; the raw Meta payload is in platformError). Retryable.' }
56586
56808
 
@@ -57148,3 +57370,259 @@ paths:
57148
57370
  '400': { $ref: '#/components/responses/BadRequest' }
57149
57371
  '401': { $ref: '#/components/responses/Unauthorized' }
57150
57372
  '404': { description: Verification not found (or already reaped). }
57373
+
57374
+ /v1/ads/pixels:
57375
+ get:
57376
+ operationId: 'listTikTokAdPixels'
57377
+ summary: 'List TikTok ad pixels'
57378
+ description: 'Lists pixels and their supported optimization events for a connected TikTok Ads account. The advertiser defaults to the first advertiser on the connection. Reconnect if Pixel Management permission has not been granted.'
57379
+ tags:
57380
+ - 'Ad Accounts'
57381
+ x-resource-group: 'ads'
57382
+ x-platforms:
57383
+ - 'tiktok'
57384
+ security:
57385
+ - bearerAuth: []
57386
+ parameters:
57387
+ - &a1
57388
+ name: 'accountId'
57389
+ in: 'query'
57390
+ required: true
57391
+ schema: &a7
57392
+ type: 'string'
57393
+ pattern: '^[a-fA-F0-9]{24}$'
57394
+ description: 'Zernio SocialAccount ID.'
57395
+ - name: 'advertiserId'
57396
+ in: 'query'
57397
+ schema:
57398
+ type: 'string'
57399
+ description: 'Advertiser belonging to this connection.'
57400
+ - name: 'code'
57401
+ in: 'query'
57402
+ schema:
57403
+ type: 'string'
57404
+ description: 'Filter by a Pixel Code.'
57405
+ responses:
57406
+ "200":
57407
+ description: 'TikTok pixels.'
57408
+ content:
57409
+ application/json:
57410
+ schema:
57411
+ type: 'object'
57412
+ properties:
57413
+ advertiserId:
57414
+ type: 'string'
57415
+ pixels:
57416
+ type: 'array'
57417
+ items:
57418
+ type: 'object'
57419
+ properties:
57420
+ pixelId:
57421
+ type: 'string'
57422
+ pixelCode:
57423
+ type: 'string'
57424
+ name:
57425
+ type: 'string'
57426
+ events:
57427
+ type: 'array'
57428
+ items:
57429
+ type: 'string'
57430
+ eventDetails:
57431
+ type: 'array'
57432
+ items:
57433
+ type: 'object'
57434
+ properties:
57435
+ name:
57436
+ type: 'string'
57437
+ optimizationEvent:
57438
+ type:
57439
+ - 'string'
57440
+ - 'null'
57441
+ custom:
57442
+ type: 'boolean'
57443
+ example:
57444
+ advertiserId: '7330955083452284929'
57445
+ pixels: []
57446
+ "400": &a2
57447
+ $ref: '#/components/responses/BadRequest'
57448
+ "401": &a3
57449
+ $ref: '#/components/responses/Unauthorized'
57450
+ "403":
57451
+ description: 'Ads access required.'
57452
+ "404": &a4
57453
+ $ref: '#/components/responses/AccountUnavailable'
57454
+ "409": &a5
57455
+ $ref: '#/components/responses/AccountConnectionRequired'
57456
+ "422":
57457
+ description: 'Pixel Management permission is missing (code reconnect_required). Reconnect TikTok Ads to grant it.'
57458
+ /v1/ads/partnership-content:
57459
+ get:
57460
+ operationId: 'listPartnershipAdContent'
57461
+ summary: 'List partnership ad content'
57462
+ description: 'Private beta. Lists creator Instagram posts available to the advertiser for Partnership Ads. Supply creatorUsername or postUrl. Requires instagram_branded_content_ads_brand permission and an advertiser Instagram Business Account.'
57463
+ tags:
57464
+ - 'Ad Creatives'
57465
+ x-resource-group: 'ads'
57466
+ x-platforms:
57467
+ - 'meta'
57468
+ security:
57469
+ - bearerAuth: []
57470
+ parameters:
57471
+ - *a1
57472
+ - name: 'creatorUsername'
57473
+ in: 'query'
57474
+ schema:
57475
+ type: 'string'
57476
+ description: 'Creator username. Required unless postUrl is supplied.'
57477
+ - name: 'postUrl'
57478
+ in: 'query'
57479
+ schema:
57480
+ type: 'string'
57481
+ format: 'uri'
57482
+ description: 'Instagram post permalink. Required unless creatorUsername is supplied.'
57483
+ - name: 'onlyAllowlisted'
57484
+ in: 'query'
57485
+ schema:
57486
+ type: 'boolean'
57487
+ description: 'Return only creators with account-level permission.'
57488
+ responses:
57489
+ "200":
57490
+ description: 'Advertisable Instagram media.'
57491
+ content:
57492
+ application/json:
57493
+ schema:
57494
+ type: 'object'
57495
+ properties:
57496
+ media:
57497
+ type: 'array'
57498
+ items:
57499
+ type: 'object'
57500
+ properties:
57501
+ id:
57502
+ type: 'string'
57503
+ permalink:
57504
+ type: 'string'
57505
+ ownerId:
57506
+ type: 'string'
57507
+ hasPermissionForPartnershipAd:
57508
+ type: 'boolean'
57509
+ isCreatorAllowlisted:
57510
+ type: 'boolean'
57511
+ eligibilityErrors:
57512
+ type: 'array'
57513
+ items:
57514
+ type: 'string'
57515
+ recommendedCampaignObjectives:
57516
+ type: 'array'
57517
+ items:
57518
+ type: 'string'
57519
+ example:
57520
+ media: []
57521
+ "400": *a2
57522
+ "401": *a3
57523
+ "403": &a6
57524
+ description: 'Ads access required. Partnership operations also require private beta access.'
57525
+ "404": *a4
57526
+ "409": *a5
57527
+ "422":
57528
+ description: 'The advertiser Instagram Business Account could not be resolved.'
57529
+ /v1/ads/partnership-permissions:
57530
+ get:
57531
+ operationId: 'listPartnershipAdPermissions'
57532
+ summary: 'List partnership permissions'
57533
+ description: 'Private beta. Lists granted or pending creator permissions for the advertiser Instagram Business Account. Requires instagram_branded_content_ads_brand permission.'
57534
+ tags:
57535
+ - 'Ad Creatives'
57536
+ x-resource-group: 'ads'
57537
+ x-platforms:
57538
+ - 'meta'
57539
+ security:
57540
+ - bearerAuth: []
57541
+ parameters:
57542
+ - *a1
57543
+ - name: 'creatorUsername'
57544
+ in: 'query'
57545
+ schema:
57546
+ type: 'string'
57547
+ description: 'Filter by creator username.'
57548
+ responses:
57549
+ "200":
57550
+ description: 'Partnership permissions.'
57551
+ content:
57552
+ application/json:
57553
+ schema:
57554
+ type: 'object'
57555
+ properties:
57556
+ permissions:
57557
+ type: 'array'
57558
+ items: &a8
57559
+ type: 'object'
57560
+ properties:
57561
+ id:
57562
+ type: 'string'
57563
+ permissionType:
57564
+ type: 'string'
57565
+ status:
57566
+ type: 'string'
57567
+ example:
57568
+ permissions: []
57569
+ "400": *a2
57570
+ "401": *a3
57571
+ "403": *a6
57572
+ "404": *a4
57573
+ "409": *a5
57574
+ "422":
57575
+ description: 'The advertiser Instagram Business Account could not be resolved.'
57576
+ post:
57577
+ operationId: 'setPartnershipAdPermission'
57578
+ summary: 'Set partnership permission'
57579
+ description: 'Private beta. Requests permission from a creator or revokes it when revoke is true. Requests require the creator to approve in Instagram. Requires instagram_branded_content_ads_brand permission.'
57580
+ tags:
57581
+ - 'Ad Creatives'
57582
+ x-resource-group: 'ads'
57583
+ x-platforms:
57584
+ - 'meta'
57585
+ security:
57586
+ - bearerAuth: []
57587
+ requestBody:
57588
+ required: true
57589
+ content:
57590
+ application/json:
57591
+ schema:
57592
+ type: 'object'
57593
+ required:
57594
+ - 'accountId'
57595
+ - 'creatorUsername'
57596
+ properties:
57597
+ accountId: *a7
57598
+ creatorUsername:
57599
+ type: 'string'
57600
+ minLength: 1
57601
+ revoke:
57602
+ type: 'boolean'
57603
+ example:
57604
+ accountId: '507f1f77bcf86cd799439011'
57605
+ creatorUsername: 'example_creator'
57606
+ revoke: false
57607
+ responses:
57608
+ "200": &a9
57609
+ description: 'Partnership permission state.'
57610
+ content:
57611
+ application/json:
57612
+ schema:
57613
+ type: 'object'
57614
+ properties:
57615
+ permission: *a8
57616
+ example:
57617
+ permission:
57618
+ id: '123456789'
57619
+ permissionType: 'AD'
57620
+ status: 'PENDING'
57621
+ "201": *a9
57622
+ "400": *a2
57623
+ "401": *a3
57624
+ "403": *a6
57625
+ "404": *a4
57626
+ "409": *a5
57627
+ "422":
57628
+ description: 'The advertiser Instagram Business Account could not be resolved.'