# Harvested verbatim from https://api.optimyzee.com/docs (HTTP 200, application/json, 2026-08-12). # Format-converted JSON -> YAML. Only two additions vs openapi/_original/optimyzee-openapi.json: # - servers[]: the published document omits servers entirely; api.optimyzee.com is the host that # serves this document AND answers the operations live (401 Unauthenticated on /app/campaign). # - info.title: original is the placeholder "API"; preserved as info.x-original-title. # No paths, schemas, parameters or responses were altered. See overlays/optimyzee-openapi-overlay.yaml. openapi: 3.0.0 info: title: Optimyzee Application API version: 4.1.0 x-original-title: API servers: - url: https://api.optimyzee.com description: Production (host serving this document at /docs) tags: - name: App/Analyze/GoogleAds/Audit description: App/Analyze/GoogleAds/Audit - name: App/Analyze/GoogleAds/Health description: App/Analyze/GoogleAds/Health - name: App/Analyze/GoogleAds/Optimization description: App/Analyze/GoogleAds/Optimization - name: App/Analyze/GoogleAds/Reporting description: App/Analyze/GoogleAds/Reporting - name: App/Auth/Email description: App/Auth/Email - name: App/Auth/Gateway description: App/Auth/Gateway - name: App/Auth/Password description: App/Auth/Password - name: App/Auth/Profile description: App/Auth/Profile - name: App/Auth/Tfa description: App/Auth/Tfa - name: App/Auth/TrustedDevice description: App/Auth/TrustedDevice - name: App Automation description: App Automation - name: App Automations description: App Automations - name: App/Billing/Subscription description: App/Billing/Subscription - name: App/Campaign description: App/Campaign - name: App/FreeLimit description: App/FreeLimit - name: App/Campaign/Activity description: App/Campaign/Activity - name: App/Campaign/GoogleAds description: App/Campaign/GoogleAds - name: App/Create/GoogleAds/KeywordPlanner description: App/Create/GoogleAds/KeywordPlanner - name: App/Create/GoogleAds/RsaBuilder description: App/Create/GoogleAds/RsaBuilder - name: App/Create/GoogleAds/SearchCreation description: App/Create/GoogleAds/SearchCreation - name: App/Create/GoogleAds/SearchCreationAi description: App/Create/GoogleAds/SearchCreationAi - name: App/Create/GoogleAds/SitelinkBuilder description: App/Create/GoogleAds/SitelinkBuilder - name: App/Linking/GoogleAds description: App/Linking/GoogleAds - name: App/Linking/Meta description: App/Linking/Meta - name: App/Lookup/GoogleAds/Campaign description: App/Lookup/GoogleAds/Campaign - name: App/Lookup/GoogleAds/GeoTargetConstant description: App/Lookup/GoogleAds/GeoTargetConstant - name: App/Lookup/GoogleAds/LanguageConstant description: App/Lookup/GoogleAds/LanguageConstant - name: App/Lookup/GoogleAds/MerchantCenter description: App/Lookup/GoogleAds/MerchantCenter - name: App Recommendation description: App Recommendation - name: App Signal description: App Signal - name: App/Support description: App/Support - name: App Yelp description: App Yelp - name: Operations/Admin description: Operations/Admin - name: Operations/Auth/Gateway description: Operations/Auth/Gateway - name: Operations/Auth/Profile description: Operations/Auth/Profile - name: Operations/Billing/Subscription description: Operations/Billing/Subscription - name: Operations/Campaign description: Operations/Campaign - name: Operations/Campaign/Log description: Operations/Campaign/Log - name: Operations/Campaign/Task description: Operations/Campaign/Task - name: Operations/User description: Operations/User paths: /app/analyze/g/audit: post: tags: - App/Analyze/GoogleAds/Audit operationId: appAnalyzeGoogleAdsAuditQueue requestBody: required: false content: application/json: schema: required: - linkingId - campaignId - scope properties: linkingId: type: integer campaignId: type: integer scope: type: string enum: - CAMPAIGN - SEARCH_ADS - SEARCH_KEYWORDS - SEARCH_TERMS - P_MAX type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/analyze/g/audit/{auditId}: get: tags: - App/Analyze/GoogleAds/Audit operationId: appAnalyzeGoogleAdsAuditView parameters: - name: auditId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAnalyzeGoogleAdsAuditSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/analyze/g/health: post: tags: - App/Analyze/GoogleAds/Health operationId: appAnalyzeGoogleAdsHealthAnalyze requestBody: required: true content: application/json: schema: required: - linking_id properties: linking_id: type: integer period_days: type: integer default: 30 enum: - 30 - 60 - 90 type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAnalyzeGoogleAdsHealthReportSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/analyze/g/optimization/search-terms: post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationAnalyze requestBody: required: true content: application/json: schema: required: - linking_id - campaign_id properties: linking_id: type: integer campaign_id: type: integer type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' security: - token: [] /app/analyze/g/optimization/search-terms/results/mark: post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationMarkResult requestBody: required: true content: application/json: schema: required: - analysis_id - result_ids - action properties: analysis_id: type: integer result_ids: type: array items: type: integer action: type: string enum: - negative - keyword - observe - brand - competitor - ok - relevant optimized: type: boolean example: false type: object responses: '200': description: Successful security: - token: [] /app/analyze/g/optimization/p-max: post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxAnalyze requestBody: required: true content: application/json: schema: required: - linking_id - campaign_id properties: linking_id: type: integer campaign_id: type: integer type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' security: - token: [] /app/analyze/g/optimization/pmax-center/{optimizationId}/asset-draft: post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxCenterAssetDraft parameters: - name: optimizationId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - asset_group_id properties: asset_group_id: type: integer recommendation: type: object type: object responses: '200': description: Successful content: application/json: schema: type: object security: - token: [] /app/analyze/g/optimization/pmax-center/deep-audit: post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxCenterDeepAudit requestBody: required: true content: application/json: schema: required: - linking_id - campaign_id properties: linking_id: type: integer campaign_id: type: integer run_audit: type: boolean default: true run_search_intent: type: boolean default: true health_period_days: type: integer default: 30 enum: - 30 - 60 - 90 audit_scope: properties: performance: type: boolean assetGroups: type: boolean products: type: boolean searchIntent: type: boolean settings: type: boolean type: object type: object responses: '201': description: Successful content: application/json: schema: required: - data properties: data: required: - optimization_id - audit_id - search_intent_analysis_id properties: optimization_id: type: integer audit_id: type: integer nullable: true search_intent_analysis_id: type: integer nullable: true type: object type: object security: - token: [] /app/analyze/g/optimization/pmax-center/{optimizationId}/promotion-draft: get: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxCenterPromotionDraftLatest parameters: - name: optimizationId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: type: object security: - token: [] post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxCenterPromotionDraft parameters: - name: optimizationId in: path required: true schema: type: integer requestBody: required: false content: application/json: schema: properties: recommendation: type: object type: object responses: '200': description: Successful content: application/json: schema: type: object security: - token: [] /app/analyze/g/optimization/pmax-center/{optimizationId}/search-theme-suggestions: post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxCenterSearchThemeSuggestions parameters: - name: optimizationId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - asset_group_id properties: asset_group_id: type: integer seed_terms: type: array items: type: string type: object responses: '200': description: Successful content: application/json: schema: type: object security: - token: [] /app/analyze/g/optimization/pmax-center/{optimizationId}/start: post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxCenterStart parameters: - name: optimizationId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: required: - started properties: started: type: boolean type: object type: object '403': description: Monthly action limit reached / unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/analyze/g/optimization/pmax-center/{optimizationId}: get: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxCenterView parameters: - name: optimizationId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: required: - id - linking_id - campaign_id - health_period_days - audit_scope - audit_id - search_intent_analysis_id properties: id: type: integer linking_id: type: integer linking_customer_id: type: integer linking_name: type: string campaign_id: type: integer campaign_name: type: string nullable: true health_period_days: type: integer enum: - 30 - 60 - 90 audit_scope: type: object audit_id: type: integer nullable: true search_intent_analysis_id: type: integer nullable: true started: type: boolean created_at: type: string nullable: true updated_at: type: string nullable: true type: object type: object security: - token: [] /app/analyze/g/optimization/p-max/results/mark: post: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxMarkResult requestBody: required: true content: application/json: schema: required: - analysis_id - result_ids - action properties: analysis_id: type: integer result_ids: type: array items: type: integer action: type: string enum: - negative - keyword - observe - brand - competitor - ok - relevant optimized: type: boolean example: false type: object responses: '200': description: Successful security: - token: [] /app/analyze/g/optimization/p-max/{id}: get: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationPMaxView parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: type: object security: - token: [] /app/analyze/g/optimization/search-terms/{id}: get: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationView parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: type: object security: - token: [] /app/analyze/g/optimization/optimized-history: get: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationHistory parameters: - name: linkingId in: query required: false schema: type: integer - name: campaignId in: query required: false schema: type: integer responses: '200': description: Successful content: application/json: schema: type: object security: - token: [] /app/analyze/g/optimization/recommendations: get: tags: - App/Analyze/GoogleAds/Optimization operationId: appAnalyzeGoogleAdsOptimizationRecommendations parameters: - name: from in: query required: false schema: type: string format: date - name: to in: query required: false schema: type: string format: date - name: perPage in: query required: false schema: type: integer responses: '200': description: Successful content: application/json: schema: type: object security: - token: [] /app/analyze/g/reporting/editor: post: tags: - App/Analyze/GoogleAds/Reporting operationId: appAnalyzeGoogleAdsReportingEditor requestBody: required: true content: application/json: schema: required: - linkingId properties: linkingId: type: integer delete: type: array items: required: - resource - payload properties: resource: type: string payload: type: object type: object nullable: true update: type: array items: required: - resource - payload properties: resource: type: string payload: type: object type: object nullable: true create: type: array items: required: - resource - payload properties: resource: type: string payload: type: object type: object nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAnalyzeGoogleAdsReportingEditorResponseSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ErrorListSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/analyze/g/reporting/querier: post: tags: - App/Analyze/GoogleAds/Reporting operationId: appAnalyzeGoogleAdsReportingQuerier requestBody: required: true content: application/json: schema: required: - linkingId - resource - select properties: linkingId: type: integer resource: type: string select: type: array items: type: string where: type: array items: required: - column properties: column: type: string operator: type: string enum: - '=' - '!=' - < - <= - '>' - '>=' - LIKE - IN - NOT_IN - DURING nullable: true value: nullable: true oneOf: - type: boolean - type: string - type: number - type: array items: oneOf: - type: boolean - type: string - type: number nullable: true boolean: type: string enum: - AND - OR nullable: true type: object nullable: true sort: type: array items: required: - column properties: column: type: string direction: type: string enum: - ASC - DESC nullable: true type: object nullable: true limit: type: integer nullable: true perPage: type: integer nullable: true cursor: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next properties: items: type: array items: $ref: '#/components/schemas/AppAnalyzeGoogleAdsReportingRowSchema' perPage: type: integer next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Bad Request content: application/json: schema: $ref: '#/components/schemas/ErrorListSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/email/resend: post: tags: - App/Auth/Email operationId: appAuthEmailResend responses: '204': description: Successful '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/email: post: tags: - App/Auth/Email operationId: appAuthEmailUpdate requestBody: required: true content: application/json: schema: required: - email properties: email: type: string format: email type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/email/verify: post: tags: - App/Auth/Email operationId: appAuthEmailVerify requestBody: required: true content: application/json: schema: required: - code properties: code: type: string type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/gateway/email: post: tags: - App/Auth/Gateway operationId: appAuthGatewayEmail requestBody: required: true content: application/json: schema: required: - email - password properties: email: type: string password: type: string device: type: string nullable: true otp: type: string nullable: true otpRecoveryCode: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Authentication error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/auth/gateway/emailSignup: post: tags: - App/Auth/Gateway operationId: appAuthGatewayEmailSignup requestBody: required: true content: application/json: schema: required: - email - password properties: email: type: string password: type: string device: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Authentication error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/auth/gateway/facebook: post: tags: - App/Auth/Gateway operationId: appAuthGatewayFacebook requestBody: required: true content: application/json: schema: required: - accessToken properties: accessToken: type: string device: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Authentication error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/auth/gateway/facebookSignup: post: tags: - App/Auth/Gateway operationId: appAuthGatewayFacebookSignup requestBody: required: true content: application/json: schema: required: - accessToken properties: accessToken: type: string device: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Authentication error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/auth/gateway/google: post: tags: - App/Auth/Gateway operationId: appAuthGatewayGoogle requestBody: required: true content: application/json: schema: required: - accessToken properties: accessToken: type: string device: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Authentication error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/auth/gateway/googleSignup: post: tags: - App/Auth/Gateway operationId: appAuthGatewayGoogleSignup requestBody: required: true content: application/json: schema: required: - accessToken properties: accessToken: type: string device: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Authentication error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/auth/gateway/refresh: post: tags: - App/Auth/Gateway operationId: appAuthGatewayRefresh requestBody: required: true content: application/json: schema: properties: device: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/gateway/revoke: post: tags: - App/Auth/Gateway operationId: appAuthGatewayRevoke requestBody: required: true content: application/json: schema: properties: device: type: string nullable: true type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/password/reset: post: tags: - App/Auth/Password operationId: appAuthPasswordReset requestBody: required: true content: application/json: schema: required: - email - token - password properties: email: type: string token: type: string password: type: string type: object responses: '204': description: Successful '400': description: Error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/auth/password/sendResetLink: post: tags: - App/Auth/Password operationId: appAuthPasswordSendResetLink requestBody: required: true content: application/json: schema: required: - email properties: email: type: string type: object responses: '204': description: Successful '400': description: Error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/auth/profile: get: tags: - App/Auth/Profile operationId: appAuthProfile responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthProfileSchema' type: object '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] put: tags: - App/Auth/Profile operationId: appAuthProfileUpdate requestBody: required: true content: application/json: schema: required: [] properties: name: type: string nullable: true position: type: string nullable: true spend: type: string nullable: true goal: type: string nullable: true type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/tfa/disable: post: tags: - App/Auth/Tfa operationId: appAuthTfaDisable requestBody: required: true content: application/json: schema: required: [] properties: otp: type: string nullable: true otpRecoveryCode: type: string nullable: true type: object responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/tfa/enable: post: tags: - App/Auth/Tfa operationId: appAuthTfaEnable requestBody: required: true content: application/json: schema: required: - otp properties: otp: type: string type: object responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/tfa/issue: post: tags: - App/Auth/Tfa operationId: appAuthTfaIssue responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthTfaCredentialsSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/trustedDevice: get: tags: - App/Auth/TrustedDevice operationId: appAuthTrustedDeviceQuery parameters: - name: perPage in: query schema: type: integer nullable: true - name: cursor in: query schema: type: string nullable: true responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/AppAuthTrustedDeviceSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] post: tags: - App/Auth/TrustedDevice operationId: appAuthTrustedDeviceCreate requestBody: required: true content: application/json: schema: required: - guid properties: guid: type: string type: object responses: '204': description: Successful '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/trustedDevice/current: post: tags: - App/Auth/TrustedDevice operationId: appAuthTrustedDeviceCurrent requestBody: required: true content: application/json: schema: required: - guid properties: guid: type: string type: object responses: '200': description: Current device is trusted content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthTrustedDeviceSchema' type: object '204': description: Current device is not trusted '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/auth/trustedDevice/{trustedDeviceId}: get: tags: - App/Auth/TrustedDevice operationId: appAuthTrustedDeviceView parameters: - name: trustedDeviceId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppAuthTrustedDeviceSchema' type: object '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] delete: tags: - App/Auth/TrustedDevice operationId: appAuthTrustedDeviceDelete parameters: - name: trustedDeviceId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/automations/{automationId}: delete: tags: - App Automation summary: Delete an automation operationId: 8a4d6eaf33c6a8399451f759169cfa31 parameters: - name: automationId in: path required: true schema: type: integer responses: '204': description: No Content /app/automations/interpret: post: tags: - App Automation summary: Interpret a natural-language intent into proposed automations operationId: 9cee8dd5e43b406f87a6d7785d79c22f requestBody: required: true content: application/json: schema: required: - intent properties: intent: type: string context: type: object nullable: true type: object responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppAutomationSpecSchema' /app/automations: get: tags: - App Automation summary: List the current user's automations operationId: ea27e985d6ee2548d8dcc475dddcc4db responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppAutomationSchema' post: tags: - App Automation summary: Enable (persist) an automation operationId: ca27bcedfbe5f11307e47810b1b2a0b9 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppAutomationSchema' /app/automations/runs: get: tags: - App Automations summary: List automation execution history for the current user operationId: aeeca8c46e345b931240e55f10d4fd26 parameters: - name: automationId in: query required: false schema: type: integer - name: status in: query required: false schema: type: string - name: limit in: query required: false schema: type: integer responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppAutomationRunSchema' /app/billing/subscription/cancel: post: tags: - App/Billing/Subscription operationId: appBillingSubscriptionCancel responses: '204': description: Successful '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/billing/subscription/charge: post: tags: - App/Billing/Subscription operationId: appBillingSubscriptionCharge responses: '204': description: Successful '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/billing/subscription: get: tags: - App/Billing/Subscription operationId: appBillingSubscriptionQuery responses: '200': description: Successful content: application/json: schema: required: - data properties: data: type: array items: $ref: '#/components/schemas/AppBillingSubscriptionSchema' type: object post: tags: - App/Billing/Subscription operationId: appBillingSubscriptionSubscribe requestBody: required: true content: application/json: schema: required: - subscriptionId - successUrl - cancelUrl properties: subscriptionId: type: integer successUrl: type: string cancelUrl: type: string type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppBillingSubscriptionCheckoutSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/billing/subscription/session: post: tags: - App/Billing/Subscription operationId: appBillingSubscriptionSession requestBody: required: true content: application/json: schema: required: - returnUrl properties: returnUrl: type: string type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppBillingSubscriptionSessionSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/billing/subscription/skip: post: tags: - App/Billing/Subscription operationId: appBillingSubscriptionSkip requestBody: required: true content: application/json: schema: required: - subscriptionId properties: subscriptionId: type: integer type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/{campaignId}/activate: post: tags: - App/Campaign operationId: appCampaignActivate parameters: - name: campaignId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/free-limit-check: get: tags: - App/FreeLimit operationId: appFreeLimitCheck parameters: - name: action_key in: query description: 'Ex: publish.campaign, start.optimization, report.generate...' required: true schema: type: string responses: '200': description: Successful check content: application/json: schema: required: - available properties: available: type: boolean type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/{campaignId}: get: tags: - App/Campaign operationId: appCampaignView parameters: - name: campaignId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppCampaignSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] delete: tags: - App/Campaign operationId: appCampaignDelete parameters: - name: campaignId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/{campaignId}/optimization: post: tags: - App/Campaign operationId: appCampaignOptimization parameters: - name: campaignId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - message properties: message: type: string type: object responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/{campaignId}/pause: post: tags: - App/Campaign operationId: appCampaignPause parameters: - name: campaignId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign: get: tags: - App/Campaign operationId: appCampaignQuery parameters: - name: googleAdsLinkingId in: query schema: type: integer - name: googleAdsCampaignId in: query schema: type: integer - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/AppCampaignSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/activity/apply/{taskId}: post: tags: - App/Campaign/Activity operationId: appCampaignActivityApply parameters: - name: taskId in: path required: true schema: type: integer responses: '204': description: Successful '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/activity/dismiss/{taskId}: post: tags: - App/Campaign/Activity operationId: appCampaignActivityDismiss parameters: - name: taskId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - message properties: message: type: string type: object responses: '204': description: Successful '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/activity/{campaignId}: get: tags: - App/Campaign/Activity operationId: appCampaignActivityQuery parameters: - name: campaignId in: path required: true schema: type: integer - name: statuses in: query schema: type: array items: type: string enum: - DRAFT - RECOMMENDATION - BLOCKED - PENDING - PROCESSING - DONE - GOAL nullable: true - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/AppCampaignActivityTaskSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/googleAds/{campaignId}/access: post: tags: - App/Campaign/GoogleAds operationId: appCampaignGoogleAdsAccess parameters: - name: campaignId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/googleAds: post: tags: - App/Campaign/GoogleAds operationId: appCampaignGoogleAdsCreate requestBody: required: true content: application/json: schema: required: - linkingId - campaignId properties: linkingId: type: integer campaignId: type: integer type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/googleAds/{campaignId}/metrics: get: tags: - App/Campaign/GoogleAds operationId: appCampaignGoogleAdsMetrics parameters: - name: campaignId in: path required: true schema: type: integer - name: from in: query required: true schema: type: string format: date - name: to in: query required: true schema: type: string format: date responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppCampaignGoogleAdsMetricsReportSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/campaign/googleAds/{campaignId}/refresh: post: tags: - App/Campaign/GoogleAds operationId: appCampaignGoogleAdsRefresh parameters: - name: campaignId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/keywordPlanner/{plannerId}/export: get: tags: - App/Create/GoogleAds/KeywordPlanner operationId: appCreateGoogleAdsKeywordPlannerExport parameters: - name: plannerId in: path required: true schema: type: integer responses: '200': description: Successful content: text/csv: schema: type: string format: binary '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/keywordPlanner: post: tags: - App/Create/GoogleAds/KeywordPlanner operationId: appCreateGoogleAdsKeywordPlannerQueue requestBody: required: true content: application/json: schema: required: - url properties: url: type: string prompt: type: string nullable: true language: type: integer nullable: true locations: type: array items: type: integer nullable: true type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/keywordPlanner/{plannerId}/reprocess: post: tags: - App/Create/GoogleAds/KeywordPlanner operationId: appCreateGoogleAdsKeywordPlannerReprocess parameters: - name: plannerId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - url properties: url: type: string prompt: type: string nullable: true language: type: integer nullable: true locations: type: array items: type: integer nullable: true type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/keywordPlanner/{plannerId}: get: tags: - App/Create/GoogleAds/KeywordPlanner operationId: appCreateGoogleAdsKeywordPlannerView parameters: - name: plannerId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppCreateGoogleAdsKeywordPlannerSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] put: tags: - App/Create/GoogleAds/KeywordPlanner operationId: appCreateGoogleAdsKeywordPlannerUpdate parameters: - name: plannerId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - selected properties: selected: type: array items: type: integer type: object responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/rsaBuilder/{builderId}/export: get: tags: - App/Create/GoogleAds/RsaBuilder operationId: appCreateGoogleAdsRsaBuilderExport parameters: - name: builderId in: path required: true schema: type: integer responses: '200': description: Successful content: text/csv: schema: type: string format: binary '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/rsaBuilder: post: tags: - App/Create/GoogleAds/RsaBuilder operationId: appCreateGoogleAdsRsaBuilderQueue requestBody: required: true content: application/json: schema: required: - url properties: url: type: string prompt: type: string nullable: true type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/rsaBuilder/{builderId}/reprocess: post: tags: - App/Create/GoogleAds/RsaBuilder operationId: appCreateGoogleAdsRsaBuilderReprocess parameters: - name: builderId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - url properties: url: type: string prompt: type: string nullable: true type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/rsaBuilder/{builderId}: get: tags: - App/Create/GoogleAds/RsaBuilder operationId: appCreateGoogleAdsRsaBuilderView parameters: - name: builderId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppCreateGoogleAdsRsaBuilderSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] put: tags: - App/Create/GoogleAds/RsaBuilder operationId: appCreateGoogleAdsRsaBuilderUpdate parameters: - name: builderId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - headlines - descriptions properties: headlines: type: array items: type: string descriptions: type: array items: type: string type: object responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreation: post: tags: - App/Create/GoogleAds/SearchCreation operationId: appCreateGoogleAdsSearchCreationCreate requestBody: required: true content: application/json: schema: required: - url properties: url: type: string linkingId: type: integer nullable: true rsaBuilderId: type: integer nullable: true keywordPlannerId: type: integer nullable: true languages: type: array items: type: integer nullable: true locations: type: array items: type: integer nullable: true budgetAmount: type: integer nullable: true type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreation/{draftId}/publish: post: tags: - App/Create/GoogleAds/SearchCreation operationId: appCreateGoogleAdsSearchCreationPublish parameters: - name: draftId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreation/{draftId}/rebuild: post: tags: - App/Create/GoogleAds/SearchCreation operationId: appCreateGoogleAdsSearchCreationRebuild parameters: - name: draftId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: [] properties: url: type: string nullable: true prompt: type: string nullable: true languages: type: array items: type: integer nullable: true locations: type: array items: type: integer nullable: true type: object responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreation/{draftId}/status: get: tags: - App/Create/GoogleAds/SearchCreation operationId: appCreateGoogleAdsSearchCreationStatus parameters: - name: draftId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppCreateGoogleAdsSearchCreationStatusSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreation/{draftId}: get: tags: - App/Create/GoogleAds/SearchCreation operationId: appCreateGoogleAdsSearchCreationView parameters: - name: draftId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppCreateGoogleAdsSearchCreationDraftSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] patch: tags: - App/Create/GoogleAds/SearchCreation operationId: appCreateGoogleAdsSearchCreationUpdate parameters: - name: draftId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: [] properties: linkingId: type: integer nullable: true url: type: string nullable: true languages: type: array items: type: integer nullable: true locations: type: array items: type: integer nullable: true headlines: type: array items: type: string nullable: true descriptions: type: array items: type: string nullable: true keywords: type: array items: type: integer nullable: true budgetAmount: type: integer nullable: true type: object responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreationAi/{draftId}/keywordPlanner: post: tags: - App/Create/GoogleAds/SearchCreationAi operationId: appCreateGoogleAdsSearchCreationAiBuildKeywordPlanner parameters: - name: draftId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - source properties: source: type: string enum: - ai - manual - merge example: ai manualKeywords: type: array items: type: string example: - emergency plumber near me - water heater installation nullable: true type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '422': description: Validation error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreationAi/{draftId}/rsa-builder: post: tags: - App/Create/GoogleAds/SearchCreationAi operationId: appCreateGoogleAdsSearchCreationAiBuildRsaAds parameters: - name: draftId in: path required: true schema: type: integer responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' security: - token: [] /app/create/g/searchCreationAi/{draftId}/stag-builder: post: tags: - App/Create/GoogleAds/SearchCreationAi operationId: appCreateGoogleAdsSearchCreationAiBuildStagStructure parameters: - name: draftId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - keyword_ids - campaign_type properties: keyword_ids: type: array items: type: integer campaign_type: type: string enum: - high_intent - competitor_brands campaign_name: type: string nullable: true max_cpc: type: number format: float nullable: true landing_page_url: type: string nullable: true type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '422': description: Validation error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreationAi: post: tags: - App/Create/GoogleAds/SearchCreationAi operationId: appCreateGoogleAdsSearchCreationAiCreate requestBody: required: true content: application/json: schema: required: - url properties: url: type: string linkingId: type: integer nullable: true languages: type: array items: type: integer nullable: true locations: type: array items: type: integer nullable: true knownCompetitors: type: array items: type: string nullable: true exclusions: type: array items: type: string nullable: true type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '422': description: Validation error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreationAi/{draftId}/status: get: tags: - App/Create/GoogleAds/SearchCreationAi operationId: appCreateGoogleAdsSearchCreationAiStatus parameters: - name: draftId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/searchCreationAi/{draftId}: get: tags: - App/Create/GoogleAds/SearchCreationAi operationId: appCreateGoogleAdsSearchCreationAiView parameters: - name: draftId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/sitelinkBuilder/{builderId}/export: get: tags: - App/Create/GoogleAds/SitelinkBuilder operationId: appCreateGoogleAdsSitelinkBuilderExport parameters: - name: builderId in: path required: true schema: type: integer responses: '200': description: Successful content: text/csv: schema: type: string format: binary '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/sitelinkBuilder: post: tags: - App/Create/GoogleAds/SitelinkBuilder operationId: appCreateGoogleAdsSitelinkBuilderQueue requestBody: required: true content: application/json: schema: required: - url properties: url: type: string type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/sitelinkBuilder/{builderId}/reprocess: post: tags: - App/Create/GoogleAds/SitelinkBuilder operationId: appCreateGoogleAdsSitelinkBuilderReprocess parameters: - name: builderId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - url properties: url: type: string type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/create/g/sitelinkBuilder/{builderId}: get: tags: - App/Create/GoogleAds/SitelinkBuilder operationId: appCreateGoogleAdsSitelinkBuilderView parameters: - name: builderId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppCreateGoogleAdsSitelinkBuilderSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] put: tags: - App/Create/GoogleAds/SitelinkBuilder operationId: appCreateGoogleAdsSitelinkBuilderUpdate parameters: - name: builderId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - sitelinks properties: sitelinks: type: array items: required: - finalUrl - linkText properties: finalUrl: type: string linkText: type: string description1: type: string nullable: true description2: type: string nullable: true type: object type: object responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/g/{linkingId}: get: tags: - App/Linking/GoogleAds operationId: appLinkingGoogleAdsView parameters: - name: linkingId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppLinkingGoogleAdsSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] delete: tags: - App/Linking/GoogleAds operationId: appLinkingGoogleAdsDelete parameters: - name: linkingId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/g/hierarchy: get: tags: - App/Linking/GoogleAds operationId: appLinkingGoogleAdsHierarchy responses: '200': description: Successful content: application/json: schema: required: - data properties: data: type: array items: $ref: '#/components/schemas/AppLinkingGoogleAdsHierarchySchema' type: object '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/g: get: tags: - App/Linking/GoogleAds operationId: appLinkingGoogleAdsQuery parameters: - name: q in: query schema: type: string nullable: true - name: isManager in: query schema: type: integer enum: - 0 - 1 nullable: true - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/AppLinkingGoogleAdsSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] post: tags: - App/Linking/GoogleAds operationId: appLinkingGoogleAdsIssue requestBody: required: true content: application/json: schema: required: - code - redirectUri properties: code: type: string redirectUri: type: string type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Failed content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/g/{linkingId}/ping: get: tags: - App/Linking/GoogleAds operationId: appLinkingGoogleAdsPing parameters: - name: linkingId in: path required: true schema: type: integer responses: '204': description: Successful '400': description: Error content: application/json: schema: $ref: '#/components/schemas/ErrorListSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/g/uri: get: tags: - App/Linking/GoogleAds operationId: appLinkingGoogleAdsUri parameters: - name: redirectUri in: query required: true schema: type: string responses: '200': description: Successful content: application/json: schema: required: - uri properties: uri: type: string type: object '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/meta/{linkingId}/accounts: get: tags: - App/Linking/Meta operationId: appLinkingMetaAccounts parameters: - name: linkingId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: type: array items: $ref: '#/components/schemas/AppLinkingMetaAccountSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/meta/{linkingId}: get: tags: - App/Linking/Meta operationId: appLinkingMetaView parameters: - name: linkingId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppLinkingMetaSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] delete: tags: - App/Linking/Meta operationId: appLinkingMetaDelete parameters: - name: linkingId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/meta/{linkingId}/ping: get: tags: - App/Linking/Meta operationId: appLinkingMetaPing parameters: - name: linkingId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/meta: get: tags: - App/Linking/Meta operationId: appLinkingMetaQuery parameters: - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/AppLinkingMetaSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/meta/{linkingId}/select: post: tags: - App/Linking/Meta operationId: appLinkingMetaSelectAccount parameters: - name: linkingId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - accountId properties: accountId: type: integer type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/AppLinkingMetaAccountSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/linking/meta/uri: get: tags: - App/Linking/Meta operationId: appLinkingMetaUri responses: '200': description: Successful content: application/json: schema: required: - uri properties: uri: type: string type: object '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/lookup/g/campaign: get: tags: - App/Lookup/GoogleAds/Campaign operationId: appLookupGoogleAdsCampaignQuery parameters: - name: linkingId in: query required: true schema: type: integer - name: q in: query schema: type: string nullable: true - name: advertisingChannelType in: query schema: type: string enum: - SEARCH - PERFORMANCE_MAX nullable: true - name: advertisingChannelTypes[] in: query schema: type: array items: type: string enum: - SEARCH - PERFORMANCE_MAX nullable: true responses: '200': description: Successful content: application/json: schema: required: - data properties: data: type: array items: $ref: '#/components/schemas/AppLookupGoogleAdsCampaignSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/lookup/g/geoTargetConstant: get: tags: - App/Lookup/GoogleAds/GeoTargetConstant operationId: appLookupGoogleAdsGeoTargetConstantQuery parameters: - name: q in: query schema: type: string - name: ids in: query schema: type: array items: type: integer - name: resourceNames in: query schema: type: array items: type: string responses: '200': description: Successful content: application/json: schema: required: - data properties: data: type: array items: $ref: '#/components/schemas/AppLookupGoogleAdsGeoTargetConstantSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/lookup/g/languageConstant: get: tags: - App/Lookup/GoogleAds/LanguageConstant operationId: appLookupGoogleAdsLanguageConstantQuery responses: '200': description: Successful content: application/json: schema: required: - data properties: data: type: array items: $ref: '#/components/schemas/AppLookupGoogleAdsLanguageConstantSchema' type: object '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/lookup/g/merchant-center: get: tags: - App/Lookup/GoogleAds/MerchantCenter operationId: appLookupGoogleAdsMerchantCenterQuery parameters: - name: linkingId in: query required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/recommendations: get: tags: - App Recommendation summary: List the current user's stored recommendations operationId: a0beb9202425004a1461d531cc8378af parameters: - name: businessId in: query required: false schema: type: string - name: domain in: query required: false schema: type: string - name: status in: query required: false schema: type: string responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppRecommendationSchema' /app/recommendations/{recommendationId}: patch: tags: - App Recommendation summary: Update a recommendation status operationId: 02b67b9bb321e6ea93f11dd324815378 parameters: - name: recommendationId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - status properties: status: type: string type: object responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppRecommendationSchema' /app/signals: get: tags: - App Signal summary: Live readings from every registered signal connector operationId: cf53c6cd627e8de50d4805cf385fe540 parameters: - name: city in: query required: true schema: type: string - name: state in: query required: false schema: type: string responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppSignalReadingSchema' /app/support/beta: post: tags: - App/Support operationId: appSupportBeta requestBody: required: true content: application/json: schema: required: - feature properties: feature: type: string type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/support/bug: post: tags: - App/Support operationId: appSupportBug requestBody: required: true content: application/json: schema: required: - description properties: description: type: string type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/support/contact: post: tags: - App/Support operationId: appSupportContact requestBody: required: true content: application/json: schema: required: - name - email - message properties: name: type: string email: type: string message: type: string type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /app/support/sales: post: tags: - App/Support operationId: appSupportSales requestBody: required: true content: application/json: schema: required: - subscriptionId - companyEmail - message properties: subscriptionId: type: integer companyEmail: type: string message: type: string type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/support: post: tags: - App/Support operationId: appSupport requestBody: required: true content: application/json: schema: required: - message properties: message: type: string type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /app/yelp/ads-jobs/manual: post: tags: - App Yelp summary: Enqueue a manual guarded Yelp ads job (pause/resume/edit budget) operationId: 87a8e2fc068a01b14ca946663945073f requestBody: required: true content: application/json: schema: required: - programRef - action properties: programRef: type: string action: type: string enum: - pause - resume - edit_budget direction: type: string enum: - increase - decrease deltaPct: type: integer type: object responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpAdsJobSchema' /app/yelp/ads-jobs: get: tags: - App Yelp summary: List guarded Yelp ads jobs for the current user operationId: 93361097964ed54685cf6995e1f8693f parameters: - name: businessId in: query required: false schema: type: string - name: programRef in: query required: false schema: type: string - name: status in: query required: false schema: type: string - name: limit in: query required: false schema: type: integer responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpAdsJobSchema' /app/yelp/autoresponders/runs/build: post: tags: - App Yelp summary: Build a local Yelp autoresponder reply queue from synced leads operationId: ccee741c8bbc30958794d6eb13ccf59f responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpAutoresponderRunSchema' /app/yelp/autoresponders/check-status: post: tags: - App Yelp summary: Refresh local Yelp autoresponder status from synced rows operationId: aa2c0af5abf4c029443b22adcfb56d96 responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpAutoresponderSchema' /app/yelp/autoresponders/{businessId}/messages/{messageId}: delete: tags: - App Yelp summary: Delete a local Yelp autoresponder response-flow message operationId: 37787a868dbb00c7ad4eaa83ee3223d3 responses: '204': description: No Content patch: tags: - App Yelp summary: Update a local Yelp autoresponder response-flow message operationId: 5a02874e694cb5ec2ce2cb6faccea1f5 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpAutoresponderMessageSchema' /app/yelp/autoresponders/{businessId}/messages: get: tags: - App Yelp summary: List local Yelp autoresponder response-flow messages operationId: 9a4691d8ca51168cfd3c2b186b0d1528 responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpAutoresponderMessageSchema' post: tags: - App Yelp summary: Create a local Yelp autoresponder response-flow message operationId: e72aba2c38e7af3d587a2a41932c561c responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpAutoresponderMessageSchema' /app/yelp/autoresponders: get: tags: - App Yelp summary: List local Yelp autoresponder configurations operationId: e934e579f8bfe2a64b031d9ef810835f responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpAutoresponderSchema' post: tags: - App Yelp summary: Create a local Yelp autoresponder configuration operationId: ebf1b7b3e8851d51d81c766dca7cfb48 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpAutoresponderSchema' /app/yelp/autoresponders/runs: get: tags: - App Yelp summary: List local Yelp autoresponder queue runs operationId: 3940ff7c46484278c47889d3cf6a67dd responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpAutoresponderRunSchema' /app/yelp/autoresponders/runs/{runId}/send: post: tags: - App Yelp summary: Attempt to send an approved Yelp AI reply through the guarded outbound gateway operationId: 552a77744799ac6cae012edcb03f1183 parameters: - name: runId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpAutoresponderRunSchema' /app/yelp/autoresponders/runs/{runId}: patch: tags: - App Yelp summary: Approve or reject a local Yelp autoresponder run operationId: 49aca5f15c0b1d22c9b48246d2792540 parameters: - name: runId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpAutoresponderRunSchema' /app/yelp/autoresponders/{businessId}: patch: tags: - App Yelp summary: Update a local Yelp autoresponder configuration operationId: 9cdfe4982af3c6a7e9d45c3f013663e3 parameters: - name: businessId in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpAutoresponderSchema' /app/yelp/businesses/{businessRef}/profile: put: tags: - App Yelp summary: Update the editable AI business profile operationId: a84c16ea96c1b0cc81b900e360d5c4e0 parameters: - name: businessRef in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpBusinessSchema' /app/yelp/businesses: get: tags: - App Yelp summary: List Yelp businesses synced for the current user operationId: d18ce74a465956e45c007b8981ee6629 parameters: - name: q in: query required: false schema: type: string - name: status in: query required: false schema: type: string responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpBusinessSchema' /app/yelp/businesses/{businessRef}/signal-settings: get: tags: - App Yelp summary: List signal eligibility settings for a Yelp business operationId: 4d8b164d24c20e418c08fbbdd235f5d5 parameters: - name: businessRef in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpBusinessSignalSettingSchema' /app/yelp/businesses/{businessRef}/signal-settings/{signal}: put: tags: - App Yelp summary: Update one signal eligibility setting for a Yelp business operationId: eaa5519d341275e6aad70f99e4bc1095 parameters: - name: businessRef in: path required: true schema: type: string - name: signal in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpBusinessSignalSettingSchema' /app/yelp/businesses/{businessRef}: get: tags: - App Yelp summary: View a synced Yelp business operationId: 2b56d5bce97b82d148ba1be79d3b2410 parameters: - name: businessRef in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpBusinessSchema' /app/yelp/connection: get: tags: - App Yelp summary: View the current user's Yelp Partner connection operationId: 31452efe96c7bfeecf72d13ab99ebacb responses: '200': description: OK put: tags: - App Yelp summary: Create or update the current user's Yelp Partner connection operationId: fea28f05944c841001d6611b02043301 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpConnectionSchema' delete: tags: - App Yelp summary: Delete the current user's Yelp Partner connection operationId: 722d186d7cd38b8f28cdbf2a7d07e34a responses: '204': description: No Content /app/yelp/connection/test: post: tags: - App Yelp summary: Validate the stored Yelp partner credentials against the Partner API operationId: 14a434b2ed966dc7289ee6b0864f3337 responses: '200': description: OK /app/yelp/leads: get: tags: - App Yelp summary: List synced Yelp leads for the current user operationId: bfebb54edfd97bd47c0aef794c9307d3 parameters: - name: businessId in: query required: false schema: type: string - name: status in: query required: false schema: type: string - name: limit in: query required: false schema: type: integer responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpLeadSchema' /app/yelp/leads/{leadId}/reply-draft: post: tags: - App Yelp summary: Generate a guarded AI reply draft for a synced Yelp lead operationId: 7172e519476825ed8f04e76993d08d14 parameters: - name: leadId in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpLeadSchema' /app/yelp/programs: get: tags: - App Yelp summary: List Yelp advertising programs synced for the current user operationId: 1a7c641667c9959a035781d6bf708ba7 parameters: - name: businessId in: query required: false schema: type: string - name: status in: query required: false schema: type: string responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpProgramSchema' /app/yelp/reporting: get: tags: - App Yelp summary: View aggregated synced Yelp reporting metrics operationId: c69aa2a2d91077e38abba5dde0fd5e89 parameters: - name: businessId in: query required: false schema: type: string - name: from in: query required: false schema: type: string format: date - name: to in: query required: false schema: type: string format: date responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpReportingSchema' /app/yelp/sync-runs: get: tags: - App Yelp summary: List Yelp sync/import runs for the current user operationId: fe2e1cadf35748e63a49477cbef7f6fd parameters: - name: status in: query required: false schema: type: string - name: type in: query required: false schema: type: string - name: source in: query required: false schema: type: string - name: limit in: query required: false schema: type: integer responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/AppYelpSyncRunSchema' /app/yelp/reporting/poll: post: tags: - App Yelp summary: Poll outstanding Yelp report requests and import ready ones operationId: 4dafd96fc7ba7be5e11747fae649862b responses: '200': description: OK /app/yelp/reporting/request: post: tags: - App Yelp summary: Request a Yelp daily metrics report (async) operationId: 645e20a5c5ceefb632bcff1faf1d72b5 responses: '200': description: OK /app/yelp/sync: post: tags: - App Yelp summary: Pull live businesses + programs from the Yelp Partner API operationId: 3ebada6ee2d7944c984d3868d728448a responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppYelpSyncRunSchema' /operations/admin: get: tags: - Operations/Admin operationId: operationsAdminQuery parameters: - name: q in: query schema: type: string nullable: true - name: permissions in: query schema: type: array items: type: string enum: - MANAGE_USERS - MANAGE_BILLING_SUBSCRIPTIONS - MANAGE_CAMPAIGNS - MANAGE_ADMINS nullable: true - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/OperationsAdminSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' post: tags: - Operations/Admin operationId: operationsAdminCreate requestBody: required: true content: application/json: schema: required: - email - name - permissions properties: email: type: string name: type: string permissions: type: array items: type: string enum: - MANAGE_USERS - MANAGE_BILLING_SUBSCRIPTIONS - MANAGE_CAMPAIGNS - MANAGE_ADMINS type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/admin/{adminId}: get: tags: - Operations/Admin operationId: operationsAdminView parameters: - name: adminId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsAdminSchema' type: object '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' put: tags: - Operations/Admin operationId: operationsAdminUpdate parameters: - name: adminId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - name - permissions properties: name: type: string permissions: type: array items: type: string enum: - MANAGE_USERS - MANAGE_BILLING_SUBSCRIPTIONS - MANAGE_CAMPAIGNS - MANAGE_ADMINS type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' delete: tags: - Operations/Admin operationId: operationsAdminDelete parameters: - name: adminId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/admin/{adminId}/reset: post: tags: - Operations/Admin operationId: operationsAdminReset parameters: - name: adminId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/auth/gateway: post: tags: - Operations/Auth/Gateway operationId: operationsAuthGateway requestBody: required: true content: application/json: schema: required: - email - password properties: email: type: string password: type: string otp: type: string nullable: true otpRecoveryCode: type: string nullable: true type: object responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '400': description: Authentication error content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/auth/gateway/refresh: post: tags: - Operations/Auth/Gateway operationId: operationsAuthGatewayRefresh responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsAuthGatewayTokenSchema' type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /operations/auth/gateway/revoke: post: tags: - Operations/Auth/Gateway operationId: operationsAuthGatewayRevoke responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /operations/auth/profile: get: tags: - Operations/Auth/Profile operationId: operationsAuthProfile responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsAuthProfileSchema' type: object '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /operations/billing/subscription: get: tags: - Operations/Billing/Subscription operationId: operationsBillingSubscriptionQuery parameters: - name: legacy in: query schema: type: integer enum: - 0 - 1 nullable: true - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/OperationsBillingSubscriptionSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' post: tags: - Operations/Billing/Subscription operationId: operationsBillingSubscriptionCreate requestBody: required: true content: application/json: schema: required: - plan - description - features - featured - stripePriceId - annual - amount - sales - legacy properties: plan: type: string enum: - STARTUP - BUSINESS - PROFESSIONAL description: type: string features: type: array items: type: string featured: type: boolean stripePriceId: type: string annual: type: boolean amount: type: number trial: type: number nullable: true sales: type: boolean legacy: type: boolean type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/billing/subscription/{subscriptionId}: get: tags: - Operations/Billing/Subscription operationId: operationsBillingSubscriptionView parameters: - name: subscriptionId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsBillingSubscriptionSchema' type: object '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' put: tags: - Operations/Billing/Subscription operationId: operationsBillingSubscriptionUpdate parameters: - name: subscriptionId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - plan - description - features - featured - stripePriceId - annual - amount - sales - legacy properties: plan: type: string enum: - STARTUP - BUSINESS - PROFESSIONAL description: type: string features: type: array items: type: string featured: type: boolean stripePriceId: type: string annual: type: boolean amount: type: number trial: type: number nullable: true sales: type: boolean legacy: type: boolean type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' delete: tags: - Operations/Billing/Subscription operationId: operationsBillingSubscriptionDelete parameters: - name: subscriptionId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/campaign: get: tags: - Operations/Campaign operationId: operationsCampaignQuery parameters: - name: q in: query schema: type: string nullable: true - name: adminId in: query schema: type: integer nullable: true - name: status in: query schema: type: string enum: - ACCESS_PENDING_REQUEST - ACCESS_PENDING_GRANT - ACTIVE - PAUSED nullable: true - name: orderBy in: query schema: type: string enum: - lastManagedAt - createdAt nullable: true - name: order in: query schema: type: string enum: - ASC - DESC nullable: true - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/OperationsCampaignSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] /operations/campaign/{campaignId}: get: tags: - Operations/Campaign operationId: operationsCampaignView parameters: - name: campaignId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsCampaignSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] put: tags: - Operations/Campaign operationId: operationsCampaignUpdate parameters: - name: campaignId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - name - status - analyzing properties: adminId: type: integer nullable: true name: type: string status: type: string enum: - ACCESS_PENDING_REQUEST - ACCESS_PENDING_GRANT - ACTIVE - PAUSED analyzing: type: boolean type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/campaign/log: get: tags: - Operations/Campaign/Log operationId: operationsCampaignLogQuery parameters: - name: campaignId in: query schema: type: integer - name: taskId in: query schema: type: integer - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/OperationsCampaignLogSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] post: tags: - Operations/Campaign/Log operationId: operationsCampaignLogCreate requestBody: required: true content: application/json: schema: required: - taskId - message - createdAt properties: taskId: type: integer message: type: string createdAt: type: string format: date-time type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/campaign/log/{logId}: get: tags: - Operations/Campaign/Log operationId: operationsCampaignLogView parameters: - name: logId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsCampaignLogSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] put: tags: - Operations/Campaign/Log operationId: operationsCampaignLogUpdate parameters: - name: logId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - taskId - message - createdAt properties: taskId: type: integer message: type: string createdAt: type: string format: date-time type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' delete: tags: - Operations/Campaign/Log operationId: operationsCampaignLogDelete parameters: - name: logId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/campaign/task: get: tags: - Operations/Campaign/Task operationId: operationsCampaignTaskQuery parameters: - name: campaignId in: query schema: type: integer - name: parentId in: query schema: type: integer - name: q in: query schema: type: string - name: status in: query schema: type: string enum: - DRAFT - RECOMMENDATION - BLOCKED - PENDING - PROCESSING - DONE - GOAL - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/OperationsCampaignTaskSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] post: tags: - Operations/Campaign/Task operationId: operationsCampaignTaskCreate requestBody: required: true content: application/json: schema: required: - campaignId - title - status - order properties: campaignId: type: integer parentId: type: integer nullable: true title: type: string description: type: string nullable: true status: type: string enum: - DRAFT - RECOMMENDATION - BLOCKED - PENDING - PROCESSING - DONE - GOAL startedAt: type: string format: date-time nullable: true finishedAt: type: string format: date-time nullable: true order: type: integer type: object responses: '201': description: Successful content: application/json: schema: $ref: '#/components/schemas/IdSchema' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/campaign/task/{taskId}: get: tags: - Operations/Campaign/Task operationId: operationsCampaignTaskView parameters: - name: taskId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsCampaignTaskSchema' type: object '403': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' security: - token: [] put: tags: - Operations/Campaign/Task operationId: operationsCampaignTaskUpdate parameters: - name: taskId in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: required: - campaignId - title - status - order properties: campaignId: type: integer parentId: type: integer nullable: true title: type: string description: type: string nullable: true status: type: string enum: - DRAFT - RECOMMENDATION - BLOCKED - PENDING - PROCESSING - DONE - GOAL startedAt: type: string format: date-time nullable: true finishedAt: type: string format: date-time nullable: true order: type: integer type: object responses: '204': description: Successful '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' delete: tags: - Operations/Campaign/Task operationId: operationsCampaignTaskDelete parameters: - name: taskId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/user/{userId}: get: tags: - Operations/User operationId: operationsUserView parameters: - name: userId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsUserSchema' type: object '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' delete: tags: - Operations/User operationId: operationsUserDelete parameters: - name: userId in: path required: true schema: type: integer responses: '204': description: Successful '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/user/{userId}/impersonate: post: tags: - Operations/User operationId: operationsUserImpersonate parameters: - name: userId in: path required: true schema: type: integer responses: '200': description: Successful content: application/json: schema: required: - data properties: data: $ref: '#/components/schemas/OperationsUserTokenSchema' type: object '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' /operations/user: get: tags: - Operations/User operationId: operationsUserQuery parameters: - name: q in: query schema: type: string nullable: true - name: perPage in: query schema: type: integer - name: cursor in: query schema: type: string responses: '200': description: Successful content: application/json: schema: required: - items - perPage - next - previous properties: items: type: array items: $ref: '#/components/schemas/OperationsUserSchema' perPage: type: integer previous: type: string nullable: true next: type: string nullable: true type: object '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ErrorBagSchema' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' '401': description: Unauthenticated content: application/json: schema: $ref: '#/components/schemas/ErrorSchema' components: schemas: ErrorBagSchema: required: - errors properties: errors: type: object additionalProperties: type: array items: type: string type: object ErrorListSchema: required: - errors properties: errors: type: array items: $ref: '#/components/schemas/ErrorSchema' type: object ErrorSchema: required: - errors properties: error: type: string message: type: string nullable: true type: object IdSchema: required: - id properties: id: type: integer type: object AppAnalyzeGoogleAdsAuditSchema: required: - id - name - linkingId - linkingCustomerId - linkingName - campaignId - status - auditedAt - results properties: id: type: integer linkingId: type: integer linkingCustomerId: type: integer linkingName: type: string campaignId: type: integer campaignName: type: string nullable: true status: type: string enum: - QUEUED - PROCESSING - SUCCESSFUL scope: type: string enum: - CAMPAIGN - SEARCH_ADS - SEARCH_KEYWORDS - SEARCH_TERMS - P_MAX auditedAt: type: string nullable: true results: type: array items: $ref: '#/components/schemas/AppAnalyzeGoogleAdsAuditResultSchema' type: object AppAnalyzeGoogleAdsAuditResultSchema: required: - id - status - title - description - scoreValue - scoreMaxValue - category - details properties: id: type: integer status: type: string enum: - PASSED - FAILED - WARNING - ERROR title: type: string description: type: string nullable: true scoreValue: type: integer scoreMaxValue: type: integer category: type: string nullable: true summary: type: string nullable: true details: type: array items: type: object additionalProperties: {} nullable: true type: object AppAnalyzeGoogleAdsHealthAccountSchema: required: - campaignCount - hasConversionValue - totals properties: campaignCount: type: integer hasConversionValue: type: boolean totals: $ref: '#/components/schemas/AppAnalyzeGoogleAdsHealthMetricsSchema' type: object AppAnalyzeGoogleAdsHealthCampaignSchema: required: - campaignId - campaignName - goalType - status - trend - score - topIssue - current - previous - deltas - flags properties: campaignId: type: integer campaignName: type: string goalType: type: string enum: - LEADGEN - ECOMMERCE status: type: string enum: - GOOD - STABLE - NEEDS_ATTENTION - ISSUE - INSUFFICIENT_DATA trend: type: string enum: - IMPROVING - STABLE - DECLINING - INSUFFICIENT_DATA score: type: integer nullable: true topIssue: type: string nullable: true current: $ref: '#/components/schemas/AppAnalyzeGoogleAdsHealthMetricsSchema' previous: $ref: '#/components/schemas/AppAnalyzeGoogleAdsHealthMetricsSchema' deltas: $ref: '#/components/schemas/AppAnalyzeGoogleAdsHealthDeltasSchema' flags: type: array items: $ref: '#/components/schemas/AppAnalyzeGoogleAdsHealthFlagSchema' type: object AppAnalyzeGoogleAdsHealthDeltasSchema: description: 'Signed fractional change vs the previous period (0.25 = +25%). Any field may be null when the previous period had no comparable base.' required: - cost - conversions - conversionValue - cpa - roas - convRate - ctr - cpc properties: cost: type: number format: float nullable: true conversions: type: number format: float nullable: true conversionValue: type: number format: float nullable: true cpa: type: number format: float nullable: true roas: type: number format: float nullable: true convRate: type: number format: float nullable: true ctr: type: number format: float nullable: true cpc: type: number format: float nullable: true type: object AppAnalyzeGoogleAdsHealthFlagSchema: required: - level - area - message properties: level: type: string enum: - GREEN - YELLOW - RED - INSUFFICIENT_DATA area: type: string message: type: string type: object AppAnalyzeGoogleAdsHealthReportSchema: required: - linkingId - linkingCustomerId - linkingName - periodDays - account - campaigns properties: linkingId: type: integer linkingCustomerId: type: integer linkingName: type: string periodDays: type: integer account: $ref: '#/components/schemas/AppAnalyzeGoogleAdsHealthAccountSchema' campaigns: type: array items: $ref: '#/components/schemas/AppAnalyzeGoogleAdsHealthCampaignSchema' type: object AppAnalyzeGoogleAdsHealthMetricsSchema: required: - cost - clicks - impressions - conversions - conversionValue - cpa - roas - ctr - cpc - convRate properties: cost: type: number format: float clicks: type: integer impressions: type: integer conversions: type: number format: float conversionValue: type: number format: float cpa: type: number format: float roas: type: number format: float ctr: type: number format: float cpc: type: number format: float convRate: type: number format: float type: object AppAnalyzeGoogleAdsReportingEditorResponseSchema: required: - delete - update - create properties: delete: type: array items: type: integer update: type: array items: type: integer create: type: array items: type: integer type: object AppAnalyzeGoogleAdsReportingRowSchema: type: object additionalProperties: {} AppAuthGatewayTokenSchema: required: - userId - accessToken properties: userId: type: integer accessToken: type: string type: object AppAuthProfileSchema: required: - id - hasPassword - hasGoogle - hasFacebook - hasStripeCustomer - hasStripeSubscription - tfaEnabled - email - emailVerified - name - position - spend - goal - subscriptionPlan - subscriptionStatus - subscriptionExpiresAt - subscriptionAnnual - subscriptionSkipped properties: id: type: integer hasPassword: type: boolean hasGoogle: type: boolean hasFacebook: type: boolean hasStripeCustomer: type: boolean hasStripeSubscription: type: boolean tfaEnabled: type: boolean email: type: string nullable: true emailVerified: type: boolean name: type: string nullable: true position: type: string nullable: true spend: type: string nullable: true goal: type: string nullable: true subscriptionPlan: type: string enum: - FREE - STARTUP - BUSINESS - PROFESSIONAL subscriptionStatus: type: string enum: - TRIAL - ACTIVE - CANCELLED subscriptionExpiresAt: type: string format: date-time nullable: true subscriptionAnnual: type: boolean nullable: true subscriptionSkipped: type: boolean type: object AppAuthTfaCredentialsSchema: required: - qr - secretKey - recoveryCodes properties: qr: type: string secretKey: type: string recoveryCodes: type: array items: type: string type: object AppAuthTrustedDeviceSchema: required: - id - userId - userAgent - validTo - ip properties: id: type: integer userId: type: integer userAgent: type: string nullable: true ip: type: string nullable: true validTo: type: string format: date-time type: object AppAutomationConfigFieldSchema: required: - label - value - filledByAi properties: label: type: string value: type: string filledByAi: type: boolean type: object AppAutomationRunSchema: required: - id - automationId - businessId - automationTitle - status - signal - signalStatus - signalLabel - locationLabel - recommendationId - recommendationCount - skipReason - startedAt - finishedAt properties: id: type: integer automationId: type: integer nullable: true businessId: type: string nullable: true automationTitle: type: string nullable: true status: type: string signal: type: string nullable: true signalStatus: type: string nullable: true signalLabel: type: string nullable: true locationLabel: type: string nullable: true recommendationId: type: integer nullable: true recommendationCount: type: integer skipReason: type: string nullable: true startedAt: type: string nullable: true finishedAt: type: string nullable: true type: object AppAutomationSchema: required: - id - businessId - title - summary - signal - trigger - direction - deltaPct - target - scope - channels - guardrails - confidence - status - createdAt properties: id: type: integer businessId: type: string nullable: true title: type: string summary: type: string nullable: true signal: type: string trigger: type: string nullable: true direction: type: string deltaPct: type: integer target: type: string nullable: true scope: type: string nullable: true channels: type: array items: type: string guardrails: type: string nullable: true confidence: type: string status: type: string createdAt: type: string nullable: true type: object AppAutomationSpecSchema: required: - id - intentText - title - summary - signal - signalLabel - trigger - direction - deltaPct - target - scope - channels - guardrails - requiredConfig - confidence properties: id: type: string intentText: type: string title: type: string summary: type: string signal: type: string signalLabel: type: string trigger: type: string direction: type: string deltaPct: type: integer target: type: string scope: type: string channels: type: array items: type: string guardrails: type: string requiredConfig: type: array items: $ref: '#/components/schemas/AppAutomationConfigFieldSchema' confidence: type: string type: object AppBillingSubscriptionCheckoutSchema: required: - uri properties: uri: type: string nullable: true type: object AppBillingSubscriptionSessionSchema: required: - uri properties: uri: type: string type: object AppBillingSubscriptionSchema: required: - id - plan - description - features - featured - amount - annual - trial - sales properties: id: type: integer plan: type: string enum: - STARTUP - BUSINESS - PROFESSIONAL description: type: string features: type: array items: type: string featured: type: boolean amount: type: number format: float annual: type: boolean trial: type: integer nullable: true sales: type: boolean type: object AppCampaignSchema: required: - id - name - channel - status - analyzing properties: id: type: integer name: type: string channel: type: string enum: - GOOGLE_ADS status: type: string enum: - ACCESS_PENDING_REQUEST - ACCESS_PENDING_GRANT - ACTIVE - PAUSED analyzing: type: boolean type: object AppCampaignActivityLogSchema: required: - id - message - createdAt properties: id: type: integer message: type: string createdAt: type: string format: date-time type: object AppCampaignActivitySubtaskSchema: required: - id - title - description - status - startedAt - finishedAt - logs properties: id: type: integer title: type: string description: type: string nullable: true status: type: string enum: - DRAFT - RECOMMENDATION - BLOCKED - PENDING - PROCESSING - DONE - GOAL startedAt: type: string format: date-time nullable: true finishedAt: type: string format: date-time nullable: true logs: type: array items: $ref: '#/components/schemas/AppCampaignActivityLogSchema' type: object AppCampaignActivityTaskSchema: required: - id - campaignId - parentId - title - description - status - startedAt - finishedAt - logs - subtasks properties: id: type: integer title: type: string description: type: string nullable: true status: type: string enum: - DRAFT - RECOMMENDATION - BLOCKED - PENDING - PROCESSING - DONE - GOAL startedAt: type: string format: date-time nullable: true finishedAt: type: string format: date-time nullable: true logs: type: array items: $ref: '#/components/schemas/AppCampaignActivityLogSchema' subtasks: type: array items: $ref: '#/components/schemas/AppCampaignActivitySubtaskSchema' type: object AppCampaignGoogleAdsMetricsReportSchema: required: - unit - currencyCode - metrics - summary properties: unit: type: string currencyCode: type: string metrics: type: array items: $ref: '#/components/schemas/AppCampaignGoogleAdsMetricsSchema' summary: $ref: '#/components/schemas/AppCampaignGoogleAdsMetricsSummarySchema' type: object AppCampaignGoogleAdsMetricsSchema: required: - date - costMicros - clicks - conversions - costPerConversion properties: date: type: string format: date costMicros: type: integer clicks: type: integer conversions: type: number format: float costPerConversion: type: number format: float type: object AppCampaignGoogleAdsMetricsSummarySchema: required: - costMicros - clicks - conversions - costPerConversion properties: costMicros: type: integer clicks: type: integer conversions: type: number format: float costPerConversion: type: number format: float type: object AppCreateGoogleAdsKeywordPlannerKeywordSchema: required: - id - text - lowTopOfPageBid - highTopOfPageBid - competition - avgMonthlySearches - score - selected properties: id: type: integer text: type: string lowTopOfPageBid: type: integer nullable: true highTopOfPageBid: type: integer nullable: true competition: type: integer nullable: true avgMonthlySearches: type: integer nullable: true score: type: integer nullable: true selected: type: boolean type: object AppCreateGoogleAdsKeywordPlannerSchema: required: - id - url - language - locations - keywordSeed - prompt - status - keywords properties: id: type: integer url: type: string language: type: integer nullable: true locations: type: array items: type: integer keywordSeed: type: array items: type: string prompt: type: string nullable: true status: type: string enum: - QUEUED - PROCESSING - SUCCESSFUL - FAILED keywords: type: array items: $ref: '#/components/schemas/AppCreateGoogleAdsKeywordPlannerKeywordSchema' type: object AppCreateGoogleAdsRsaBuilderSchema: required: - id - url - prompt - status - headlines - descriptions properties: id: type: integer url: type: string prompt: type: string nullable: true status: type: string enum: - QUEUED - PROCESSING - SUCCESSFUL headlines: type: array items: type: string descriptions: type: array items: type: string type: object AppCreateGoogleAdsSearchCreationDraftKeywordSchema: required: - id - text - lowTopOfPageBid - highTopOfPageBid - competition - avgMonthlySearches - score - selected properties: id: type: integer text: type: string lowTopOfPageBid: type: integer nullable: true highTopOfPageBid: type: integer nullable: true competition: type: integer nullable: true avgMonthlySearches: type: integer nullable: true score: type: integer nullable: true selected: type: boolean type: object AppCreateGoogleAdsSearchCreationDraftSchema: required: - id - linkingId - linkingName - linkingCurrencyCode - campaignId - status - url - prompt - languages - locations - headlines - descriptions - headlineSuggestions - descriptionSuggestions - keywords - budgetAmount properties: id: type: integer linkingId: type: integer nullable: true linkingName: type: string nullable: true linkingCurrencyCode: type: string nullable: true campaignId: type: integer nullable: true status: type: string enum: - IDLE - BUILD_QUEUED - BUILD_PROCESSING - PUBLISH_QUEUED - PUBLISH_PROCESSING - PUBLISHED - PARTIALLY_PUBLISHED url: type: string nullable: true prompt: type: string nullable: true languages: type: array items: type: integer locations: type: array items: type: integer headlines: type: array items: type: string descriptions: type: array items: type: string headlineSuggestions: type: array items: type: string descriptionSuggestions: type: array items: type: string keywords: type: array items: $ref: '#/components/schemas/AppCreateGoogleAdsSearchCreationDraftKeywordSchema' budgetAmount: type: integer nullable: true type: object AppCreateGoogleAdsSearchCreationStatusSchema: required: - status properties: status: type: string enum: - IDLE - BUILD_QUEUED - BUILD_PROCESSING - PUBLISH_QUEUED - PUBLISH_PROCESSING - PUBLISHED - PARTIALLY_PUBLISHED type: object AppCreateGoogleAdsSitelinkBuilderSchema: required: - id - url - status - sitelinks properties: id: type: integer url: type: string status: type: string enum: - QUEUED - PROCESSING - SUCCESSFUL sitelinks: type: array items: $ref: '#/components/schemas/AppCreateGoogleAdsSitelinkBuilderSitelinkSchema' type: object AppCreateGoogleAdsSitelinkBuilderSitelinkSchema: required: - id - finalUrl - linkText - description1 - description2 properties: id: type: integer finalUrl: type: string linkText: type: string description1: type: string nullable: true description2: type: string nullable: true type: object AppLinkingGoogleAdsHierarchySchema: required: - id - name - customerId - readableCustomerId - loginCustomerId - currencyCode - descriptiveName - isManager - children properties: id: type: integer name: type: string customerId: type: integer readableCustomerId: type: string loginCustomerId: type: integer nullable: true currencyCode: type: string nullable: true descriptiveName: type: string nullable: true isManager: type: boolean children: type: array items: $ref: '#/components/schemas/AppLinkingGoogleAdsHierarchySchema' type: object AppLinkingGoogleAdsSchema: required: - id - name - customerId - readableCustomerId - loginCustomerId - currencyCode - descriptiveName - isManager properties: id: type: integer name: type: string customerId: type: integer readableCustomerId: type: string loginCustomerId: type: integer nullable: true currencyCode: type: string nullable: true descriptiveName: type: string nullable: true isManager: type: boolean type: object AppLinkingMerchantCenterSchema: required: - id - merchantCenterId - aggregatorId - name - websiteUrl properties: id: type: integer merchantCenterId: type: integer aggregatorId: type: integer nullable: true name: type: string nullable: true websiteUrl: type: string nullable: true type: object AppLinkingMetaAccountSchema: required: - id - externalId - accountId - name - currency - timezoneName - accountStatus - selected properties: id: type: integer externalId: type: string accountId: type: string name: type: string nullable: true currency: type: string nullable: true timezoneName: type: string nullable: true accountStatus: type: integer nullable: true selected: type: boolean type: object AppLinkingMetaSchema: required: - id - externalUserId - name - status - scopes - accountsCount - selectedAccount properties: id: type: integer externalUserId: type: string nullable: true name: type: string nullable: true status: type: string scopes: type: array items: type: string accountsCount: type: integer selectedAccount: oneOf: - $ref: '#/components/schemas/AppLinkingMetaAccountSchema' nullable: true type: object AppLookupGoogleAdsCampaignSchema: required: - id - name - status properties: id: type: integer name: type: string status: type: integer type: object AppLookupGoogleAdsGeoTargetConstantSchema: required: - id - resourceName - name - canonicalName - countryCode - targetType properties: id: type: integer resourceName: type: string name: type: string canonicalName: type: string countryCode: type: string targetType: type: string type: object AppLookupGoogleAdsLanguageConstantSchema: required: - id - code - name properties: id: type: integer code: type: string name: type: string type: object AppRecommendationSchema: required: - id - businessId - businessName - domain - title - rationale - direction - deltaPct - service - confidence - status - source - createdAt - acceptedAt - dismissedAt - outcomeCheckedAt - outcomeWindowDays - outcomeMetrics - yelpAdsJobId - yelpAdsJobStatus - yelpAdsJobProgramRef - yelpAdsJobMessage properties: id: type: integer businessId: type: string nullable: true businessName: type: string nullable: true domain: type: string title: type: string rationale: type: string direction: type: string deltaPct: type: integer nullable: true service: type: string nullable: true confidence: type: string status: type: string source: type: string createdAt: type: string nullable: true acceptedAt: type: string nullable: true dismissedAt: type: string nullable: true outcomeCheckedAt: type: string nullable: true outcomeWindowDays: type: integer nullable: true outcomeMetrics: type: object nullable: true yelpAdsJobId: type: integer nullable: true yelpAdsJobStatus: type: string nullable: true yelpAdsJobProgramRef: type: string nullable: true yelpAdsJobMessage: type: string nullable: true type: object AppSignalReadingSchema: required: - connectorId - label - value - status - cost - detail - error properties: connectorId: type: string label: type: string value: type: number format: float nullable: true status: type: string cost: type: string detail: type: string nullable: true error: type: boolean type: object AppYelpAdsJobSchema: required: - id - recommendationId - recommendationTitle - businessId - businessName - programRef - action - status - requestedDirection - requestedDeltaPct - currentBudgetCents - targetBudgetCents - guardrailsPassed - partnerWriteEnabled - blockReason - message - submittedAt - checkedAt - completedAt - createdAt properties: id: type: integer recommendationId: type: integer nullable: true recommendationTitle: type: string nullable: true businessId: type: string nullable: true businessName: type: string nullable: true programRef: type: string nullable: true action: type: string status: type: string requestedDirection: type: string nullable: true requestedDeltaPct: type: integer nullable: true currentBudgetCents: type: integer nullable: true targetBudgetCents: type: integer nullable: true guardrailsPassed: type: boolean nullable: true partnerWriteEnabled: type: boolean nullable: true blockReason: type: string nullable: true message: type: string nullable: true submittedAt: type: string nullable: true checkedAt: type: string nullable: true completedAt: type: string nullable: true createdAt: type: string nullable: true type: object AppYelpAutoresponderMessageSchema: required: - id - autoresponderId - businessId - flow - position - delaySeconds - body - enabled - onlyIfNoReply - reviewRequired - businessHoursOnly - createdAt - updatedAt properties: id: type: integer autoresponderId: type: integer nullable: true businessId: type: string flow: type: string position: type: integer delaySeconds: type: integer body: type: string enabled: type: boolean onlyIfNoReply: type: boolean reviewRequired: type: boolean businessHoursOnly: type: boolean createdAt: type: string nullable: true updatedAt: type: string nullable: true type: object AppYelpAutoresponderRunSchema: required: - id - autoresponderId - leadId - businessId - businessName - consumer - leadStatus - status - skipReason - message - sendEnabled - replyDraftId - replyDraftStatus - replyDraftBody - replyDraftMessage - eligibleAt - delayMinutes - waitingSeconds - queuedAt - approvedAt - rejectedAt - sentAt properties: id: type: integer autoresponderId: type: integer nullable: true leadId: type: string businessId: type: string nullable: true businessName: type: string nullable: true consumer: type: string nullable: true leadStatus: type: string nullable: true status: type: string skipReason: type: string nullable: true message: type: string nullable: true sendEnabled: type: boolean replyDraftId: type: integer nullable: true replyDraftStatus: type: string nullable: true replyDraftBody: type: string nullable: true replyDraftMessage: type: string nullable: true eligibleAt: type: string nullable: true delayMinutes: type: integer nullable: true waitingSeconds: type: integer nullable: true queuedAt: type: string nullable: true approvedAt: type: string nullable: true rejectedAt: type: string nullable: true sentAt: type: string nullable: true type: object AppYelpAutoresponderSchema: required: - id - businessId - businessName - status - connectionStatus - sendEnabled - tone - firstMessageBody - sequenceMessages - sequenceSize - stopwords - notifyNewLead - notifyDraftReady - notificationEmail - offHoursEnabled - timezone - businessHours - conversationsCount - message - activatedAt - deactivatedAt - lastCheckedAt properties: id: type: integer businessId: type: string businessName: type: string nullable: true status: type: string connectionStatus: type: string sendEnabled: type: boolean tone: type: string firstMessageBody: type: string nullable: true sequenceMessages: type: array items: type: string sequenceSize: type: integer stopwords: type: array items: type: string notifyNewLead: type: boolean notifyDraftReady: type: boolean notificationEmail: type: string nullable: true offHoursEnabled: type: boolean timezone: type: string nullable: true businessHours: type: object conversationsCount: type: integer message: type: string nullable: true activatedAt: type: string nullable: true deactivatedAt: type: string nullable: true lastCheckedAt: type: string nullable: true type: object AppYelpBusinessSchema: required: - id - yelpBusinessId - partnerBusinessId - name - city - state - rating - reviewCount - status - activePrograms - spendMtdCents - leadsMtd - lastSyncedAt - serviceTags - categories - addressLines - phone - yelpUrl - imageUrl - vertical - verticalLabel - verticalSource - aiProfileSummary - aiServiceFocus - aiDemandTriggers - aiRecommendedSignals - aiCustomerIntentNotes - aiProfileSource - aiProfileGeneratedAt properties: id: type: string yelpBusinessId: type: string nullable: true partnerBusinessId: type: string nullable: true name: type: string city: type: string nullable: true state: type: string nullable: true rating: type: number format: float nullable: true reviewCount: type: integer status: type: string activePrograms: type: integer spendMtdCents: type: integer leadsMtd: type: integer lastSyncedAt: type: string nullable: true serviceTags: type: array items: type: string categories: type: array items: type: string addressLines: type: array items: type: string phone: type: string nullable: true yelpUrl: type: string nullable: true imageUrl: type: string nullable: true vertical: type: string verticalLabel: type: string verticalSource: type: string nullable: true aiProfileSummary: type: string nullable: true aiServiceFocus: type: array items: type: string aiDemandTriggers: type: array items: type: string aiRecommendedSignals: type: array items: type: string aiCustomerIntentNotes: type: string nullable: true aiProfileSource: type: string nullable: true aiProfileGeneratedAt: type: string nullable: true type: object AppYelpBusinessSignalSettingSchema: required: - signal - enabled - updatedAt properties: signal: type: string enabled: type: boolean updatedAt: type: string nullable: true type: object AppYelpConnectionSchema: required: - id - label - connected - hasReportingApiKey - pauseResumeAutoPilot - healthStatus - healthMessage - lastCheckedAt - createdAt - updatedAt properties: id: type: integer label: type: string nullable: true connected: type: boolean hasReportingApiKey: type: boolean pauseResumeAutoPilot: type: boolean healthStatus: type: string nullable: true healthMessage: type: string nullable: true lastCheckedAt: type: string nullable: true createdAt: type: string nullable: true updatedAt: type: string nullable: true type: object AppYelpLeadSchema: required: - id - businessId - businessName - conversationId - consumer - type - excerpt - status - responseMinutes - createdAt - lastEventAt - conversationMessages - timelineEvents - replyDraftId - replyDraftStatus - replyDraftBody - replyDraftMessage - replyDraftGeneratedAt properties: id: type: string businessId: type: string nullable: true businessName: type: string nullable: true conversationId: type: string nullable: true consumer: type: string nullable: true type: type: string excerpt: type: string nullable: true status: type: string responseMinutes: type: integer nullable: true createdAt: type: string nullable: true lastEventAt: type: string nullable: true conversationMessages: type: array items: type: object timelineEvents: type: array items: type: object replyDraftId: type: integer nullable: true replyDraftStatus: type: string nullable: true replyDraftBody: type: string nullable: true replyDraftMessage: type: string nullable: true replyDraftGeneratedAt: type: string nullable: true type: object AppYelpProgramSchema: required: - id - businessId - businessName - type - status - pauseStatus - startDate - endDate - budgetCents - spendMtdCents - billedClicks - billedImpressions - avgCpcCents - feePeriod - autoPilot - features - rejectionReason - lastSyncedAt properties: id: type: string businessId: type: string nullable: true businessName: type: string nullable: true type: type: string status: type: string pauseStatus: type: string nullable: true startDate: type: string nullable: true endDate: type: string nullable: true budgetCents: type: integer spendMtdCents: type: integer billedClicks: type: integer billedImpressions: type: integer avgCpcCents: type: integer feePeriod: type: string nullable: true autoPilot: type: boolean features: type: array items: type: string rejectionReason: type: string nullable: true lastSyncedAt: type: string nullable: true type: object AppYelpReportingDailyPointSchema: properties: date: type: string spendCents: type: integer leads: type: integer billableClicks: type: integer billableImpressions: type: integer calls: type: integer raqMessages: type: integer websiteClicks: type: integer pageViews: type: integer type: object AppYelpReportingKpiSchema: properties: totalSpendCents: type: integer totalLeads: type: integer costPerLeadCents: type: integer ctr: type: number format: float avgCpcCents: type: integer billableClicks: type: integer billableImpressions: type: integer calls: type: integer raqMessages: type: integer websiteClicks: type: integer pageViews: type: integer type: object AppYelpReportingLeadBreakdownSliceSchema: properties: label: type: string value: type: integer type: object AppYelpReportingSchema: required: - kpis - leadBreakdown - daily properties: kpis: $ref: '#/components/schemas/AppYelpReportingKpiSchema' leadBreakdown: type: array items: $ref: '#/components/schemas/AppYelpReportingLeadBreakdownSliceSchema' daily: type: array items: $ref: '#/components/schemas/AppYelpReportingDailyPointSchema' type: object AppYelpSyncRunSchema: required: - id - type - source - status - startedAt - finishedAt - importedCount - failedCount - errorMessage - createdAt properties: id: type: integer type: type: string source: type: string status: type: string startedAt: type: string nullable: true finishedAt: type: string nullable: true importedCount: type: integer failedCount: type: integer errorMessage: type: string nullable: true createdAt: type: string nullable: true type: object OperationsAdminSchema: required: - id - email - name - permissions properties: id: type: integer email: type: string name: type: string permissions: type: array items: type: string enum: - MANAGE_USERS - MANAGE_BILLING_SUBSCRIPTIONS - MANAGE_CAMPAIGNS - MANAGE_ADMINS type: object OperationsAuthGatewayTokenSchema: required: - adminId - accessToken properties: adminId: type: integer accessToken: type: string type: object OperationsAuthProfileSchema: required: - id - email - name - permissions properties: id: type: integer email: type: string name: type: string permissions: type: array items: type: string enum: - MANAGE_USERS - MANAGE_BILLING_SUBSCRIPTIONS - MANAGE_CAMPAIGNS - MANAGE_ADMINS type: object OperationsBillingSubscriptionSchema: required: - id - plan - description - features - featured - stripePriceId - amount - annual - trial - sales - legacy properties: id: type: integer plan: type: string enum: - STARTUP - BUSINESS - PROFESSIONAL description: type: string features: type: array items: type: string featured: type: boolean stripePriceId: type: string amount: type: number format: float annual: type: boolean trial: type: integer nullable: true sales: type: boolean legacy: type: boolean type: object OperationsCampaignSchema: required: - id - adminId - adminName - adminEmail - userId - userEmail - userSubscriptionPlan - userSubscriptionStatus - name - status - analyzing - googleAdsLinkingId - googleAdsLinkingCustomerId - googleAdsLinkingName - googleAdsCampaignId - lastManagedAt - createdAt properties: id: type: integer adminId: type: integer nullable: true adminEmail: type: string nullable: true adminName: type: string nullable: true userId: type: integer userEmail: type: string nullable: true userSubscriptionPlan: type: string enum: - FREE - STARTUP - BUSINESS - PROFESSIONAL nullable: true userSubscriptionStatus: type: string enum: - TRIAL - ACTIVE - CANCELLED nullable: true name: type: string status: type: string enum: - ACCESS_PENDING_REQUEST - ACCESS_PENDING_GRANT - ACTIVE - PAUSED analyzing: type: boolean googleAdsLinkingId: type: integer nullable: true googleAdsLinkingCustomerId: type: integer nullable: true googleAdsLinkingName: type: string nullable: true googleAdsCampaignId: type: integer nullable: true lastManagedAt: type: string format: date-time nullable: true createdAt: type: string format: date-time nullable: true type: object OperationsCampaignLogSchema: required: - id - taskId - message - createdAt properties: id: type: integer taskId: type: integer message: type: string createdAt: type: string format: date-time type: object OperationsCampaignTaskSchema: required: - id - campaignId - parentId - title - description - status - startedAt - finishedAt - order - childrenCount properties: id: type: integer campaignId: type: integer parentId: type: integer nullable: true title: type: string description: type: string nullable: true status: type: string enum: - DRAFT - RECOMMENDATION - BLOCKED - PENDING - PROCESSING - DONE - GOAL startedAt: type: string format: date-time nullable: true finishedAt: type: string format: date-time nullable: true order: type: integer childrenCount: type: integer type: object OperationsUserTokenSchema: required: - userId - accessToken properties: userId: type: integer accessToken: type: string type: object OperationsUserSchema: required: - id - email - name - position - spend - goal - subscriptionPlan - subscriptionStatus - subscriptionExpiresAt - subscriptionAnnual - subscriptionSkipped properties: id: type: integer email: type: string nullable: true name: type: string nullable: true position: type: string nullable: true spend: type: string nullable: true goal: type: string nullable: true subscriptionPlan: type: string enum: - FREE - STARTUP - BUSINESS - PROFESSIONAL subscriptionStatus: type: string enum: - TRIAL - ACTIVE - CANCELLED subscriptionExpiresAt: type: string format: date-time nullable: true subscriptionAnnual: type: boolean nullable: true subscriptionSkipped: type: boolean type: object securitySchemes: token: type: apiKey description: Bearer token authorization name: authorization in: header